我管理着一个庞大而活跃的论坛,但我们正被一个非常严重的问题所困扰。我们允许用户嵌入远程图像,就像 stackoverflow 处理图像 (imgur) 的方式一样,但是我们没有一组特定的主机,可以使用以下代码从任何主机嵌入图像:
[img]http://randomsource.org/image.png[/img]
这工作正常而且花花公子...除了用户可以嵌入需要身份验证的图像,该图像会导致出现弹出窗口,并且因为可以编辑身份验证弹出窗口,所以他们会输入类似“请输入您的[站点名称] 用户名和密码”,不幸的是我们的用户已经上当了。
对此的正确回应是什么?我一直在考虑以下几点:
每个页面加载都有一段 Javascript 执行,用于检查页面上的每个图像及其状态
拥有授权的图片托管列表
完全禁用远程嵌入
问题是我从未在其他任何地方看到过这种情况,但我们却深受其害,我们如何防止这种情况发生?
最佳答案
这不仅仅是密码问题。您还允许您的一些用户对其他用户进行 CSRF 攻击。例如,用户可以将他的个人资料图像设置为 [img]http://my-active-forum.com/some-dangerous-operation?with-some-parameters[/img]
。
最好的解决办法是——
- 下载图像服务器端并将其存储在文件系统/数据库中。保持合理的最大文件大小,否则攻击者可以将大量 GB 的数据下载到您的服务器上,以占用 n/w 和磁盘资源。
- 可选地,验证文件是否确实是图像
- 使用一次性域名或 IP 地址提供图像。可以创建伪装成 jar 或 applet 的图像;提供来自一次性域的所有文件可以保护您 来自此类恶意事件。
如果您无法在服务器端下载图像,请在服务器端创建一个允许的 url 模式(不仅仅是域)的白名单。丢弃与此 URL 模式不匹配的所有 URL。
您不得在 javascript 中执行任何检查。在 JS 中执行检查可以解决您眼前的问题,但不能保护您免受 CSRF 攻击。您仍在从您的用户浏览器向攻击者控制的 url 发出请求,这是有风险的。此外,该方法对性能的影响令人望而却步。
关于authentication - 远程图像嵌入 : how to handle ones that require authentication?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5139083/