Jeff实际上在
Sanitize HTML发布了这个。但是他的例子是C#,我实际上对Java版本更感兴趣。有没有人有更好的Java版本?他的例子是否足够好,我可以直接从C#转换为Java?
[更新]我对这个问题提出了一个赏question,因为当我提出这个问题(*)的时候,因为没有像今天那样受欢迎。对于与安全有关的任何事情,人们看得越多越好!
(*)其实我觉得还处于封闭测试阶段
不要用正则表达式做到这一点。请记住,您不是仅仅针对有效的HTML进行保护;您正在保护Web浏览器创建的DOM。浏览器可以很容易地被欺骗从无效的HTML生成有效的DOM。
原文链接:https://www.f2er.com/regex/357390.html例如,请参阅obfuscated XSS attacks的列表。您是否准备定制正则表达式以防止IE6 / 7/8上的Yahoo and Hotmail上的这个真实世界的攻击?
<HTML><BODY> <?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time"> <?import namespace="t" implementation="#default#time2"> <t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>"> </BODY></HTML>
这个IE6的攻击怎么样?
<TABLE BACKGROUND="javascript:alert('XSS')">
该网站上未列出的攻击如何?杰夫的做法的问题在于,它不是一个白名单。正如that page上的人擅长的一样:
The problem with it,is that the html
must be clean. There are cases where
you can pass in hacked html,and it
won’t match it,in which case it’ll
return the hacked html string as it
won’t match anything to replace. This
isn’t strictly whitelisting.
我会建议一个专用的工具,如AntiSamy.它可以通过实际解析HTML,然后遍历DOM和删除任何不在配置白名单的工作。主要的区别是能够优雅地处理格式不正确的HTML。
最好的部分是它实际上是对上述站点上的所有XSS攻击进行单元测试。此外,可以比这个API调用更容易:
public String toSafeHtml(String html) throws ScanException,PolicyException { Policy policy = Policy.getInstance(POLICY_FILE); AntiSamy antiSamy = new AntiSamy(); CleanResults cleanResults = antiSamy.scan(html,policy); return cleanResults.getCleanHTML().trim(); }