第17章 拡張機能

目次

セキュリティ
テンプレートでの設定の変更
テンプレートの継承
ストリーム
オブジェクト
static クラス
プリフィルタ
ポストフィルタ
アウトプットフィルタ

セキュリティ

セキュリティ機能は、信頼できないメンバーに 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 スクリプトを置きます。デフォルトは空の配列です。

  • $trusted_uri は、信頼済みとみなされる URI にマッチする正規表現の配列です。 このセキュリティディレクティブを使うのは、{fetch}{html_image} です。 これらの関数に渡す URI は {$PROTOCOL}://{$HOSTNAME} 形式に切り詰められるので、シンプルな正規表現にできます (認証トークンなどのエッジケースは気にしなくてもかまいません)。

    たとえば '#https?://.*smarty.net$#i' は、次の URI へのアクセスを許可します。

    • 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

    しかし、これらの URI にはアクセスできません。

    • http://smarty.com/foo (トップレベルドメイン "com" がマッチしない)

    • ftp://www.smarty.net/foo (プロトコル "ftp" がマッチしない)

    • http://www.smarty.net.otherdomain.com/foo (ドメインの最後が "smarty.net" にマッチしない)

  • $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') です。

  • $allowed_modifiers は (登録済み / autoload された) 修飾子の配列で、テンプレートから使うことができるものです。配列が空でない場合は、 ここで指定した修飾子だけが使えるようになります。これはホワイトリストです。

  • $disabled_modifiers は (登録済み / autoload された) 修飾子の配列で、テンプレートからは使えないものです。

  • $allowed_tags は (登録済み / autoload された) 関数、ブロックプラグイン、フィルタプラグインの配列で、テンプレートから使うことができるものです。 配列が空でない場合は、ここで指定した修飾子だけが使えるようになります。これはホワイトリストです。

  • $disabled_tags は (登録済み / autoload された) 関数、ブロックプラグイン、フィルタプラグインの配列で、テンプレートからは使えないものです。

  • $allow_constants は boolean のフラグで、 テンプレートから定数にアクセスできるかどうかを指定します。 デフォルトは "true" です。

  • $allow_super_globals は boolean のフラグで、 テンプレートから PHP のスーパーグローバル変数にアクセスできるかどうかを指定します。 デフォルトは "true" です。

  • $allow_php_tag は boolean のフラグで、 テンプレートから {php} タグや {include_php} タグを使えるかどうかを指定します。 デフォルトは "false" です。

セキュリティを有効にすると、private なメソッドや関数、static クラスやオブジェクトのプロパティへの テンプレートからの (先頭に '_' をつけた) アクセスができなくなります。

セキュリティポリシーの設定をカスタマイズするには、Smarty_Security クラスを継承したクラスを作るかこのクラスのインスタンスを作成します。

例 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');
?>

例 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);
?>

例 17.3. デフォルト設定でのセキュリティの有効化


<?php
require 'Smarty.class.php';
$smarty = new Smarty();
// デフォルトのセキュリティを有効にします
$smarty->enableSecurity();
?>

注意

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