10

私の例には、af:selectItems-attribute を使用した 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 を使用しています)

4

1 に答える 1

12

デフォルトは確かにそうであってはなりませんfalse問題 2747として報告しました。

その間、itemLabelEscaped="true"とにかくそれをエスケープするために追加します。

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

これは、 を使用している場合GenericObjectSelectItems、つまり/の代わりにE[]/ /を指定している場合にのみ必要であることに注意してください。また、エスケープは、ユーザー制御の入力に関係する場合にのみ絶対に必須であることに注意してください (幸いなことに、ドロップダウン値の場合はほとんどありません)。List<E>Map<K, V>List<SelectItem>SelectItem[]

于 2013-02-22T11:55:17.387 に答える