我的示例中有一个带有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)
答案 0 :(得分:12)
默认值应该不是false
。我已将其报告为issue 2747。
同时,添加itemLabelEscaped="true"
无论如何都要逃避它。
<f:selectItems ... itemLabelEscaped="true" />
请注意,只有在您使用GenericObjectSelectItems
时才需要这样做,即当您提供E[]
/ List<E>
/ Map<K, V>
而不是List<SelectItem>
时} / SelectItem[]
。另请注意,当涉及用户控制的输入时,转义只是绝对必需的(幸运的是,下拉值中很少出现这种情况)。