2011-04-07 73 views
4

在每个人都告诉我不应该进行客户端清理(我确实打算在客户端执行它,但它也可以在SSJS中工作)之前,让我澄清了我想要做的事情。基于JavaScript的X/HTML和CSS消毒

我想要的东西,类似于Google CajaHTMLPurifier,但对于JavaScript:基于白名单的安全方法,处理HTML和CSS(当然还没有插入到DOM中,这将不安全,但首先获得字符串形式),然后有选择地过滤出不安全的标签或属性,忽略它们或将它们选择性地包含为转义文本,或者以其他方式将它们报告给应用程序进行进一步处理,理想情况下在上下文中。如果它可以将任何JavaScript减少到一个安全的子集,就像在Google Caja中一样,但是我知道这将会提出很多问题。我的用例访问通过JSONP(维基处理前的Mediawiki维基数据,从而允许原始但不可信的XML/HTML输入)获得的不可信的XML/XHTML数据,并允许用户对该数据进行查询和转换( XQuery,jQuery,XSLT等),利用HTML5允许脱机使用,IndexedDB存储等,然后可以允许在用户查看输入源的同一页面上预览结果并构建或导入他们的查询。

用户可以生成他们想要的任何输出,所以我不会对他们正在做的事情进行净化 - 如果他们想在页面中注入JavaScript,那么所有的权力。但我希望保护那些想要有信心的用户,他们可以添加能够安全地从不受信任的输入中复制目标元素的代码,同时不允许他们复制不安全的输入。

这应该是可行的,但我想知道是否有任何库已经这样做。

如果我卡住自己实现这一点(尽管我对这两种情况都很好奇),我想证明是否使用innerHTML或DOM创建/附加BEFORE插入到文档中是安全的办法。例如,如果我第一次运行DOMParser或者使用浏览器HTML解析通过使用innerHTML将原始HTML附加到非插入的div,可以意外触发事件吗?我相信它应该是安全的,但不确定在插入之前DOM操作事件是否会以某种方式发生,这可能会被利用。

当然,构建好的DOM需要在该点之后进行消毒,但是我只想验证我可以安全地构建DOM对象本身以便于遍历,然后担心会过滤掉不需要的元素,属性和属性值。

谢谢!

回答

1

ESAPI的目的是提供一个简单的界面,以清晰,一致且易于使用的方式提供开发人员可能需要的所有安全功能。 ESAPI体系结构非常简单,只是一组封装大多数应用程序所需的关键安全操作的类。

OWASP ESAPI的JavaScript版本:http://code.google.com/p/owasp-esapi-js

输入验证极难有效地完成,HTML是容易的代码和所有的时间数据最差的mashup,因为有这么多的可能的地方,放码等许多不同的有效编码。 HTML特别困难,因为它不仅是分层的,而且还包含许多不同的解析器(XML,HTML,JavaScript,VBScript,CSS,URL等)。尽管输入验证非常重要,应始终执行,但它不是针对注入攻击的完整解决方案。最好使用转义作为你的主要防御。我以前没有使用过HTML Purifier,但看起来不错,他们肯定花了很多时间和思想。为什么不先使用他们的解决方案服务器端,然后再应用你想要的其他规则。我已经看到一些黑客只用[ ] ()的组合来编写代码。这里有100多个示例XSS (Cross Site Scripting) Cheat SheetThe Open Web Application Security Project (OWASP)。有些事情要注意DOM based XSS Prevention Cheat Sheet

HTML净化器捕获这种混合编码破解

<A HREF="h 
tt p://6&#9;6.000146.0x7.147/">XSS</A> 

而且随着unicoded XSS这个DIV的背景图像利用

<DIV STYLE="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029"> 

的你在做什么打击了一下:所有70个可能的组合HTML和JavaScript中的字符“<”

< 
%3C 
&lt 
&lt; 
&LT 
&LT; 
&#60 
&#060 
&#0060 
&#00060 
&#000060 
&#0000060 
&#60; 
&#060; 
&#0060; 
&#00060; 
&#000060; 
&#0000060; 
&#x3c 
&#x03c 
&#x003c 
&#x0003c 
&#x00003c 
&#x000003c 
&#x3c; 
&#x03c; 
&#x003c; 
&#x0003c; 
&#x00003c; 
&#x000003c; 
&#X3c 
&#X03c 
&#X003c 
&#X0003c 
&#X00003c 
&#X000003c 
&#X3c; 
&#X03c; 
&#X003c; 
&#X0003c; 
&#X00003c; 
&#X000003c; 
&#x3C 
&#x03C 
&#x003C 
&#x0003C 
&#x00003C 
&#x000003C 
&#x3C; 
&#x03C; 
&#x003C; 
&#x0003C; 
&#x00003C; 
&#x000003C; 
&#X3C 
&#X03C 
&#X003C 
&#X0003C 
&#X00003C 
&#X000003C 
&#X3C; 
&#X03C; 
&#X003C; 
&#X0003C; 
&#X00003C; 
&#X000003C; 
\x3c 
\x3C 
\u003c 
\u003C 
+0

谢谢...此刻太忙了仔细观察并验证它是否仍然可以让我将安全的HTML放入页面,而不是转义 - 因为我的目的是允许重新整理查询结果的HTML预览,但似乎可能有所帮助。如果不是这样,我真的认为JavaScript需要这样一个库。我不想做任何不必要的往返行程,因为这是针对离线应用的。谢谢! – 2011-04-14 18:35:32