我的数据库中有一些数据,我们允许输入 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.StandardUtextAttrProcessor
和org.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/