【问题标题】:JSF SelectItems and escaping (xss)JSF SelectItems 和转义 (xss)
【发布时间】:2013-02-22 09:00:35
【问题描述】:

在我的示例中有一个带有 f:selectItems 属性的 selectOneMenu。选择项是从我的 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 转义,我的页面显示了警报消息。

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

【问题讨论】:

  • 你可以找到你的答案here
  • @VikasV:OP 的具体问题与此相反。

标签: jsf xss mojarra


【解决方案1】:

默认值确实不应该是false。我已将其报告为issue 2747

同时,添加itemLabelEscaped="true" 无论如何都要转义它。

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

请注意,仅当您使用 GenericObjectSelectItems 时才需要这样做,即当您提供 E[]/List&lt;E&gt;/Map&lt;K, V&gt; 而不是 List&lt;SelectItem&gt;/SelectItem[] 时。另请注意,只有在涉及用户控制的输入时,转义才是绝对强制性的(幸运的是,在下拉值中很少出现这种情况)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2018-10-22
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多