捕获XSS(跨站点脚本)攻击的最佳正则表达式(在Java中)?

Jeff实际上在Sanitize HTML中发布了有关此内容的信息。但是他的示例在C#中,而实际上我对Java版本更感兴趣。有没有人有更好的Java版本?他的示例足以将直接从C#转换为Java吗?

[更新]我悬赏这个问题,因为当我问这个问题时,SO不如今天(*)受欢迎。至于与安全相关的任何事物,研究它的人越多,它就越好!

(*)实际上,我认为它仍处于封闭测试阶段

回答:

不要使用正则表达式执行此操作。请记住,您并不是仅仅针对有效的HTML进行保护;您可以防止Web浏览器创建的DOM。可以诱使浏览器很容易地从无效的HTML生成有效的DOM。

例如,请参阅此混淆的XSS攻击列表。您是否准备量身定制正则表达式以防止在IE6 / 7/8上对Yahoo和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&lt;SCRIPT DEFER&gt;alert(&quot;XSS&quot;)&lt;/SCRIPT&gt;">

</BODY></HTML>

如何在IE6上进行这种攻击?

<TABLE BACKGROUND="javascript:alert('XSS')">

该网站未列出的攻击如何?Jeff的方法存在的问题是,它不是声称的白名单。正如该页面上的某人熟练地指出:

它的问题是html必须干净。在某些情况下,您可以传入被黑的html,但它不会与之匹配,在这种情况下,它将返回被黑的html字符串,因为它不匹配任何要替换的内容。这不是严格的白名单。

我建议使用像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();

}

以上是 捕获XSS(跨站点脚本)攻击的最佳正则表达式(在Java中)? 的全部内容, 来源链接: utcz.com/qa/422936.html

回到顶部