JSF SelectItems和转义(xss)

时间:2013-02-22 09:00:35

标签: jsf xss mojarra

我的示例中有一个带有f:selectItems属性的selectOneMenu。 select-items从我的bean中解析出来:

<h:selectOneMenu value="#{bean.value}">
    <f:selectItems value="#{bean.selectItems}" var="obj" itemValue="#{obj}" itemLabel="#{obj.name}"/>
</h:selectOneMenu>

我的bean中的getSelectItems()方法如下:

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

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

        return list;
    }

显示的对象是具有属性“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;
    }

javascript不会被MenuRenderer-Class转义,我的页面会显示警告信息。

为什么SelectItem的escape-attribute的默认值为“false”? 我该如何解决这个问题? (我使用Mojarra 2.1.7)

1 个答案:

答案 0 :(得分:12)

默认值应该不是false。我已将其报告为issue 2747

同时,添加itemLabelEscaped="true"无论如何都要逃避它。

<f:selectItems ... itemLabelEscaped="true" />

请注意,只有在您使用GenericObjectSelectItems时才需要这样做,即当您提供E[] / List<E> / Map<K, V>而不是List<SelectItem>时} / SelectItem[]。另请注意,当涉及用户控制的输入时,转义只是绝对必需的(幸运的是,下拉值中很少出现这种情况)。