2013-02-22 64 views
10

在我的例子中有一個selectOneMenu,它帶有一個f:selectItems屬性。該選擇項是從我的豆解決這樣的:在我的豆JSF SelectItems和轉義(xss)

<h:selectOneMenu value="#{bean.value}"> 
    <f:selectItems value="#{bean.selectItems}" var="obj" itemValue="#{obj}" itemLabel="#{obj.name}"/> 
</h:selectOneMenu> 

的方法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的doesn't得到由MenuRenderer-Class和我的網頁逃脫顯示我警報消息。

是否有任何原因爲什麼SelectItem的escape-attribute的默認值是「false」? 我該如何解決這個問題? (我使用Mojarra 2.1.7)

+0

你可以找到你的答案[here](http://stackoverflow.com/questions/14238646/how-to-escape-fselectitem-itemlabel-attribute) – 2013-02-22 09:51:36

+0

@VikasV:OP的具體問題涉及到其他方式。 – BalusC 2013-02-22 11:49:59

回答

12

默認應該不是false。我已將其報告爲issue 2747

與此同時,添加itemLabelEscaped="true"無論如何逃避它。

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

注意,這是隻在必要時您正在使用GenericObjectSelectItems,即當你提供一個E[]/List<E>/Map<K, V>代替List<SelectItem>/SelectItem[]。還要注意,轉義只有在涉及用戶控制的輸入時纔是絕對強制的(幸運的是下拉值很少出現這種情況)。

+0

這已經在JSF 2.2([JAVASERVERFACES_SPEC_PUBLIC-1167](https://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-1167))和Mojarra 2.2.6([JAVASERVERFACES-3143](https:// java。淨/ JIRA /瀏覽/ JAVASERVERFACES-3143))。 – 2014-08-31 08:26:30