【问题标题】:FreeMarker how to pass variable into another variable?FreeMarker 如何将变量传递给另一个变量?
【发布时间】:2021-09-28 17:11:26
【问题描述】:

我使用FreeMarker 作为模板系统,它工作正常,但我很难在另一个变量中定义变量。

这是我的模板示例

<body>
Hello my ${friend}
</body>

我的朋友变量应该由另一个变量组成,例如:

data.put("id", "001");
data.put("friend", "FRIENDNAME ${id}");

Writer out = new StringWriter();
template.process(data, out);
String html = out.toString();

现在我的输出(如预期)包括变量

<body>
Hello my FRIENDNAME ${id}
</body>

我怎样才能解决这个问题,所以我的结果是

<body>
Hello my FRIENDNAME 001
</body>

我尝试处理结果两次,但没有成功,我认为必须有更好的方法来解决它。在文档中也找不到此类信息。

谢谢。

【问题讨论】:

    标签: java freemarker


    【解决方案1】:

    在您的示例中,您放入数据模型的值本身就是一个模板。但是 FreeMarker 永远不会自动解释您在 String 中输入的内容。那将是非常危险的(代码注入)。所以你必须在模板中明确要求:

    Hello my <@friend?interpret/>!
    

    但考虑谁能设置friend 的值。 FreeMarker 模板可以调用暴露的 Java 对象的公共方法,可以运行长循环等。因此,如果恶意用户可以指定 friend 的值,他们可以使用它进行攻击。

    【讨论】:

      【解决方案2】:

      您可以使用interpret 来执行此操作,它告诉 FM 引擎对给定字符串(“id”属性的值)进行额外评估

      所以不是

      data.put("friend", "FRIENDNAME ${id}");
      

      你应该使用

      data.put("friend", "FRIENDNAME <@id?interpret/>");
      

      【讨论】:

      • 试过了,但没用,不过我会检查一下关于解释的更多信息。
      • put 调用的两个示例具有完全相同的问题:字符串值不会被解释为模板,无论您在其中输入什么棘手的值。如果它们被解释,这将是一个漏洞。
      猜你喜欢
      • 1970-01-01
      • 2011-04-27
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 2014-04-02
      • 1970-01-01
      • 2019-02-01
      相关资源
      最近更新 更多