Smarty 是什么?
为什么使用它?
用例与工作流
语法比较
模板继承
最佳实践
速成教程
在不信任方通过 ftp 等编辑模板时,安全性非常有用,并且您想减少通过模板语言损害系统安全性的风险。
安全策略的设置由 Smarty_Security 类实例的属性定义。以下是可以用的设置
$php_handling
决定了 Smarty 如何处理嵌入在模板中的 PHP 代码。可能的值包括:
Smarty::PHP_PASSTHRU -> 原样回显 PHP 标签
Smarty::PHP_QUOTE -> 将标签转义为实体
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
是匹配被视为受信任的 URI 的一个正则表达式数组。此安全指令由 {fetch}
和 {html_image}
使用。传递给这些函数的 URI 会简化为 {$PROTOCOL}://{$HOSTNAME}
,以允许简单的正则表达式(而无需处理身份验证令牌等特殊情况)。
表达式 '#https?://.*smarty.net$#i'
将允许访问以下 URI
http://smarty.net/foo
http://smarty.net/foo
https://smarty.php.net/foo
http://smarty.net/foo
https://foo.bar.www.smarty.net/foo/bla?blubb=1
但拒绝访问以下 URI
http://smarty.com/foo
(末级域名未匹配“com”)
ftp://smarty.php.net/foo
(协议未匹配“ftp”)
https://smarty.php.ac.cn.otherdomain.com/foo
(末级域名未匹配“smarty.net”)
$static_classes
是包含已被视为可信的类的数组。默认值为空数组,允许访问所有静态类。若要禁用对所有静态类的访问权限,请将 $static_classes 设置为 null。
$php_functions
是包含已被视为可信并且可在模板中使用的 PHP 函数的数组。若要禁用对所有 PHP 函数的访问权限,请将 $php_functions 设置为 null。空数组( $php_functions = array() )将允许所有 PHP 函数。默认值为 array('isset', 'empty', 'count', 'sizeof', 'in_array', 'is_array','time','nl2br').
$php_modifiers
是包含已被视为可信并且可用作修饰符在模板中使用的 PHP 函数的数组。若要禁用对所有 PHP 修饰符的访问权限,请将 $php_modifier 设置为 null。空数组( $php_modifier = array() )将允许所有 PHP 函数。默认值为 array('escape','count').
$streams
是包含已被视为可信并且可在模板中使用的流的数组。若要禁用对所有流的访问权限,请将 $streams 设置为 null。空数组( $streams = array() )将允许所有流。默认值为 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 类或创建该类的实例。
示例 17.1。通过扩展 Smarty_Security 类设置安全策略
<?php require 'Smarty.class.php'; class My_Security_Policy extends Smarty_Security { // disable all PHP functions public $php_functions = null; // remove PHP tags public $php_handling = Smarty::PHP_REMOVE; // allow everthing as modifier public $modifiers = array(); } $smarty = new Smarty(); // enable security $smarty->enableSecurity('My_Security_Policy'); ?>
示例 17.2。通过 Smarty_Security 类实例设置安全策略
<?php require 'Smarty.class.php'; $smarty = new Smarty(); $my_security_policy = new Smarty_Security($smarty); // disable all PHP functions $my_security_policy->php_functions = null; // remove PHP tags $my_security_policy->php_handling = Smarty::PHP_REMOVE; // allow everthing as modifier $my_security_policy->$modifiers = array(); // enable security $smarty->enableSecurity($my_security_policy); ?>
示例 17.3。启用默认设置下的安全设置
<?php require 'Smarty.class.php'; $smarty = new Smarty(); // enable default security $smarty->enableSecurity(); ?>
必须在编译模板时检查安全策略设置。当更改安全设置时,应删除所有缓存和编译模板文件。