PHP图像上传安全问题


PHP image upload security questions

我最近遇到了通过网站上的表单上传恶意代码的问题。此表单应仅允许上传图像。在阅读了一些内容后,我进行了以下检查。

  1. 对tmp上传的文件使用getimageresize()。如果返回false,则终止上传过程。

  2. chmod上传的图像到644,这样它就不能执行了。

  3. 上传的文件名被更改(前面有一个随机数字),所以它与用户上传的文件不完全相同。

我读到在服务器端检查mime类型也是一个好主意。不过,我似乎无法访问服务器上的finfo_file()或mime_tent_type()。

这些听起来像是阻止恶意代码上传和执行的好措施吗?我还应该采取其他措施吗?

你的#1似乎对大多数人来说已经足够好了,而且很可能是。

然而,如果你想要额外的安全性(恐怕是以消耗更多内存为代价),你可以将图像保存在一个不可访问的文件夹中(在docroot之外),并编写一个简单的脚本来渲染文件。不过,这需要你将图像加载到内存中(PHP就是这么做的),所以我不会真正建议你这样做,除非你真的担心有人仍然会攻击你。

正如我所说,你的第一个建议应该奏效。此外,#3是无用的,当您在DOM中插入图像时,您将使用随机数暴露新名称:)

Eduard Luca所说的话。我建议你

  1. 请确保您只接受有效的文件扩展名类型。这本身并不能拯救你,但如果有人上传.php文件,这一点会变得很重要
  2. 关闭上传目录的PHP处理。这样,当PHP文件出现403错误时,您仍然可以直接显示图像。这可以通过Apache 中的站点配置来完成

    <Directory "/path/to/upload">
    php_admin_flag engine off
    AllowOverride None
    DirectoryIndex Off
    RewriteEngine On
    RewriteRule '.php$ - [F,L] 
    </Directory>