JSF SelectItems和转义(xss)

在我的示例中有一个selectOneMenu与f:selectItems属性.选择项目从我的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转义,我的页面显示了alert-message.

是否有任何原因为什么SelectItem的escape-attribute的认值为“false”?
我如何解决这个问题? (我使用Mojarra 2.1.7)

解决方法

实际上并不是假的.我报了 issue 2747.

同时,添加itemLabelEscaped =“true”来避免它.

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

请注意,只有当您使用GenericObjectSelectItems时,即当您提供E [] / List< E> / Map< K,V>而不是List< SelectItem> / SelectItem [].另外请注意,转义只是在用户控制的输入(绝对非常少的情况下,下拉列表值)时才是绝对强制的.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...