那篇文章中用于嗅探文件内容的“exif 技巧”和其他措施本身并没有多大用处。(好的,值得检查上传的图像是否符合预期的像素大小,但这是特定于应用程序的,而不是安全问题。)
这篇文章没有说明它试图通过文件类型嗅探解决的威胁模型是什么,但这通常试图做的是防止跨站点脚本攻击,其中攻击者在文件中包含一些活动内容。通常这是在文件中使用 HTML,浏览器(尤其是 IE)会嗅探并决定将其解释为 HTML,即使这不是提供文件的方式。不幸的是,检查一个文件是否以 PDF 标题开头,或者是否代表一个有效的 GIF 图像在这里对您没有帮助,因为有可能制作可以同时解释为不同文件类型的“变色龙”文件。
通过提供具有特定非 HTMLContent-Type
和X-Content-Type: nosniff
标头的文件,可以在现代浏览器中阻止这种攻击。然而,还有更多不为人知的攻击涉及将内容放入不受此标头影响的 Flash 或 Java 插件,并且它对旧浏览器不是无懈可击的。
阻止对上传文件进行 XSS 攻击的真正安全的方法是从不同的主机名(理想情况下,不同的域名和 IP 地址,但简单的子域至少大部分有效)为它们提供服务。然后,您可以让攻击者随意对用户上传托管站点进行 XSS,而不会对您的主站点产生负面影响。
病毒扫描不太可能证明对通用文件上传功能有用。如果您希望人们使用该站点来交换 Windows 可执行文件,那么扫描那些传统恶意软件可能是值得的,但对于一般情况,您通常关心针对网站本身的攻击——服务器利用、XSS、浏览器利用——和反病毒扫描仪无法检测到此类攻击。
您创建新的随机文件名的步骤 (1) 比链接文章尝试做的“清理”用户提供的文件名更好的方法。它的“安全文件名”功能不会直接受到目录遍历的影响,但它仍然允许出现奇怪的情况,如..
(单独)、空字符串、.htaccess
和文件名,这些文件名会混淆 Windows 服务器,如尾随点、保留名称和过度长名字。
您说得对,安全文件上传比最初看起来要复杂得多,不幸的是,大多数教程代码(尤其是 PHP)都是灾难性的。