java - 使用 Thymeleaf 显示净化后的 HTML 的最干净方式?

标签 java spring thymeleaf

我的数据库中有一些数据,我们允许输入 HTML 的子集以便稍后显示。出于偏执/不信任旧版本的代码,我想通过 Jsoup 的 Jsoup.clean() 之类的东西来运行它。在显示之前,防止跨站点脚本 (XSS) 问题。

此外,我想替换 "\n""<br/>" ,以便在这些字段中输入更多自由格式文本的人稍后可以看到合理的内容。

在我的 JSP 中,我编写了一个自定义标签库来处理这个问题,我这样使用它:

<util:whitelistHtml value="${some.thing}" convertNewlines="true"/>

在 Thymeleaf 中重现此行为的最简洁方法是什么?我看到了几个选项:

  • 一个参数化片段,使用 Spring 表达式调用 Jsoup,如 th:utext="${T(org.jsoup.Jsoup).clean(some.thing.replaceAll('\n', '<br/>'), T(org.jsoup.safety.Whitelist).basic())}" .
  • 一种自定义方言,我在这里写了一个新的 foo:cleanHtml="${some.thing}"属性处理程序,可能扩展 org.thymeleaf.standard.processor.attr.StandardUtextAttrProcessororg.thymeleaf.standard.processor.attr.AbstractStandardUnescapedTextChildModifierAttrProcessor完成大部分工作。
  • 一些我可以使用的自定义实用程序对象,例如 th:utext="${#cleaners.cleanHtml(${some.thing}, true)}"
  • 在我的 Controller 中进行这个处理,然后传递一个带有“干净”形式事物的额外模型属性,或者让 Controller 直接覆盖主模型对象的属性,然后使用th:utext="${some.thing}"。 .

以上哪个最有可能在 Thymeleaf 3 之后继续工作,并且意外 XSS 暴露的风险也最小,或者至少比 JSP 文件更容易审核代码?

最佳答案

我发现添加自定义实用程序对象的解决方案相对简单。

这基本涉及creating a new dialect ,并覆盖 getAdditionalExpressionObjects 以添加我的新对象的实例:

public class CleanHtmlDialect extends AbstractDialect
        implements IExpressionEnhancingDialect {
    // ...

    @Override
    public Map<String, Object> getAdditionalExpressionObjects(IProcessingContext processingContext) {
        Map<String, Object> expressionObjects = new HashMap<>();
        expressionObjects.put("cleanHtml", new CleanHtml());
        return expressionObjects;
    }
}

关于java - 使用 Thymeleaf 显示净化后的 HTML 的最干净方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31882012/

相关文章:

html - css 和 js url 无法通过布局装饰在基本文件 thymeleaf 上工作

java - 捕获的输出“需要很长时间才能在多次运行后出现在屏幕上

java - Spring 启动 : Configure a url prefix for RestControllers

html - Thymeleaf 吞下数据列表中的选项标签

spring - 在 thymeleaf View 中使用自定义格式化程序进行映射

java - 如何使用 jSTL 迭代 map ?

尝试使用 Thymeleaf 加载 HTML 文件时出现 Spring Boot 404

java - 如何在以 root 身份执行的可执行 jar 内以用户模式运行脚本?

java - 为什么这个 GridBagConstraints 代码不起作用?

java - Apache POI 3.6 : Reading an xlsx file