PHP 图片上传表单的风险

信息安全 php 攻击预防 上传文件
2021-08-19 16:04:24

我的客户想要一个摄影网站,用户可以在其中上传照片以响应摄影比赛。虽然从技术上讲这不是问题,但我想知道与允许任何用户将任何图像上传到我的服务器相关的风险。感觉风险很大。。。

我正在考虑使用类似http://www.w3schools.com/php/php_file_upload.asp

如果我确实让匿名用户上传文件,我如何保护将上传图像(以及潜在的恶意文件)的目录?

2个回答

最大的担忧显然是恶意用户会将不是图像的东西上传到您的服务器。具体来说,他们可能会上传可执行文件或脚本,试图诱使您的服务器执行这些文件或脚本。

防止这种情况的一种方法是确保文件在您move_uploaded_file使用 PHP 之后不可执行。这就像使用chmod()设置 644 权限一样简单。

请注意,用户仍然可以上传 PHP 脚本或其他脚本,并根据您的配置诱使 Apache 执行它们。

为避免这种情况,请getimagesize()在上传文件后调用文件并确定它们是什么文件类型。将文件重命名为唯一的文件名并使用您自己的扩展名这样,如果用户上传evil.jpg.php,您的脚本会将其另存为12345.jpg,并且无法执行。更好的是,您的脚本甚至不会触及它,因为它将是无效的 JPEG。

我个人总是将上传的图像重命名为当前时间戳time()或 UUID。这也有助于防止非常邪恶的文件名(比如有人试图上传他们命名的文件../../../../../../../../etc/passwd

作为进一步的保护,您可以使用有时称为“图像防火墙”的东西。基本上,这涉及将上传的图像保存到文档根目录之外的目录中,并通过调用readfile()显示它们的 PHP 脚本显示它们。这可能需要做很多工作,但却是最安全的选择。

第二个问题是用户上传了太多文件或太大的文件,消耗了所有可用的磁盘空间或填满了托管用户的配额。这可以在您的软件中进行管理,包括限制单个文件的大小、一个用户可以上传的数据量、所有上传的总大小等。​​确保网站管理员用户能够管理和删除这些文件。

不要依赖$_FILES. 许多网站告诉您检查文件的 MIME 类型,无论是$_FILES[0]['type']通过检查文件名的扩展名还是检查文件名的扩展名。不要这样做$_FILES除了 之外的所有内容tmp_name 都可以被恶意用户操纵如果您知道只需要调用图像getimagesize,因为它实际上会读取图像数据,并且会知道文件是否真的是图像。

不要依赖检查 HTTP Referrer 的任何安全性。许多网站建议您检查以确保引用者是您自己的网站,以确保文件是合法的。这很容易被伪造。

有关更多信息,这里有一些很好的文章:

有关一些重要提示,请参阅https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet#File_uploads

getimagesize() 可以被诱骗运行 PHP 代码。

http://www.php.net/manual/en/features.file-upload.php 有 CertaiN 的用户评论,它提供了一个更好的选择 finfo(FILEINFO_MIME_TYPE)