查看原文
其他

开发文件上传功能稍不注意就会引发安全漏洞

程序猿DD 2021-05-26

The following article is from 码农小胖哥 Author 请关注

1. 前言

文件上传在日常开发中十分常见,但是潜在的安全问题非常容易忽视。一旦开发中忽视了这些问题,将会引发系统安全漏洞。

2. 文件上传开发的安全建议

通常我们上传的文件是由客户端控制的,这种情况下就给了不怀好意人可乘之机。一些危险的可执行脚本将有可能被注入服务器中去。因此胖哥总结了以下几点建议。

文件类型过滤

开发者应该有一个过滤清单允许上传的文件类型应仅限于业务功能所需的文件类型,在没有允许列表过滤器的情况下,切勿直接接受文件名及其扩展名,同时前端应该对该清单进行说明。这是一个必要的步骤,大多数开发者也做得很好。

文件名称处理

不能使用原始文件名!这是一个容易被忽略的问题。很多开发者喜欢直接把上传文件的按照原始文件名进行转存。

// Spring boot 开发中不建议使用这个来作为转存的名称,你应该生成一个新的名称来映射此名称
String originalFilename = MultipartFile.getOriginalFilename();

这样是不安全的。虽然大部分/\:<>?字符已经被过滤掉,但是. * % $,这些脚本中的常客依然可以被包含在文件名中,所以不能使用原始文件名,你应该指定一个算法来进行重命名,建议使用一种摘要算法来确定文件名。例如,文件名可以是文件名加上日期的 MD5 哈希。

如果业务需要原始文件名的话存储新的命名和原始名称的映射即可。

摘要校验

服务端无论上传、修改还是下载文件都需要进行摘要校验(MD5、SHA256),以防止文件和预设的不一致。客户端有必要的情况下也建议进行摘要校验。

限制大小

这一点如果使用 Spring 进行开发的话已经做了限制,如果该限制不满足业务需要,可以修改,但是不能移除限制,否则会导致拒绝服务攻击。

访问限制

如果不是业务需要,只有身份验证和授权的用户才能使用文件上传功能。不然你的系统就成了别人的免费图床。

行为审计

对于安全我们只能被动防御,因此对文件上传的操作建议有审计日志、而且审计日志不应该受文件系统影响,这样发生安全事件时可以快速定位问题。

3. 总结

其实还有不少的安全要点需要考虑,只不过目前大部分都使用了第三方存储,如果使用自研的系统可能需要考虑的更多。不过针对普通开发来说做到上面的几点就够了。

推荐关注本文作者:码农小胖哥

分享高质量编程知识,探讨IT人生

技术干货,实战技巧,面试技巧,前沿资讯一个都不能少


往期推荐

IDEA不能一个窗口管理多个项目?那是你不会用!

Nacos 惊爆安全漏洞,可绕过身份验证(附修复建议)

百度申请“员工工作状态预测”专利,意欲何为?

手握2.2亿美元,但想不起密码,还有两次机会,一起支支招啊!

JAR冲突问题的解决以及运行状态下如何查看加载的类

历史上的 996

新同事上来就把项目性能优化了一遍,瑟瑟发抖。。。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存