Smarty 图标

根据商标声明,您可以使用 Smarty 徽标。

Smarty Template Engine Smarty Template Engine

对于赞助、广告、新闻或其他询问,请通过联系我们:

使用 Smarty 的网站

广告

第 17 章。高级功能

安全性

在不信任方通过 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();
?>


注意

必须在编译模板时检查安全策略设置。当更改安全设置时,应删除所有缓存和编译模板文件。