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

fli*_*643 10 php security upload file-upload image

我正在为我的网站实现基于用户的图像上传工具.系统应允许任何用户仅上传JPEG和PNG文件.当然,我担心安全问题,所以我想知道许多比我更聪明的人对以下允许上传的检查感觉如何:

1)首先列出PHP中允许的文件扩展名,仅允许PNG,png,jpg,JPG和JPEG.通过以下功能检索用户文件的扩展名:

return end(explode(".", $filename));
Run Code Online (Sandbox Code Playgroud)

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

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

getimagesize($_FILES['userfile']['tmp_name']);
Run Code Online (Sandbox Code Playgroud)

如果这不返回false,请继续.

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

php_admin_value engine Off
Run Code Online (Sandbox Code Playgroud)

4)将用户的文件重命名为预先确定的内容.IE

$filename = 'some_pre_determined_unique_value' . $the_file_extension;
Run Code Online (Sandbox Code Playgroud)

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

如果我执行上述操作,我仍然容易受到攻击吗?在接受文件之前,我希望有1)只允许jpgs和png,2)验证PHP说它是有效图像,3)禁用图像所在的目录执行.php文件和4)将用户文件重命名为某些内容独特.

谢谢,

Pek*_*ica 20

关于文件名,随机名称绝对是一个好主意,并带走了许多令人头疼的问题.

如果您想完全确定内容是否干净,请考虑使用GD或ImageMagick将传入的图像1:1复制到新的空图像中.

这将略微降低图像质量,因为内容被压缩两次,但它将删除原始图像中存在的任何EXIF信息.用户通常甚至不知道将多少信息放入JPG文件的元数据部分!相机信息,位置,时间,使用的软件......对于托管图像的网站来说,这是一个很好的策略,可以为用户删除该信息.

此外,复制图像可能会消除大多数使用错误图像数据导致查看器软件溢出并注入恶意代码的漏洞.对于GD来说,这样的操纵图像可能简单地说是不可读的.

  • 很好的答案.我只是添加它作为额外的防御,从你设置cookie的域以外的丢弃域提供图像.这样,即使图像以某种方式具有可执行的客户端代码,浏览器的相同原始策略也会防止很多伤害. (6认同)