安全的 PHP 文件上传脚本

Posted

技术标签:

【中文标题】安全的 PHP 文件上传脚本【英文标题】:Secure PHP File Upload Script 【发布时间】:2011-06-24 10:24:56 【问题描述】:

我想我已经问过这个问题两次了,但这是我第一次接近这个问题。我计划允许用户上传和下载他们的文件(.pdf、.doc、.exl、.ppt、.png、.jpg、.gif)。

这些提示是否足够:

http://blogs.sans.org/appsecstreetfighter/2009/12/28/8-basic-rules-to-implement-secure-file-uploads/

另外,有没有我可以使用的脚本,我是 php 新手。

【问题讨论】:

什么脚本?我所看到的只是一些正确处理的规则。 提示对我来说很好,有些取决于您的特定要求\设置 【参考方案1】:

回复较晚,但我认为您的脚本应该基于此: http://blog.insicdesigns.com/2009/01/secure-file-upload-in-php-web-applications/

它涵盖了安全的所有方面并解释了所有有效点。我希望这会有所帮助。

编辑:以上链接已失效,here is a cached version of that article。

【讨论】:

这是一个很棒的指南 上面的缓存链接参考没有上面链接的缓存文章中讨论的要下载的源代码文件的缓存副本。 此文件上传安全指南存在几个问题。首先是使用黑名单的整个概念。黑名单是一个失败的提议。您应该将允许的扩展名列入白名单,使用您将保存的名称检查上传的文件扩展名,如果扩展名不在白名单中,则禁止访问。每当发现新漏洞时,黑名单都会让您打开。白名单是未来的证明。【参考方案2】:

对于同样是 php 新手的未来读者:

在阅读 Ricki 在https://***.com/a/7065880/1815624 的回答中提到的指南之前,它提到了一个很好的指南并且绝对是推荐阅读的内容,我建议先阅读这个答案:

https://security.stackexchange.com/a/32853/31943

然后阅读 Ricki 提到的指南:

http://blog.insicdesigns.com/2009/01/secure-file-upload-in-php-web-applications/

毕竟,如果您需要进一步的安全性,您应该考虑断开与互联网的连接。 :P

【讨论】:

【参考方案3】:

那里有一百万个文件上传脚本。 This one 并不比其他人差。

虽然“保护”不能上传除 png 以外的文件(它只检查文件名)。

上传文件是相当安全的——它让其他人有机会下载它们,从而使您的服务器受到某些类型的攻击。你引用的文章没有提到两个重点:

切勿从与您的网页相同的域中提供任何用户提供的文件。有一个单独的下载域。这样,即使有人设法上传了一个 Flash 动画或一段 html,您的域也不会受到跨域攻击(例如,如果您的应用程序有一个 example.org 域,您应该从下载中提供用户内容。 example.com); 始终提供带有良好控制标题的上传文件。

【讨论】:

上传的危险是程序员将上传的文件存储在文档树中,既不检查后缀(*.php)也不检查内容。一旦完成,恶意用户就可以在您的服务器上运行不受控制的脚本。哎呀。文件上传者应始终检查文件名和内容,以确保文件正是程序员所期望的。 您的回答并没有解释“上传文件非常安全——它让其他人有机会下载这些文件,从而使您的服务器受到某些类型的攻击。”我提供了一个例子。 @JBH 你的建议很糟糕 - 遵循它不会给你带来任何安全感。您描述的“问题”始于为与应用程序的其余部分来自同一域的用户文件提供服务,这违反了我的两条规则中的第一条(并且随之而来的是许多其他愚蠢的错误)。如果您诚实地遵循我上面给出的两条规则,那么您的应用程序是安全的。就如此容易。真的。 也许还不错,但也许不是你想谈的。我对争论并不感兴趣,我只是想帮助人们理解这个问题。提供来自另一个域的文件可能会保护第一个域,但不能保护第二个域。如果我冒犯了你,我很抱歉。干杯。

以上是关于安全的 PHP 文件上传脚本的主要内容,如果未能解决你的问题,请参考以下文章

《白帽子讲WEB安全》学习笔记之第8章 文件上传漏洞

封装一个文件上传并检测安全性重命名的脚本

2020/1/30 PHP代码审计之文件上传漏洞

php代码审计8审计文件上传漏洞

安全漏洞之任意文件上传漏洞分析

PHP文件上传失败移动文件