Java中安全的模板引擎有哪些?

5

我正在寻找一个Java模板引擎,可以禁止在模板中执行代码,只允许使用标签。

在完美的世界中,我会寻找类似于Jinja2(或Django模板引擎)的等价物。 基于Django,我会自己创建模板标签,但用户不能创建模板标签(通过执行代码)。

我将在Play!框架中实现它。

谢谢您的帮助!


我认为Freemarker是Java的模板引擎(语法不像Django),但它在MVC世界中提供了视图分离原则:http://freemarker.org/docs/dgui_quickstart_basics.html - MBarsi
在Django的模板引擎中,您可以编写自己的标签,有效地允许任意代码执行(前提是它是在自定义标签中编写的)。这是否是预期的行为,或者应该仅限于一组内置标签? - André Caron
1
Freemarker允许在模板中编写代码,但对于这些要求来说并不是一个好建议。 - user177800
@André Caron:我回答了你的问题 :)(我想)。 - Cyril N.
可能是Java模板引擎的建议?的重复问题。 - ripper234
3个回答

6

StringTemplate 是您要寻找的。

它的独特特点是严格执行模型-视图分离,与其他引擎不同。严格的分离使网站和代码生成器更加灵活和可维护;它还提供了对恶意模板作者的出色防御。


3
有“恶意模板作者”这种东西?是谁允许随意用户编写模板? - André Caron
1
想象一下使用模板而不是SQL的注入攻击向量。任何使用模板系统生成页面并允许在模板中包含可执行代码指令的网站都容易受到恶意攻击的威胁。 - user177800
1
像Tumblr、Posterous这样的网站,允许用户更改模板。然后,每个人都可以成为“恶意模板作者” :) - Cyril N.

1

从您的需求来看,似乎您只需要一个模板引擎,它不允许类似于JSP脚本(在<%和%>之间)的任何内容,并且仅基于标签和/或属性...

如果是这样,我想建议您使用Thymeleaf http://www.thymeleaf.org(这里是与JSP的比较),我是它的作者。但如果我没错的话,这些要求也可以通过Velocity http://velocity.apache.org 来实现,所以由您来选择!


Thymeleaf很笨重且很难适应,因为它与标记嵌入的方式。此外没有默认继承,必须使用宏,然后调用宏,这是不直观的。 - TheRealChx101

1
如果您想提供一种简单的方式来修改模板,而不需要了解数百个自定义标记,并实现一个明确定义的功能以便进行访问,同时又可自由呈现它,那么您应该考虑使用被动模板。这样可以确保不会添加恶意代码:) 在Java中具有被动模板的强大引擎是Snippetory。但是,如果您想要控制访问,则访问控制也是一个不错的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接