0

在过去的几周里,我一直在研究这个话题,我真的开始烦恼我找不到明确的答案。

我有一个网站,用户可以在其中上传自己的个人资料图片。我想确保允许上传的唯一文件是 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() 调用,允许用户指定系统调用的一部分似乎有点危险!

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

4

2 回答 2

0

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

  1. 首先检查带有 getimagesize() 和 MIME 类型的文件。
  2. 移动文件/调整大小等时,保存不带扩展名的文件(图像仍会在不带扩展名的情况下呈现。
  3. 在上传目录中使用一些 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-源 *.php

我也很想知道更多关于这个的信息!

于 2012-09-25T16:26:48.650 回答
0

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

于 2012-09-25T16:30:23.713 回答