我正在开发一种文档管理系统。最终用户是企业级用户。
我目前仅检查并允许上传符合以下条件之一的文件:
"png|jpe?g|gif|xls|doc|docx|csv|ppt|txt|pdf|rtf"
我的问题是 -
hoặc
我应该检查 NOT IN "exe|bat|php|js"
并允许所有其他类型吗?
感谢您的建议。
Should I check NOT IN "exe|bat|php|js" and allow all other types?
没有。白名单比黑名单更好。有很多很多比您可能了解的更危险的文件类型。这四个仅仅触及表面。
If I add "xml" into the list? can they cause any security issue?
是的,[X][HT]ML 可能包含在为其提供服务的站点的安全上下文中运行的脚本。这允许任何可以将文档上传到您网站的人将 JavaScript 注入(inject)您的网站(窃取 cookie、伪造请求等)。
但是...它实际上并没有添加任何您尚未遇到的安全问题。因为即使按文件类型/扩展名列入白名单也不安全,这要归功于 IE 及其错误的类型嗅探。您可以上传 .txt
文件,并使用 Content-Type: text/plain
header 正确提供该文件,但如果它包含 IE 认为看起来像 HTML 的序列,则 IE会忽略你并将其呈现为 HTML — boom,XSS。
(实际上任何其他类型都是如此,但 .txt 是最容易受到攻击的。)
有两种方法可以解决这个问题:
将所有用户上传的文件从不同的主机名提供到主应用程序站点,以便它们位于不同的 JS 安全上下文中,并且不共享 cookie 或身份验证数据。
sử dụng Content-Disposition:attachment
header 提供所有用户上传的文件,以便始终下载这些文件而不在浏览器中显示这些文件。
(2) 本身应该是无懈可击的,但在过去的实践中,由于浏览器和插件的利用,已经有一些方法可以绕过它,所以我不确定我是否会完全信任它。 (1) 其本身可以阻止 XSS,但它不能阻止其他令人讨厌的行为,例如包含 iframe 的 HTML 文件来利用网站。
所以最好两者都做。
Tôi là một lập trình viên xuất sắc, rất giỏi!