我正在寻找有关使用JavaServer Faces的Web应用程序中的XSS的信息。 我找到了论文Proofing Java EE, JSP, and JSF Applications 在页48(幻灯片36)上调用"在JSF中转义"有代码片段:
<f:verbatim value="#{foo}"/>
同样在第50页(幻灯片38)上有描述&#34;不足以逃脱的标签&#34; <f:verbatim>
和<h:outputlink>
。
在使用Facelets的Web应用程序中使用EL时,我无法在<f:verbatim>
标记内重现XSS,可能是因为JSF组件中的自动转义:
CSRF, XSS and SQL Injection attack prevention in JSF
&#34; JSF旨在内置XSS预防。您可以使用任何JSF组件安全地重新显示所有用户控制的输入(请求标头(包括cookie!),请求参数(也包括保存在DB中的参数!)和请求主体(上传的文本文件等))。#34 ;
看来纸上的信息是针对2.0之前的JSF。
我也发现了这个:
f:verbatim tag stops working when inside a dataTable
&#34; <f:verbatim>
标记用于保存纯文本/ HTML,而不是JSF组件或EL表达式。&#34;
所以我不明白如果这个标签不能处理来自请求或bean的动态数据,那么该标签如何用于XSS。
所以我有两个问题:
<f:verbatim>
标记对XSS是否安全?<f:verbatim>
标记&#34;不要逃避&#34;在基于JSF构建的Web应用程序中?JSF 2.0和Facelets的示例:
<h:form>
testform1#{testBean.getXSS(9)}testform1
testform2<h:outputText value="#{testBean.getXSS(10)}" escape="false" />testform2
<f:verbatim escape="false">
aaa#{testBean.getXSS(11)}bbb
ccc
<span>
#{testBean.getXSS(12)}test
<a>link#{testBean.getXSS(13)}</a>
#{testBean.getXSS(14)}
</span>
ddd
<script>alert(15)</script>
eee
<h:outputText value="#{testBean.getXSS(16)}" escape="false" />
ddd
</f:verbatim>
</h:form>
bean中的测试方法:
public String getXSS(Integer index) {
return ("<script>alert(" + Integer.toString(index) + ")</script>");
}
输出:
testform1<script>alert(9)</script>testform1
testform2<script>alert(10)</script>testform2
aaa<script>alert(11)</script>bbb
ccc
<span>
<script>alert(12)</script>test
<a>link<script>alert(13)</script></a>
<script>alert(14)</script>
</span>
ddd
<script>alert(15)</script>
eee
ddd
<input type="hidden" name="javax.faces.ViewState" id="j_id1:javax.faces.ViewState:1" value="-7832412971090198368:1934231343887166207" autocomplete="off" />
</form>
答案 0 :(得分:0)
引用的文章/幻灯片是从2009年6月8日开始的。那是JSF 1.2和JSP的时代。
JSF 2.0于2009年12月推出。从那时起,JSP被弃用并被Facelets取代。 <f:verbatim>
已被弃用,因为它在Facelets中完全没用。 Facelets上的JSF 2.0旨在对所有地方进行隐式XSS预防(除了一个已在2.2.6中修复的Mojarra特定错误之外,请参阅下面的第1个“另请参见”链接以获取详细信息)。
换句话说,忽略那篇文章/幻灯片。它根本不适用于JSF 2.x.在将来的资源中,请仔细检查发布日期以及所处理的版本是否与您的版本匹配。