如何中和注入的远程Ajax内容?

时间:2009-06-30 07:33:46

标签: javascript ajax security dom

我将把来自远程资源的内容插入到网络应用中。来源应该受到限制/信任,但仍然存在一些问题:

远程资源可以

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)“我知道常见的攻击,你需要考虑到这个......”响应......或者你可以通过这样做来防止其他类型的攻击......或者这次袭击怎么样??

我正在寻找第二种类型,除非有人能提供具体原因,说明为什么我会比用户自己做的更危险。

4 个答案:

答案 0 :(得分:1)

而不是消毒(黑名单)。我建议你设置一个白名单,只允许那些特定的东西。

这样做的原因是,您永远不会,永远不会捕获恶意脚本的所有变体。它们太多了。

答案 1 :(得分:1)

不要忘记还包括<frame><frameset>以及<iframe>

答案 2 :(得分:1)

对于消毒事项,您在寻找this吗?

如果没有,也许您可​​以从this code snippet了解一些提示。

但是,必须不言而喻,预防胜于治疗。您最好只允许受信任的来源,而不是允许所有来源,然后进行清理。

在相关说明中,您可能需要查看this article及其slashdot discussion

答案 3 :(得分:1)

听起来你想要做以下事情:

  • 将静态HTML的代码段插入您的网页
  • 这些片段是通过AJAX从远程站点请求的。
  • 您希望在注入网站之前清理HTML,因为这可能会导致XSS等安全问题。

如果是这种情况,那么就没有简单的方法来删除JavaScript中的“坏”内容。白名单解决方案是最好的,但这可能会变得非常复杂。我建议通过您自己的服务器代理远程内容的请求并清理HTML服务器端。有各种各样的库可以做到这一点。我建议使用AntiSamyHTMLPurifier

对于完全基于浏览器的方法,您可以使用IE8的toStaticHTML方法。但是目前还没有其他浏览器实现这一点。