Smarty Icon

You may use the Smarty logo according to the trademark notice.

Smarty Template Engine Smarty Template Engine

For sponsorship, advertising, news or other inquiries, contact us at:

Sites Using Smarty

Advertisement

Chapter 15. 拡張機能

セキュリティ

セキュリティ機能は、信頼できないメンバーに 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();
?>


Note

セキュリティポリシーの設定をチェックするのは、テンプレートがコンパイルされるときだけです。 したがって、セキュリティの設定を変更したときには キャッシュやコンパイル済みのテンプレートファイルをすべて削除しなければなりません。