0

从底部编写一个安全的文件上传 PHP 脚本对我来说听起来像是地狱。

不按特定顺序上传文件的基本规则:

1)创建一个新文件,随机的,并为新上传的文件命名

2)检查扩展

3)检查exif技巧

4) 将所有上传的文件存储在 Web 根目录之外,并且不授予该目录执行文件的权限。

5)确保文件上传功能是PHP在上传文件时不执行代码

6) 检查文件大小

7)做一些恶意软件扫描

8) 限制文件大小

所以我想这很多:)

我什至还没有开始为这一切编写脚本,因为我有 3 个基本问题。

1)我的清单是否完整,如果缺少某些内容,请说明

2)是否有某种框架可以为我做这一切?一些简单的东西,而不是一个可以做很多其他事情的大件。

3)这是一个很好的指南吗? http://www.sitepoint.com/file-uploads-with-php/

我很想发布代码,但由于这个主题很大,我觉得问得更大更好。

提前致谢。

4

1 回答 1

1

那篇文章中用于嗅探文件内容的“exif 技巧”和其他措施本身并没有多大用处。(好的,值得检查上传的图像是否符合预期的像素大小,但这是特定于应用程序的,而不是安全问题。)

这篇文章没有说明它试图通过文件类型嗅探解决的威胁模型是什么,但这通常试图做的是防止跨站点脚本攻击,其中攻击者在文件中包含一些活动内容。通常这是在文件中使用 HTML,浏览器(尤其是 IE)会嗅探并决定将其解释为 HTML,即使这不是提供文件的方式。不幸的是,检查一个文件是否以 PDF 标题开头,或者是否代表一个有效的 GIF 图像在这里对您没有帮助,因为有可能制作可以同时解释为不同文件类型的“变色龙”文件。

通过提供具有特定非 HTMLContent-TypeX-Content-Type: nosniff标头的文件,可以在现代浏览器中阻止这种攻击。然而,还有更多不为人知的攻击涉及将内容放入不受此标头影响的 Flash 或 Java 插件,并且它对旧浏览器不是无懈可击的。

阻止对上传文件进行 XSS 攻击的真正安全的方法是从不同的主机名(理想情况下,不同的域名和 IP 地址,但简单的子域至少大部分有效)为它们提供服务。然后,您可以让攻击者随意对用户上传托管站点进行 XSS,而不会对您的主站点产生负面影响。

病毒扫描不太可能证明对通用文件上传功能有用。如果您希望人们使用该站点来交换 Windows 可执行文件,那么扫描那些传统恶意软件可能是值得的,但对于一般情况,您通常关心针对网站本身的攻击——服务器利用、XSS、浏览器利用——和反病毒扫描仪无法检测到此类攻击。

您创建新的随机文件名的步骤 (1) 比链接文章尝试做的“清理”用户提供的文件名更好的方法。它的“安全文件名”功能不会直接受到目录遍历的影响,但它仍然允许出现奇怪的情况,如..(单独)、空字符串、.htaccess和文件名,这些文件名会混淆 Windows 服务器,如尾随点、保留名称和过度长名字。

您说得对,安全文件上传比最初看起来要复杂得多,不幸的是,大多数教程代码(尤其是 PHP)都是灾难性的。

于 2013-11-04T16:00:37.497 回答