在我的示例中有一个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;
- }
到目前为止没有什么特别之处但是现在我改变了我的方法:
- 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 [].另外请注意,转义只是在用户控制的输入(绝对非常少的情况下,下拉列表值)时才是绝对强制的.