Table of Contents
セキュリティ機能は、信頼できないメンバーに ftp 経由などでテンプレートを編集させたりするときに便利です。 また、テンプレート言語からシステムに関する情報が漏れるリスクを軽減させるためにも使えます。
セキュリティポリシーの設定は、Smarty_Security クラスのインスタンスのプロパティで行います。 次のような設定が可能です。
$php_handling は、テンプレートに埋め込まれた PHP のコードを
Smarty がどのように処理するかを設定します。設定できる値は次のいずれかです。
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 は、信頼済みとみなされるすべてのディレクトリの配列です。
信頼済みのディレクトリには、テンプレートから
{include_php}
で読み込んで直接実行する PHP スクリプトを置きます。デフォルトは空の配列です。
$static_classes は、信頼済みとみなされるクラスの配列です。
デフォルトは空の配列で、これはすべての static クラスへのアクセスを許可します。
すべての static クラスへのアクセスを無効にするには
$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') です。
$allow_constants は boolean のフラグで、
テンプレートから定数にアクセスできるかどうかを指定します。
デフォルトは "true" です。
$allow_super_globals は boolean のフラグで、
テンプレートから PHP のスーパーグローバル変数にアクセスできるかどうかを指定します。
デフォルトは "true" です。
$allow_php_tag は boolean のフラグで、
テンプレートから {php} タグや {include_php} タグを使えるかどうかを指定します。
デフォルトは "false" です。
セキュリティを有効にすると、private なメソッドや関数、static クラスやオブジェクトのプロパティへの テンプレートからの (先頭に '_' をつけた) アクセスができなくなります。
セキュリティポリシーの設定をカスタマイズするには、Smarty_Security クラスを継承したクラスを作るかこのクラスのインスタンスを作成します。
Example 15.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 15.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 15.3. デフォルト設定でのセキュリティの有効化
<?php require 'Smarty.class.php'; $smarty = new Smarty(); // デフォルトのセキュリティを有効にします $smarty->enableSecurity(); ?>
セキュリティポリシーの設定をチェックするのは、テンプレートがコンパイルされるときだけです。 したがって、セキュリティの設定を変更したときには キャッシュやコンパイル済みのテンプレートファイルをすべて削除しなければなりません。