我正在开发一个已有多年历史的 Java Web 应用程序。
<bean:write>
JSP 中的大多数sfilter="false"
甚至在不需要时都有,这可能是因为开发人员盲目地复制现有代码。<bean:write>
是Struts标签输出一个JSP变量,filter="false"
指定时不做HTML转义(所以和属性filter="false"
类似)。这意味着应用程序容易受到 XSS 攻击,因为其中一些正在输出用户输入。<c:out>
escapeXml="false"
<bean:write filter="false">
一揽子删除filter="false"
不是一个选项,因为在某些情况下,应用程序允许用户使用 TinyMCE 文本区域输入 HTML,因此在某些情况下我们确实需要输出原始 HTML 以保留用户输入的格式(尽管我们仍然应该清理用户输入的 HTML 以删除脚本)。
代码中有数千个filter="false"
s,因此审核每个 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) 我们提出的方法是否可以修复由以下原因引起的 XSS 漏洞filter="false"
?
2) 任何人都可以推荐一个在显示内容时用于 HTML 清理的库,即它的速度足够快,不会显着影响页面渲染性能吗?有没有人用过 AntiSamy 或 owasp-java-html-sanitizer 来做类似的事情?