4

HTML テンプレート エンジンでは、XSS (クロスサイト スクリプティング) 攻撃を防ぐために、既定のプレースホルダー テキストで HTML エスケープすることをお勧めします。StringTemplate でこの動作を実現することは可能ですか?

次の場合をAttributeRenderer除き、HTML をエスケープするカスタムを登録しようとしました。format"raw"

stg.registerRenderer(String.class, new AttributeRenderer() {
    @Override
    public String toString(Object o, String format, Locale locale)  {
        String s = (String)o;
        return Objects.equals(format, "raw") ? s : StringEscapeUtils.escapeHtml4(s);
    }
});

しかし、この場合、StringTemlate はプレースホルダー テキストだけでなく、テンプレート テキスト自体もエスケープするため、失敗します。たとえば、このテンプレート:

example(title, content) ::= <<
    <html>
        <head>
            <title>$title$</title>
        </head>
        <body>
            $content; format = "raw"$
        </body>
    </html>
>>

次のようにレンダリングされます。

&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;Example Title&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        <p>Not escaped because of <code>format = "raw"</code>.</p>
    &lt;/body&gt;
&lt;/html&gt;

誰でも助けることができますか?

4

2 に答える 2

1

答えは、StringTemplate v3 に戻すことです。

于 2015-03-30T15:23:16.067 に答える