当前位置: 首页 > 知识库问答 >
问题:

thymeleaf能否与用户提供的模板一起安全使用?

孟翰藻
2023-03-14

在SaaS应用程序中,我有一些模板用于生成通知电子邮件或某些超文本标记语言页面。到目前为止,我还没有使用thymeleaf,到目前为止所有的模板都是硬编码的,但是我很想改变这一点,这样应用程序的用户就可以自己编辑这些模板。问题是,如果我允许用户自己编辑模板,用户可能会调用任何Java方法,这将完全危及系统安全性。

thymeleaf可以被“沙箱”,或者可以禁用用户编辑模板上下文中危险的所有功能?(对于执行,模板接收一个只有getters和setters的POJO或一个java.util.Map,所以调用模型上的方法不是问题)

最明显的问题是OGNL/SpringEL。这些表达的力量可能很大,但也非常危险。我只需要从模型中调用getters。所以我试着像这样实现我自己的表达式解析器(下面是一些简单的东西

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

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

共有1个答案

姚海
2023-03-14

我认为使用Java安全管理器可以更好地解决您的用例。对于负责加载、解析和解释用户模板的代码,您将能够给予非常狭窄的权限。

 类似资料:
  • 我在让Thymeleaf按照我想要的方式处理模板方面遇到了一些问题。我以前使用的ApacheTiles很有效,但我认为它在配置/XML中很重要。我有一个优雅的解决方案,我甚至在XML配置中定义我的JavaScripts和Sytlesheets。然而,我想完全远离JSP。我已经看到了Thymeleaf和Facelets的参考资料。我决定试试Thymeleaf,但我在为所有其他页面获取默认布局时遇到了

  • 我知道如何从Mifare DESFire标签读取和写入ndef消息,但是在从Android进行通信时,我很难理解如何使用DESFire支持的命令集。 > 我知道这与函数有关,它有助于通过原始字节进行通信。我如何使用它? 如何使用自定义密钥锁定消息?

  • 问题内容: 当我在终端中键入命令时,它似乎可以正常工作- 成功下载所有库等。但是,在该过程结束时,我收到一条消息,提示您。 输入项 输出量 在的package.json中: 我检查了CRA 更改日志,看起来好像增加了对自定义模板的支持-但是看起来命令似乎没有更改。 知道这里发生了什么吗? 问题答案: 如果您以前通过进行了全局安装,建议您使用来卸载软件包,以确保始终使用最新版本。 文件 使用以下命令

  • (...)“m”不约束类型(...)

  • 当尝试使用Quarkus Qute Typesafe模板和Kotlin(按照下面的代码将静态类转换为对象)时,我在运行时遇到一个UnsatisfiedLinkError。 有争议的代码:

  • 我正在使用Weblogic 12.2.1.3.0,我想知道是否可以使用CDI 2.0。我的豆子。xml如下所示: