如果有翻译侵权问题,请联系我删除,谢谢~
注意点
- 文件名后缀根据业务定义一个allow list, 不符合的文件名后缀不支持上传
- 对于web 项目,文件名后缀根据业务限定,不要接受所有文件类型,只接受业务需求的那些
- 文件名和后缀名必须排除控制字符、unicode 字符还有一些特殊字符包含[;:<>/.*%$]。推荐只接受字母和数字且只有一个".",且文件名和后缀名不能为空,总结起来就是/[a-zA-Z0-9]{1,200}.[a-zA-Z0-9]{1,10}/
- 在NTFS(new technology file system, windows NT系列默认文件系统)不包含路径的文件名和后缀长度应该小于255
- 上传的目录不应该有执行权限
- 限制上传文件最大值/最小值以免发生DoS(denial of service)攻击。 DoS是拒绝服务攻击,分为带宽消耗性和资源消耗性,都是通过大量合法或者伪造的请求占用大量网络以及器材资源,以达到瘫痪网络以及系统的目的
- 使用CROS 攻击防护方法
- 除非有相同的hash, 否则不要覆盖文件
- 如果可以的话,可以使用病毒扫描工具
- 尽量使用POST 方法,不要使用PUT 或者GET 方法
- 记录用户活动
- 所有压缩文件的内容也要检测,以免有非法内容,造成危害
- 如果可以的话,优先考虑保存文件在数据库而不是文件系统中;如果非要保存文件,建议使用不同域名的独立文件服务器提供上传下载服务
- 如果可以的话,上传功能只开放给授权和认证的用户
- 除了上传的文件夹,其他文件夹不要开启写权限
- 避免类似".htaccess", "web.config"文件等影响应用或者系统的文件通过上传功能替换。
- 在Apache中尤其要确保双后缀(譬如 “file.php.txt”)被执行,这中情况在Apache 中会自动执行
- 确保上传的文件不能被未授权或者认证的用户访问
- 静态文件response header中添加“Content-Disposition: Attachment” and “X-Content-Type-Options: nosniff” 头可以保护网站免受与Flash或者基于PDF 的cross-site content-hijacking 攻击。虽然当使用Silverlight 或者小文件时, 不能完全保护网站不受攻击,但是特别时当提供PDF 上传功能时还是强烈建议下载文件都添加如上http 头。
- Flash/PDF (crossdomain.xml) or Silverlight (clientaccesspolicy.xml) cross-domain policy files should be removed if they are not in use and there is no business requirement for Flash or Silverlight applications to communicate with the website.
- Browser caching should be disabled for the crossdomain.xml and clientaccesspolicy.xml files. This enables the website to easily update the file or restrict access to the Web services if necessary. Once the client access policy file is checked, it remains in effect for the browser session so the impact of non-caching to the end-user is minimal. This can be raised as a low or informational risk issue based on the content of the target website and security and complexity of the policy file(s).
- 只有静态数据或者公开数据可以设置CORS 头,否则“Access-Control-Allow-Origin” 只应该包含授权的地址。其他跨域头譬如“Access-Control-Allow-Credentials” “Access-Control-Allow-Methods” or “Access-Control-Allow-Headers”等只有确实需要才需要配置。
nginx 推荐的安全配置:
location ^~ /path/to/project/server/php/files {
root html;
default_type application/octet-stream;
types {
image/gif gif;
image/jpeg jpg;
image/png png;
}
add_header X-Content-Type-Options 'nosniff';
if ($request_filename ~ /(((?!\.(jpg)|(png)|(gif)$)[^/])+$)) {
add_header Content-Disposition 'attachment; filename="$1"';
# Add X-Content-Type-Options again, as using add_header in a new context
# dismisses all previous add_header calls:
add_header X-Content-Type-Options 'nosniff';
}
}