我想自动转义所有模板变量,也就是说,我希望它们能够被转义,而不必一直写|escape
。因此,我启用了$escape_html
选项。
然而,显然Smarty以相同的方式处理使用{capture}
创建的变量,即使这些变量可以被视为可信输入。我们的代码库中有很多这些代码库,不得不在任何地方写nofilter
几乎和写|escape
一样烦人。
当然必须有解决方案吗?或$escape_html
和{capture}
不兼容?
答案 0 :(得分:3)
$escape_html
和{capture}
并不相容,不。
$escape_html
(以及{setfilter}和default_modifiers)遭遇不知道变量上下文的问题。只要输出变量,就会执行它们。没有“变量来自哪里”跟踪,这将允许Smarty编译器实现“嘿,变量$ foo是通过捕获定义的,因此已经被转义,不再逃避它”。当考虑诸如“在javascript的捕获组转义中,结果字符串转义为html”之类的情况时,它甚至会变得更糟。
目前您的选择相当有限:
我将与Smarty的编译器维护者讨论这个问题,以弄清楚我们可以做些什么。但是,如果我们找到解决方案,它将与Smarty 3.2一起引入 - 最早的。所以现在,手动转义/ nofilter。