在PHP中保护用户图像上传功能

问题描述 投票:10回答:4

我正在为我的网站实施基于用户的图像上传工具。系统应允许任何用户仅上传JPEG和PNG文件。我当然担心安全性,所以我想知道有多少比我聪明的人对以下允许上传的检查有何看法:

1)第一个白名单列出了PHP中允许的文件扩展名,以仅允许PNG,png,jpg,JPG和JPEG。通过以下功能检索用户文件的扩展名:

return end(explode(".", $filename));

这应有助于禁止用户上传诸如.png.php之类的恶意内容。如果通过,请转到步骤2。

2)在TMP文件上运行php函数getimageize()。通过类似的东西:

getimagesize($_FILES['userfile']['tmp_name']);

如果没有返回false,则继续。

3)确保将.htaccess文件放置在上载目录中,以便该目录中的任何文件都无法解析PHP文件:

php_admin_value engine Off

4)将用户文件重命名为预定名称。 I.E。

$filename = 'some_pre_determined_unique_value' . $the_file_extension;

这也将有助于防止SQL注入,因为文件名将是所有使用的查询中唯一由用户确定的变量。]​​>

如果执行上述操作,我仍然容易受到攻击?在接受文件之前,我应该希望有1)只允许jpg和png,2)验证PHP表示它是有效图像,3)禁止图像所在的目录执行.php文件,以及4)将用户文件重命名为某种名称唯一。

谢谢,

我正在为我的网站实施基于用户的图像上传工具。系统应允许任何用户仅上传JPEG和PNG文件。我当然担心安全性,所以我想知道...

php security image file-upload upload
4个回答
21
投票

关于文件名,随机名称绝对是个好主意,消除了很多麻烦。


4
投票

关于您的数字2),不要只检查FALSE。 getimagesize还将返回图像的mime类型。与查看客户端提供的MIME类型相比,这是一种检查正确图像类型的更安全的方法:


1
投票

所有支票都不错,尤其是3号。如果性能不是问题,或者您是在后台执行此操作,则可以尝试使用GD访问该映像,并查看它是否确实是映像,而不仅仅是有人试图填充服务器的废话。 >


0
投票

关于2号,我在php.net(documentation of the function getimagesize())上阅读:

© www.soinside.com 2019 - 2024. All rights reserved.