我管理着一个庞大而活跃的论坛,我们正受到一个非常严重的问题的困扰。我们允许用户嵌入远程图像,就像stackoverflow处理图像(imgur)一样,但是我们没有一组特定的主机,可以使用以下代码从任何主机嵌入图像:
[img]http://randomsource.org/image.png[/img]
这个工作正常而花花公子...除了用户可以嵌入需要身份验证的图像,图像会弹出一个窗口,并且因为可以编辑身份验证弹出窗口,所以会输入“请输入您的[sitename” ]用户名和密码在这里“,不幸的是我们的用户一直在为此而堕落。
对此有何正确回应?我一直在考虑以下几点:
每个页面加载都有一段Javascript执行,用于检查页面上的每个图像及其状态
拥有授权的图像主机列表
完全禁用远程嵌入
问题是我从未见过这种情况发生在其他任何地方,但我们一直困扰着它,我们如何防止这种情况?
答案 0 :(得分:3)
它不仅仅是密码问题。您还允许某些用户对其他用户执行CSRF攻击。例如,用户可以将其个人资料图像设置为[img]http://my-active-forum.com/some-dangerous-operation?with-some-parameters[/img]
。
最佳解决方案是 -
如果无法在服务器端下载图像,请在服务器端创建一个允许的URL模式(不仅仅是域)的白名单。丢弃与此网址格式不匹配的任何网址。
你不能在javascript中执行任何检查。在JS中执行检查可以解决您的直接问题,但不能保护您免受CSRF的影响。您仍在从用户浏览器向攻击者控制的URL发出请求,这是有风险的。此外,该方法的性能影响令人望而却步。
答案 1 :(得分:1)
我认为你大多回答了自己的问题。就个人而言,我会选择选项1和选项2之间的混合:即创建一个客户端Javascript,它首先检查图像嵌入URL与一组列入白名单的主机。对于不在该列表中的每个嵌入式URL,在these lines上执行某些操作,同时检查服务器是否未返回401状态代码。
这种方式在延迟(我们尝试通过HEAD方法和域白名单最小化重复请求)和安全性之间存在平衡。 话虽如此,如果您的用户可以接受选项2,则选项2是最安全的。