当你有非可信任的第三方来编辑模板时,比如说通过FTP编辑,安全机制可以帮助你通过 模板语言的限制,来减少可能对系统安全产生的危害。
安全机制可以通过Smarty_Security对象的属性来进行设置。 这里是允许的设置:
$php_handling
明确定义了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
是安全模板目录的数组。
$template_dir
同样也被看作安全的目录。
默认这是空的数组。
$trusted_dir
是可信任目录的数组。
信任目录可以允许你存放PHP文件,这些PHP文件可以通过
{include_php}
包含到模板中,
并且直接运行。
默认这是空的数组。
$trusted_uri
是一个包含了匹配URL的正则表达式的数组,这些URL都被认为是可信的。
这个安全功能用于
{fetch}
和
{html_image}
。
在这些函数内使用的URL,必须类似{$PROTOCOL}://{$HOSTNAME}
的格式,
并且可以使用一些简单的正则表达式。
(不包括一些极端的例子如authentication-tokens)
正则表达式'#https?://.*smarty.net$#i'
将允许下面的URL:
http://smarty.net/foo
http://smarty.net/foo
http://www.smarty.net/foo
http://smarty.net/foo
https://foo.bar.www.smarty.net/foo/bla?blubb=1
但不允许以下的URL:
http://smarty.com/foo
(不匹配顶级域名"com")
ftp://www.smarty.net/foo
(不匹配协议"ftp")
http://www.smarty.net.otherdomain.com/foo
(不匹配域名"smarty.net")
$static_classes
是一个包含了可信的静态类的数组。
默认是空数组,表示信任任何的静态类。
设置不信任全部静态类可以设置$static_classes = null。
$php_functions
是一个包含了可用的PHP函数的数组,这些函数可以在模板内直接使用。
空数组 ( $php_functions = array() ) 表示全部PHP函数都是可用的。
设置全部函数不可用,需要设置$php_functions = null。
默认值是array('isset', 'empty', 'count', 'sizeof', 'in_array', 'is_array','time','nl2br')。
$php_modifiers
是一个包含了可用的PHP函数的数组,这些函数可以在模板内当作修饰器来使用。
空数组 ( $php_functions = array() ) 表示全部PHP函数修饰器都是可用的。
设置全部函数修饰器不可用,需要设置$php_modifier = null。
默认值是array('escape','count')。
$streams
是一个包含了可用数据流的数组,这些数据流可以直接在模板内使用。
空数组 ( $streams = array() ) 表示全部数据流都是可用的。
设置全部数据流不可用,需要设置$streams = null。
默认值是array('file')。
$allowed_modifiers
是一个包含了可用的(注册的/自动加载的)修饰器数组。
如果非空,则只有列表上的修饰器才能使用。这是一个白名单。
$disabled_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 类来设置安全策略
<?php require 'Smarty.class.php'; class My_Security_Policy extends Smarty_Security { // 关闭全部PHP函数 public $php_functions = null; // 删除PHP标签 public $php_handling = Smarty::PHP_REMOVE; // 允许任何函数成为修饰器 public $modifiers = array(); } $smarty = new Smarty(); // 开启自定义安全机制 $smarty->enableSecurity('My_Security_Policy'); ?>
Example 17.2. 通过Smarty_Security类的实例来自定义安全策略
<?php require 'Smarty.class.php'; $smarty = new Smarty(); $my_security_policy = new Smarty_Security($smarty); // 关闭全部PHP函数 $my_security_policy->php_functions = null; // 删除PHP标签 $my_security_policy->php_handling = Smarty::PHP_REMOVE; // 允许任何函数成为修饰器 $my_security_policy->$modifiers = array(); // 开启自定义安全机制 $smarty->enableSecurity($my_security_policy); ?>
Example 17.3. 开启默认的安全设置
<?php require 'Smarty.class.php'; $smarty = new Smarty(); // 开启默认安全设置 $smarty->enableSecurity(); ?>
安全机制只会在模板编译时进行检查。 所以当你修改了安全设置后,必须删除全部缓存和编译文件并重新编译。