gpt4 book ai didi

thymeleaf - thymeleaf 可以安全地与用户提供的模板一起使用吗?

转载 作者:行者123 更新时间:2023-12-04 08:54:20 29 4
gpt4 key购买 nike

在 SaaS 应用程序中,我使用了一些模板来生成通知电子邮件或某些 HTML 页面。到目前为止,我没有使用 thymeleaf,而且所有模板都是硬编码的,但我很想改变它,以便应用程序的用户可以自己编辑这些模板。问题是,如果我允许用​​户自己编辑模板,用户可能会调用任何 Java 方法,这将完全危及系统安全。

thymeleaf 可以被“沙盒化”还是可以禁用所有在用户编辑的模板上下文中危险的功能? (为了执行,模板接收一个只有 getter 和 setter 的 POJO 或一个 java.util.Map,所以在模型上调用方法不是问题)

我试过的

最明显的问题是OGNL/SpringEL。这些表达的力量可以很大,但它们也非常危险。我所需要的只是从模型中调用 getter。所以我尝试像这样实现我自己的表达式解析器(以下只是作为概念证明的快速和肮脏的东西,它没有“完成”):

final TemplateEngine templateEngine = new TemplateEngine();
final StandardDialect dialect = new StandardDialect();
dialect.setExpressionParser(new IStandardExpressionParser() {
@Override
public IStandardExpression parseExpression(final IExpressionContext context, final String input) {
if (!input.startsWith("${") || !input.endsWith("}")) {
throw new IllegalArgumentException("Only variable expressions allowed, not " + input);
}
final String[] path = StringUtils.split(input.substring("${".length(), input.length() - "}".length()), '.');
return new IStandardExpression() {
@Override
public String getStringRepresentation() {
return "Variable " + Arrays.toString(path);
}

@Override
public Object execute(final IExpressionContext context) {
Object result = context.getVariable(path[0]);
for (int i = 1; i < path.length; i++) {
try {
result = BeanUtils.getProperty(result, path[i]);
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
throw new Error(e);
}
}
return result;
}

@Override
public Object execute(final IExpressionContext context, final StandardExpressionExecutionContext expContext) {
return execute(context);
}
};
}
});
templateEngine.setDialect(dialect);
System.out.println(templateEngine.process(
"<html xmlns:th=\"http://www.thymeleaf.org\"><p th:text=\"${someVar}\"></p></html>",
new Context(Locale.ENGLISH, Collections.singletonMap("someVar", "someValue"))
));

看起来这很有效,但这就足够了吗?还是有其他安全漏洞?

最佳答案

我认为使用 Java Security Manager 可以更好地解决您的用例。您将能够为负责加载、解析和解释用户模板的代码授予非常狭窄的权限。

关于thymeleaf - thymeleaf 可以安全地与用户提供的模板一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44859481/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com