3

我管理着一个大型而活跃的论坛,我们正被一个非常严重的问题所困扰。我们允许用户嵌入远程图像,就像 stackoverflow 如何处理图像(imgur)一样,但是我们没有一组特定的主机,可以使用以下代码从任何主机嵌入图像:

[img]http://randomsource.org/image.png[/img]

这工作得很好而且花花公子......除了用户可以嵌入需要身份验证的图像外,该图像会导致出现一个弹出窗口,并且因为可以编辑身份验证弹出窗口,他们会输入类似“请输入您的 [站点名称] 用户名和密码在这里”,不幸的是,我们的用户一直在为它着迷。

对此的正确回应是什么?我一直在考虑以下几点:

  1. 每个页面加载都有一段 Javascript 执行,用于检查页面上的每个图像及其状态

  2. 拥有授权的镜像主机列表

  3. 完全禁用远程嵌入

问题是我从未见过这种情况发生在其他任何地方,但我们却被它困扰着,我们如何防止这种情况发生?

4

2 回答 2

3

它不仅仅是密码问题。您还允许您的一些用户对其他用户进行 CSRF 攻击。例如,用户可以将他的个人资料图像设置为[img]http://my-active-forum.com/some-dangerous-operation?with-some-parameters[/img].

最好的解决办法是——

  1. 下载图像服务器端并将其存储在文件系统/数据库中。保持合理的最大文件大小,否则攻击者可以将大量 GB 的数据下载到您的服务器上以占用 n/w 和磁盘资源。
  2. (可选)验证文件实际上是图像
  3. 使用一次性域或 IP 地址提供图像。可以创建伪装成 jar 或 applet 的图像;提供一次性域中的所有文件可以保护您免受此类恶意活动的侵害。

如果您无法在服务器端下载图像,请在服务器端创建允许的 url 模式(不仅仅是域)的白名单。丢弃任何与此 URL 模式不匹配的 URL。

您不得在 javascript 中执行任何检查。在 JS 中执行检查可以解决您的直接问题,但不能保护您免受 CSRF 的影响。您仍在从您的用户浏览器向攻击者控制的 url 发出请求,这是有风险的。此外,这种方法对性能的影响令人望而却步。

于 2011-02-28T08:31:16.403 回答
1

我认为您主要回答了自己的问题。就个人而言,我会在选项 1 和选项 2 之间进行混合:即创建一个客户端 Javascript,它首先根据一组白名单主机检查图像嵌入 URL。对于不在该列表中的每个嵌入式 URL,请按照以下内容执行操作,同时检查服务器是否返回 401 状态代码。

这样就可以在延迟(我们尝试通过 HEAD 方法和域白名单最小化重复请求)和安全性之间取得平衡。话虽如此,如果您的用户可以接受,选项 2 是最安全的。

于 2011-02-28T07:38:28.347 回答