【问题标题】:How to escape HTML by default in StringTemplate?如何在 StringTemplate 中默认转义 HTML?
【发布时间】:2014-05-24 07:11:00
【问题描述】:

在 HTML 模板引擎中,默认占位符文本进行 HTML 转义以帮助防止 XSS(跨站点脚本)攻击是非常好的做法。是否可以在 StringTemplate 中实现这种行为?

我尝试注册自定义AttributeRenderer,除非format 是"raw",否则它会转义HTML:

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);
    }
});

但它失败了,因为在这种情况下,StringTemplate 不仅会转义占位符文本,还会转义模板文本本身。例如这个模板:

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;

有人可以帮忙吗?

【问题讨论】:

    标签: java stringtemplate stringtemplate-4


    【解决方案1】:

    默认编码没有好的解决方案。模板是通过字符串数据类型的 AttributeRenderer 传递的,并且没有上下文信息来检测它是在处理模板还是变量。因此,包括模板在内的所有字符串都是默认编码的,因为您不能为模板指定“原始”。

    另一种解决方案是在需要编码的变量中使用format="xml-encode"。内置的StringRenderer 支持多种格式:

    • 上
    • 降低
    • 上限
    • 网址编码
    • xml 编码

    所以你的例子是:

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

    为了编码默认,您的选择有限。替代方案是:

    1. 为您的变量使用自定义数据类型(不是String),因此您可以为自定义数据类型注册HtmlEscapeStringRenderer。如果您将复杂对象用作已经使用标准字符串的变量,这将很困难。
    2. 手动将原始变量和转义变量添加到模型中,例如添加title(转义)和title_raw(原始)。在这种情况下,您不需要自定义 AttributeRenderer。 StringTemplate 具有严格的视图/模型分离,您需要先填充模型,然后再使用原始值和转义值进行渲染。

    这两个选项都不是特别理想,但我没有看到 StringTemplate4 的任何其他替代方案。

    【讨论】:

    • 当然可以,但是很容易忘记添加format="xml-encode",这就是为什么我的问题是如何默认启用编码。
    【解决方案2】:

    答案是恢复到 StringTemplate v3。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-26
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 2014-01-29
      • 2018-10-27
      相关资源
      最近更新 更多