JSF SelectItems和转义(xss)

Lod*_*ger 10 xss jsf mojarra

在我的例子中有一个selectOneMenu,其中包含af:selectItems-attribute.select-items从我的bean解析如下:

<h:selectOneMenu value="#{bean.value}">
    <f:selectItems value="#{bean.selectItems}" var="obj" itemValue="#{obj}" itemLabel="#{obj.name}"/>
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

我的bean中的方法getSelectItems()看起来像这样:

    public List<MyObject> getSelectItems() {
        List<MyObject> list = new LinkedList<MyObject>();

        MyObject obj = new MyObject("Peter");
        list.add(obj);

        return list;
    }
Run Code Online (Sandbox Code Playgroud)

显示的对象是具有属性"name"的简单对象.

在这一点上没什么特别的.但现在我改变我的方法:

 public List<MyObject> getSelectItems() {
        List<MyObject> list = new LinkedList<MyObject>();

        MyObject obj = new MyObject("<script>alert('xss is bad');</script>");
        list.add(obj);

        return list;
    }
Run Code Online (Sandbox Code Playgroud)

JavaScript没有被MenuRenderer-Class转义,我的页面显示警报消息.

是否有任何原因导致SelectItem的escape属性的默认值为"false"?我该如何解决这个问题?(我使用Mojarra 2.1.7)

Bal*_*usC 12

确实应该没有默认值false.我已将其报告为问题2747.

与此同时,itemLabelEscaped="true"无论如何都要加以逃避.

<f:selectItems ... itemLabelEscaped="true" />
Run Code Online (Sandbox Code Playgroud)

请注意,这只是在必要的时候你使用GenericObjectSelectItems,也就是说,当你提供一个E[]/ List<E>/ Map<K, V>而不是List<SelectItem>/ SelectItem[].另请注意,当涉及用户控制的输入时,转义仅是绝对必需的(幸运的是,下拉值中很少出现这种情况).