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>
>>
次のようにレンダリングされます。
<html>
<head>
<title>Example Title</title>
</head>
<body>
<p>Not escaped because of <code>format = "raw"</code>.</p>
</body>
</html>
誰でも助けることができますか?