4

我想自动转义所有模板变量,即我希望它们被转义而不必一直写|escape。因此我启用了该$escape_html选项。

然而,显然 Smarty 处理使用{capture}相同方式创建的变量,即使这些可以被视为可信输入。我们的代码库中有很多这样的代码,nofilter到处都写几乎和写一样烦人|escape

当然必须有解决方案吗?还是$escape_html{capture}不兼容?

4

1 回答 1

3

$escape_html并且{capture}根据定义并非不兼容,不。

$escape_html(以及{setfilter}default_modifiers)遭受不知道变量上下文的问题。只要应该输出变量,就会执行它们。没有“那个变量从哪里来”跟踪,这将允许 Smarty 编译器实现“嘿,变量 $foo 是通过捕获定义的,因此已经被转义,不要再转义了”。考虑到诸如“在 javascript 的捕获组转义中,生成的字符串转义为 html”之类的场景时,情况会变得更糟。

现在你的选择相当有限:

  1. |逃避一切需要逃避的东西
  2. nofilter 所有不应该被转义的东西(再次)

我将与 Smarty 的编译器维护人员讨论这个问题,以找出我们可以做的事情。但是,如果我们找到解决方案,它将在 Smarty 3.2 中引入——最早的。所以现在,手动转义/无过滤器。

于 2012-07-11T10:41:21.917 回答