通过PHP上传图像的防弹方法

时间:2012-09-25 16:18:08

标签: php image file-upload getimagesize

我过去几周一直在研究这个话题,而且我真的开始误解我无法找到明确的答案。

我有一个网站,用户可以上传自己的个人资料图片。我想确保允许上传的唯一文件是JPEG,GIF和PNG

显然,使用浏览器发送的mime类型进行验证是一个很大的问题,因为它很容易被欺骗,因此规则已经完成,并且不用说永远不会对文件扩展名进行验证。

接下来是PHP提供的新(ish)finfo函数。我一直在使用它,因为它似乎是最好的方法,但在http://www.php.net/manual/en/ref.fileinfo.php阅读评论似乎也可以被欺骗。另外我不确定是否只检查返回的MIME类型是image / jpeg,image / gif还是image / png是否过于严格?

然后有getimagesize()函数,我读取的函数返回false,不是一个看似完美的图像,但如果是这样的话,为什么有这么多被接受的答案在这里说使用finfo?

最后是system()或exec()调用,这似乎有点危险,允许用户指定系统调用的一部分!

所以我的问题是,我应该使用什么方法?我想让我的脚本尽可能安全但也足够开放,这样普通用户就不会受到脚本拒绝的有效图像的惩罚

2 个答案:

答案 0 :(得分:0)

这只是我的2美分,但也许它可以帮助。我至少会使用以下3个步骤:

  1. 检查以getimagesize()和MIME类型开头的文件。
  2. 移动文件/调整大小等时,请保存不带扩展名的文件(图片仍然会在没有扩展名的情况下呈现。
  3. 在uploads目录中使用一些htaccess,如:

    AddHandler cgi-script .php .php3 .php4 .php5 .phtml .pl .py .jsp .asp .shtml .sh .cgi .html .htm .js AddType text / html * .htm * .html AddType application / x-httpd-php-source * .php

  4. 我也希望了解更多相关内容!

答案 1 :(得分:0)

使用图像库打开然后重新保存将确保结果为图像。如果您不想这样,请使用最佳可用选项(如finfo),并确保以一种永远不会被服务器执行的方式保存文件。禁止像php这样的扩展并使用任意名称保存文件应该可以完成这项工作,但这取决于服务器配置!