如何在允许用户发布外部图像的同时防止XSS注入

时间:2011-02-14 03:18:43

标签: security csrf xss

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

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

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

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

还有其他解决方法吗?

2 个答案:

答案 0 :(得分:2)

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

修改

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

我有两种看法:

  1. 在提交或查看帖子时,您检查提供的地址是否实际上是图像,您可以通过检查标题(确保它实际上是图像)或使用文件扩展名来完成此操作。这不是万无一失的,并且有一些明显的问题(动态改变图像等)。
  2. 保护您的网站,即使与[img]标记存在妥协,也没有真正的问题,例如:恶意代码无法使用被盗的Cookie。
  3. 使用请求外部图像的脚本并修改标题。
  4. 检查远程文件内容类型的基本方法:

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

答案 1 :(得分:2)

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

如果您决定下载图片,可能会有一些问题 -

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