【问题标题】:How to prevent XSS injection while allowing users to post external images如何在允许用户发布外部图像的同时防止 XSS 注入
【发布时间】:2011-06-26 16:34:24
【问题描述】:

一位用户最近向我报告说,他们可以利用通过论坛提供给他们的 BBCode 标签 [img]。

[img=http://url.to.external.file.ext][img]

当然,它会显示为损坏的图像,但是浏览器会在那里检索文件。我自己测试过,果然是合法的。

我不知道如何防止这种类型的 XSS 注入,除了下载图像并通过 PHP 检查它是否是合法图像。这很容易被一个非常大的文件滥用。

还有其他解决办法吗?

【问题讨论】:

标签: security csrf xss


【解决方案1】:

您可以请求标头并检查文件是否实际上是图像。

编辑:

抱歉,我无法更深入地回答;我正在享用晚餐。

我有两种看法:

  1. 您在提交或查看帖子时检查提供的地址是否实际上是图像,您可以通过检查标题(确保它实际上是图像)或使用文件扩展名来完成此操作。这不是万无一失的,并且存在一些明显的问题(动态更改图像等)。
  2. 保护您的网站,即使 [img] 标记存在漏洞也不会出现真正的问题,例如:恶意代码不能使用被盗的 cookie。
  3. 使用请求外部图像并修改标题的脚本。

检查远程文件内容类型的基本方法:

$Headers = get_headers('http://url.to.external.file.ext');
if($Headers[8] == 'text/html') {
    echo 'Wrong content type.';
    exit;
}

【讨论】:

  • 解决了一些问题:function lolfy($url) { $head = get_headers($url); if ($head['Content-Type'] == "image/jpeg" || $head['Content-Type'] == "image/x-png" || $head['Content-Type'] == "image/gif") { return $url; } else { return "boken"; } }
  • 但是,我意识到我请求信息的服务器很容易在我请求时欺骗内容类型。我不认为这是一种安全的方法。
  • 使用脚本请求外部图像,但自己修改标题。例如:abdulqabiz.com/files/proxy.php.txt
  • “保护您的网站,即使 [img] 标签存在问题也没有真正的问题...”我认为这是您能做的最好的事情。其他人可以被欺骗。
【解决方案2】:

这个问题只有两种解决方案。要么下载图像并从您的网络服务器提供服务,要么只允许图像的 url 模式白名单。

如果您决定下载图片,请注意一些问题 -

  1. 确保您对最大文件大小进行了验证。如果文件超过一定大小,有一些方法可以停止下载,但这些方法是特定于语言的。
  2. 检查文件是否真的是图像。
  3. 如果将其存储在硬盘上,请务必重命名。您不应允许用户控制系统上的文件名。
  4. 提供图片时,使用一次性域名,或使用裸 IP 地址来提供图片。如果浏览器被欺骗认为图像是可执行代码,同源策略将防止进一步的损坏。

【讨论】:

    猜你喜欢
    • 2010-09-11
    • 2023-01-24
    • 2013-05-20
    • 2011-07-13
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    相关资源
    最近更新 更多