在我的示例中有一个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 [].另外请注意,转义只是在用户控制的输入(绝对非常少的情况下,下拉列表值)时才是绝对强制的.