【问题标题】:100% safe photo upload script100% 安全的照片上传脚本
【发布时间】:2011-03-08 01:09:18
【问题描述】:

问题很简单。如何使用 php 制作 100% 安全的照片上传脚本?是否有任何教程可以显示所有可能的安全漏洞?

不要让我看this question,因为那里他们只谈论大小。但我想确定的是,没有人可以上传 shell 和其他东西。因为它是一个大网站,需要 100% 安全的照片上传脚本。

编辑: 或者我应该允许会员将图片上传到像 imageshack 这样的容器并将他们的链接复制到我的网站?我猜它是 100% 安全的,对吧?

【问题讨论】:

  • “100% 安全”?不存在。列举一个被认为是安全且未被破解的系统。
  • 你的意思是像Facebook? 讽刺>
  • @hey - 我想他是在指出即使是 Facebook 的系统也不是 100% 安全的。
  • 我明白了。现在请查看编辑后的版本。如果我允许人们将他们的照片上传到其他地方并将他们的链接粘贴到输入中,我会安全吗?我会将其保存在 mysql 中?
  • 安全文件上传是困难。有关某些问题,请参阅stackoverflow.com/questions/602539/…。是的,如果你能摆脱 imageshack 等,那就这样做吧。

标签: php security upload uploading


【解决方案1】:

这真的很简单。通过已知安全的图像过滤器运行所有上传的图像。如果它以“不是图像错误”而反弹,则说明您有恶作剧。 (一个简单的例子是恒等变换,或 JPEG 质量标准化技术。)重要的一点是实际使用过滤器的输出,而不是原始文件。

【讨论】:

  • 请注意,WMF 既是图像又是可执行文件。这导致恶意软件人员将东西嵌入有效的“图像”中......但那是一段时间了。
  • 没那么简单,图片可以包含例如cmets 中的 PHP 代码仍然是有效的图像。
  • @Christian Davén:使用更激进的过滤器;特别是重新采样和重新编码图像,剥离元数据等。人。应该照顾大多数东西; pngcrush 之类的工具也应该如此。
【解决方案2】:

正如你提到的,there's another question that addresses the issue。作者指出,只要他只接受正版图像文件并保持文件大小,他就应该是安全的,这是你唯一能做的事情。检查扩展名和 MIME 类型并拒绝任何与您想要的格式不匹配的内容。仍然有 RFI(嗯,这里更像是 LFI),但只要您不是在不执行完整性检查的情况下随意包含文件,您就可以开始了。

【讨论】:

    【解决方案3】:

    您需要考虑和注意的事项:

    文件扩展名:网络服务器使用文件扩展名来确定发送给客户端的 MIME 类型。您应该使用您允许的扩展白名单。在您的情况下,这将是图像扩展。

    LFI: 正如 Matchu 已经提到的,本地文件包含可能是一个问题。如果您的应用程序具有允许您包含任意文件的动态包含,例如。 include($_GET['myfile']); 它可能导致任意 PHP 执行。因此,您需要使用basename() 来保护此类包含。这甚至可能发生在图像上,因为它们可以包含嵌入的 cmets。

    MIME-Type-Detection:这其实不是很为人所知,也没有太多关于它的信息。 IE<script>alert('hello');</script>,那么 IE

    要防止图像出现此问题,您可以使用 Williham Totland 提到的方法。我建议使用getimagesize() 来检测图像是否有效并确保扩展名与类型匹配。

    $image_filename = 'uploaded_image.gif';
    $image_extension = substr(strrchr($image_filename, '.'), 1);
    
    $mime_mapping = array('png' => 'image/png', 'gif' => 'image/gif', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg');
    $info = getimagesize($image_filename);
    
    if (!$info) {
        exit('not an image');
    }
    
    if ($info['mime'] != $mime_mapping[$image_extension]) {
        exit('wrong extension given');
    }
    
    // all checks passed
    // image can be saved now
    

    有一篇关于这个问题的文章here

    【讨论】:

    • 请注意,可以制作一个包含&lt;script&gt; 的文件,IE 将作为 HTML 执行,但仍然是有效图像,并且将由getimagesize() 传递,因此上述内容并不安全。这就是 Williham 所说的使用经过处理的输出图像而不是提供的原始文件。虽然理论上可以创建一个图像,当它被已知的目标函数过滤/重新压缩/保存时,会导致包含不安全 HTML 内容的内容,但这是一种非常不切实际的攻击。
    • 还有其他类型的您可能会尝试将其偷运到图像中,尤其是 Java 和 Flash 代码。这些允许编写脚本,但不遵守 JavaScript 所做的确切“同源策略”,因此通过在目标服务器上植入 JAR 或 SWF,部分可能会从另一个页面跨站点脚本进入其中。有关此示例,请参见“GIFAR”攻击。由于这些原因,即使采取了预防措施,也很难保证文件上传是“安全的”。一个好的方法是将所有用户上传的内容放在一个单独的主机名上,该主机名不与主站点共享安全上下文。
    • IE 将仅在图像内容和标题不匹配时使用 MIME-Type-Detection,我的实现会对此进行检查。问题是旧版本中的 PNG 图像没有这样的签名。你是对的,GIFAR 和 flash 是一个需要自定义服务脚本的问题。 [GIFAR 的可能解决方案][1]。 Flash 攻击要求服务脚本位于单独的目录中,并且尽可能不使用公共文件名。或者你的解决方案,当然。 [1]:github.com/phpbb/phpbb3/commit/…
    • 我会给一张图片赋予唯一的名字,所以我想我会防止诸如 XSS 之类的攻击。
    猜你喜欢
    • 1970-01-01
    • 2016-04-23
    • 2011-11-21
    • 2014-07-14
    • 1970-01-01
    • 2011-06-24
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多