如何缓解Fortify SAST检测到的JSF inputHidden XSS漏洞?
先给结论
JSF的<h:inputHidden>组件默认会自动对输出到页面的value值做HTML转义,Fortify报的这个XSS风险大概率是误报,但得搞清楚背后的逻辑。
为什么你用fn:escapeXml没用?
fn:escapeXml是JSP里用来直接输出文本时的转义工具,而JSF组件的value属性是由组件自身处理输出转义的。你在EL表达式里套fn:escapeXml,反而会触发双重转义:先被fn转一次,再被JSF组件转一次,结果就是转义后的内容又被转了一遍,看起来完全没起到你想要的效果,而且根本没必要这么做。- 举个例子:如果bean.total的值是
<script>alert('xss')</script>,用fn:escapeXml后会变成<script>alert('xss')</script>,然后JSF组件再转一次就成了&lt;script&gt;alert('xss')&lt;/script&gt;,最终页面上的hidden值是这个双重转义后的字符串,完全多余。
什么时候才需要手动转义?
只有当你不通过JSF组件,直接在页面输出EL值的时候(比如用<c:out>标签或者裸写EL表达式),才需要用fn:escapeXml。但<h:inputHidden>本身已经把转义这件事做了,不用你额外处理。
- 例外:如果你用的是非常老的JSF版本(比如1.0/1.1),可能存在某些边缘场景的转义漏洞,但现在主流的JSF 2.x及以上版本都已经修复了这类问题。
怎么验证转义是否真的生效?
做个简单测试就能确认:
- 给bean的total属性赋值为
<script>alert('xss')</script> - 渲染页面后查看HTML源码,看hidden input的value值是不是被转义成
<script>alert('xss')</script> - 如果是,说明转义生效,Fortify的检测就是误报,直接标记为False Positive就行。
内容的提问来源于stack exchange,提问作者emgi
相关产品推荐
相关产品推荐

