11.4. Zend_Filter_Input

11.4.1. 導入

Zend_Filter_Input は、 入力フィルタリングを行うための構造化された機能を提供します。 さまざまな目的のために使用可能です。なぜなら、これは以下の 三種類の異なるグループにとっての要求を満たすものだからです。

  • 開発者

    何もしないことに比べたら、 入力のフィルタリングが簡単なことであるはずがありません。 しかし開発者としては、 コードを不必要に複雑にすることなしにデータの完全性を保証する必要があります。

  • 管理者

    大規模な開発者グループを管理しなければならない管理者は、 Zend_Filter_Input を使用することにより、 生の入力データへのアクセスを制限/排除して、 入力フィルタリングのための構造化されたアプローチを実施することができます。

  • 監査者

    アプリケーションのコードを監査する際には、 開発者が生の入力データをそのまま使用していないかどうかを、 すばやく確実に調べる必要があります。 わかりやすいコードを書けるようになるという Zend_Filter_Input の特性により、もし通常とは異なるアプローチをとっていれば、 監査者はすぐにそれを識別できるようになるでしょう。

入力のフィルタリングにはさまざまな手法があり、 PHP 開発者が使用できる機能にもさまざまなものがあります。 ホワイトリストフィルタリング、ブラックリストフィルタリング、 正規表現、条件文、通常の PHP 関数、…これらは、 いろいろあるうちのほんの一部に過ぎません。

11.4.2. 動作の原理

入力フィルタリングについての構造化された手段を提供するために、 デフォルトでは、Zend_Filter_Input 入力データへのアクセスを制御しようとします。これは、 もとのデータ配列への参照を null に設定することで行います。

デフォルトの (厳格な) 方法は、 ひとつの引数をコンストラクタに渡します。この引数は、 フィルタリングするデータの配列です。フィルタリングされていないデータには getRaw() メソッドでしかアクセスできません。

<?php
// $_POST['email'] === 'webmaster@example.com'

// $_POST データの配列をフィルタリングします
require_once 'Zend/Filter/Input.php';
$filterPost = new Zend_Filter_Input($_POST);

// これで、$_POST は null となります
echo null === $_POST ? 'yes' : 'no'; // 'yes' と表示されます

// 生のメールアドレスを取得します
echo $filterPost->getRaw('email'); // 'webmaster@example.com' と表示されます

Zend_Filter_Input は、渡された配列 ($_POST) の内容を null に設定します。つまり、 直接アクセスすることができなくなります (生のデータにアクセスするには getRaw() メソッドを使用します。 このメソッドの使用状況をチェックしたり、使用を避けたりするのが簡単になります)。

オプションの (厳格でない) 方法は、コンストラクタの二番目の引数に false を渡します。

<?php
// $_POST['email'] === 'webmaster@example.com'

// $_POST データの配列をフィルタリングします
require_once 'Zend/Filter/Input.php';
$filterPost = new Zend_Filter_Input($_POST, false);

// $_POST は null にはなりません
echo null === $_POST ? 'yes' : 'no'; // 'no' と表示されます

// 生のメールアドレスを取得します
echo $filterPost->getRaw('email'); // 'webmaster@example.com' と表示されます

フィルタの使用法はまったく同じですが、Zend_Filter_Input は元の配列 ($_POST) の内容を null に設定しません。つまり、その後も直接そこにアクセスできるようになります。 この方式はお勧めしません。厳格な方式を使用するようにしましょう。

Zend_Filter_Input は、配列を念頭において設計されています。 入力の多くは PHP のスーパーグローバル配列 ($_GET$_POST$_COOKIE など) で網羅されており、たいていの入力の保存形式は配列構造となっています。 スカラーに対するフィルタリングをしたい場合は 章 11. Zend_Filter を参照ください。