当在JSF中使用来自用户的污染输入时,<f:verbatim>标签对XSS是否安全?

时间:2016-04-05 14:23:58

标签: jsf jsf-2 xss

我正在寻找有关使用JavaServer Faces的Web应用程序中的XSS的信息。 我找到了论文Proofing Java EE, JSP, and JSF Applications 在页48(幻灯片36)上调用&#34;在JSF中转义&#34;有代码片段:

<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。

所以我有两个问题:

  1. 在使用基于JSF 2.0+和Facelets构建的Web应用程序中的用户的污染输入时,<f:verbatim>标记对XSS是否安全?
  2. 在哪种情况下<f:verbatim>标记&#34;不要逃避&#34;在基于JSF构建的Web应用程序中?
  3. 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&lt;script&gt;alert(9)&lt;/script&gt;testform1
                testform2<script>alert(10)</script>testform2
    
                    aaa&lt;script&gt;alert(11)&lt;/script&gt;bbb
                    ccc
                    <span>
                        &lt;script&gt;alert(12)&lt;/script&gt;test
                        <a>link&lt;script&gt;alert(13)&lt;/script&gt;</a>
                        &lt;script&gt;alert(14)&lt;/script&gt;
                    </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>
    

1 个答案:

答案 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.在将来的资源中,请仔细检查发布日期以及所处理的版本是否与您的版本匹配。

另见: