用 Thymeleaf 显示已消毒 HTML 的最干净方式?
Cleanest way to display sanitized HTML with 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.StandardUtextAttrProcessor
和 org.thymeleaf.standard.processor.attr.AbstractStandardUnescapedTextChildModifierAttrProcessor
来完成大部分工作。
- 我可以使用的一些自定义实用程序对象,例如
th:utext="${#cleaners.cleanHtml(${some.thing}, true)}"
- 在我的控制器中做这个处理,然后用 "clean" 形式传递一个额外的模型属性,或者让控制器直接覆盖主模型对象的属性,然后使用
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;
}
}
我的数据库中有一些数据,我们允许输入 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)}"
- 在我的控制器中做这个处理,然后用 "clean" 形式传递一个额外的模型属性,或者让控制器直接覆盖主模型对象的属性,然后使用
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;
}
}