我将把来自远程资源的内容插入到网络应用中。来源应该受到限制/信任,但仍然存在一些问题:
远程资源可以
1)被黑客入侵并注入不好的东西
2)覆盖全局名称中的对象 空间
3)我最终可能会打开它让用户输入他们自己的远程源。 (这可能取决于用户不会遇到麻烦,但我仍然可以降低风险。)
所以我想中和任何/所有注入的内容只是为了安全。
到目前为止,这是我的计划:
1)查找并删除所有内联事件处理程序
str.replace(/(<[^>]+\bon\w+\s*=\s*["']?)/gi,"$1return;"); // untested
实施例
<a onclick="doSomethingBad()" ...
会变成
<a onclick="return;doSomethingBad()" ...
2)删除所有这些标签的出现: 脚本,嵌入,对象,表单,iframe或小程序
3)查找标签内所有单词脚本的出现 并用html实体替换单词script
str.replace(/(<[>+])(script)/gi,toHTMLEntitiesFunc);
会照顾
<a href="javascript: ..."
4)最后,任何不以http开头的src或href属性都应该有前面的远程源的域名
我的问题:我错过了什么吗?我应该做或不做的其他事情?
编辑:我觉得答案会落入几个阵营。
1)“不要这样做!”回复
好的,如果有人想要100%安全,他们需要断开电脑。
这是可用性和安全性之间的平衡。
没有什么可以阻止用户直接访问网站并被曝光。如果我打开它,用户输入内容的风险自负。他们可以像在我的表单中一样轻松地将指定的URL输入到他们的地址栏中。因此,除非我的服务器存在特殊风险,否则我可以承担这些风险。
2)“我知道常见的攻击,你需要考虑到这个......”响应......或者你可以通过这样做来防止其他类型的攻击......或者这次袭击怎么样??
我正在寻找第二种类型,除非有人能提供具体原因,说明为什么我会比用户自己做的更危险。
答案 0 :(得分:1)
而不是消毒(黑名单)。我建议你设置一个白名单,只允许那些特定的东西。
这样做的原因是,您永远不会,永远不会捕获恶意脚本的所有变体。它们太多了。
答案 1 :(得分:1)
不要忘记还包括<frame>
和<frameset>
以及<iframe>
答案 2 :(得分:1)
对于消毒事项,您在寻找this吗?
如果没有,也许您可以从this code snippet了解一些提示。
但是,必须不言而喻,预防胜于治疗。您最好只允许受信任的来源,而不是允许所有来源,然后进行清理。
在相关说明中,您可能需要查看this article及其slashdot discussion。
答案 3 :(得分:1)
听起来你想要做以下事情:
如果是这种情况,那么就没有简单的方法来删除JavaScript中的“坏”内容。白名单解决方案是最好的,但这可能会变得非常复杂。我建议通过您自己的服务器代理远程内容的请求并清理HTML服务器端。有各种各样的库可以做到这一点。我建议使用AntiSamy或HTMLPurifier。
对于完全基于浏览器的方法,您可以使用IE8的toStaticHTML方法。但是目前还没有其他浏览器实现这一点。