【问题标题】:Bulletproof method for uploading images through PHP通过PHP上传图片的防弹方法
【发布时间】:2012-09-25 16:18:07
【问题描述】:

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

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

显然,使用浏览器发送的 mime 类型进行验证是一个很大的禁忌,因为它很容易被欺骗,因此排除了这种情况,而且不用说永远不要验证文件扩展名。

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

然后有一个 getimagesize() 函数,我读到的任何不是看起来完美的图像的东西都返回 false,但如果是这种情况,为什么这里有这么多公认的答案说使用 finfo?

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

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

【问题讨论】:

标签: php image file-upload getimagesize


【解决方案1】:

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

  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-source *.php

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 当您说以一种永远不会执行的方式保存文件时,您是指通过文件/目录的权限吗?
    • @Andy 否。处理 php 的服务器通常配置为执行带有 .php 扩展名的文件(也可能是 .PHP)。所以你必须小心。如果您对文件使用用户指定的名称,它们也可能会欺骗服务器。他们甚至可以遍历文件系统并将文件保存在他们想要的任何位置(名称包含../)。这就是我推荐任意名称的原因。
    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    相关资源
    最近更新 更多