【发布时间】:2013-03-06 11:00:25
【问题描述】:
我正在开发一个已有多年历史的 Java Web 应用程序。
JSP 中的大多数<bean:write>s 都有filter="false",即使在不需要时也是如此,这可能是因为开发人员盲目地复制现有代码。 <bean:write> 是用于输出 JSP 变量的 Struts 标记,当指定 filter="false" 时,它不会进行 HTML 转义(因此 filter="false" 类似于 <c:out> 属性 escapeXml="false")。这意味着应用程序容易受到 XSS 攻击,因为其中一些 <bean:write filter="false">s 正在输出用户输入。
一揽子删除filter="false" 不是一个选项,因为在某些情况下,应用程序允许用户使用 TinyMCE 文本区域输入 HTML,因此在某些情况下我们确实需要输出原始 HTML 以保留用户输入的内容格式化(尽管我们仍应清理用户输入的 HTML 以删除脚本)。
代码中有数以千计的filter="false"s,因此审核每一个以确定是否需要它需要太长时间。
我们正在考虑做的是制作我们自己版本的bean:write 标记,比如secure:write,并在我们的JSP 中使用secure:write 进行bean:write 的全局查找/替换。 secure:write 将在指定 filter="false" 时从输出中删除脚本。在此更改之后,用户仍然可以在他们不应该输出的地方输出格式化 HTML,但只要修复了 XSS 漏洞,我们暂时不担心这一点。
我们想使用一个库来实现secure:write 标记中的脚本剥离,我们一直在研究https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project 和https://code.google.com/p/owasp-java-html-sanitizer/。两者看起来都能够清理 HTML,尽管 AntiSamy 看起来像是用于在进入应用程序而不是退出时清理 HTML,并且由于数据的输出频率高于输入数据,因此我们是担心通过它运行我们所有的secure:write 输出可能会很慢。
我有两个主要问题:
1) 我们提出的方法能否修复由filter="false" 引起的 XSS 漏洞?
2) 任何人都可以推荐一个在显示内容时用于 HTML 清理的库,即它的速度足够快,不会显着影响页面渲染性能吗?有没有人用过 AntiSamy 或 owasp-java-html-sanitizer 来做类似的事情?
【问题讨论】:
标签: java jsp struts xss html-sanitizing