10

在我的示例中有一个带有 af:selectItems-attribute 的 selectOneMenu。选择项是从我的 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;
    }

显示的对象是具有“名称”属性的简单对象。

到目前为止没有什么特别的。但是现在我将方法更改为:

 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的转义属性的默认值为“false”有什么原因吗?我该如何解决这个问题?(我使用 Mojarra 2.1.7)

4

1 回答 1

12

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

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

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

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

于 2013-02-22T11:55:17.387 回答