安全

安全机制可以通过Smarty_Security对象的属性来进行设置。 这里是允许的设置:

  • 明确定义了Smarty如何处理内嵌到模板的PHP代码: 可用值是:
  • Smarty::PHP_PASSTHRU -> 原样显示PHP代码

  • Smarty::PHP_QUOTE -> 将PHP代码转换成HTML实体显示

  • Smarty::PHP_REMOVE -> 删除PHP代码

  • Smarty::PHP_ALLOW -> 执行PHP代码

默认值是Smarty::PHP_PASSTHRU。

如果安全机制开启,Smarty对象的$php_handling设置将不会被检查。

  • $secure_dir是安全模板目录的数组。 同样也被看作安全的目录。 默认这是空的数组。

  • $trusted_dir是可信任目录的数组。 信任目录可以允许你存放PHP文件,这些PHP文件可以通过 {include_php}包含到模板中, 并且直接运行。 默认这是空的数组。

但不允许以下的URL:

  • $static_classes是一个包含了可信的静态类的数组。 默认是空数组,表示信任任何的静态类。 设置不信任全部静态类可以设置$static_classes = null。

  • $php_modifiers是一个包含了可用的PHP函数的数组,这些函数可以在模板内当作修饰器来使用。 空数组 ( $php_functions = array() ) 表示全部PHP函数修饰器都是可用的。设置全部函数修饰器不可用,需要设置$php_modifier = null。默认值是array('escape','count')。

  • $streams是一个包含了可用数据流的数组,这些数据流可以直接在模板内使用。 空数组 ( $streams = array() ) 表示全部数据流都是可用的。设置全部数据流不可用,需要设置$streams = null。默认值是array('file')。

  • $allowed_modifiers是一个包含了可用的(注册的/自动加载的)修饰器数组。 如果非空,则只有列表上的修饰器才能使用。这是一个白名单。

  • $allowed_tags是一个控制哪些区块标签、函数和过滤器能够在模板内使用的数组。 如果非空,则只有列表上的标签才能使用。这是一个白名单。

  • $disabled_tags是一个包含了不可用的区块标签、函数和过滤器的数组。

  • $allow_constants布尔值,代表了是否允许在模板内使用常量。 默认是true。

  • $allow_super_globals布尔值,代表了是否允许在模板内使用PHP的全局变量。 默认是true。

  • $allow_php_tag布尔值,代表了是否允许在模板内使用{php} 和 {include_php}标签。 默认是false。

如果安全机制开启,私有的成员方法、静态类/对象的私有函数或者私有属性都不能在模板内使用。

自定义你自己的安全策略,可以扩展继承Smarty_Security类或者是建立它的实例。


Example 17.1. 扩展Smarty_Security 类来设置安全策略


Example 17.2. 通过Smarty_Security类的实例来自定义安全策略


Example 17.3. 开启默认的安全设置

安全机制只会在模板编译时进行检查。 所以当你修改了安全设置后,必须删除全部缓存和编译文件并重新编译。