我想自动转义所有模板变量,即我希望它们被转义而不必一直写|escape
。因此我启用了该$escape_html
选项。
然而,显然 Smarty 处理使用{capture}
相同方式创建的变量,即使这些可以被视为可信输入。我们的代码库中有很多这样的代码,nofilter
到处都写几乎和写一样烦人|escape
。
当然必须有解决方案吗?还是$escape_html
和{capture}
不兼容?
$escape_html
并且{capture}
根据定义并非不兼容,不。
$escape_html
(以及{setfilter}和default_modifiers)遭受不知道变量上下文的问题。只要应该输出变量,就会执行它们。没有“那个变量从哪里来”跟踪,这将允许 Smarty 编译器实现“嘿,变量 $foo 是通过捕获定义的,因此已经被转义,不要再转义了”。考虑到诸如“在 javascript 的捕获组转义中,生成的字符串转义为 html”之类的场景时,情况会变得更糟。
现在你的选择相当有限:
我将与 Smarty 的编译器维护人员讨论这个问题,以找出我们可以做的事情。但是,如果我们找到解决方案,它将在 Smarty 3.2 中引入——最早的。所以现在,手动转义/无过滤器。