入力データのバリデーションを簡単に 〜 Validate for PHP 0.7.0

(Last Updated On: 2018/10/02)

基本的にWebアプリへの入力データは全てバリデーションする必要があります。具体的には以下のような構造でバリデーションが必要です。

Webアプリへの入力データの種類は大抵の場合、数百程度です。Validate for PHPはこれらの入力仕様を定義すれば、アプリケーション内で繰り返し同じ入力仕様をバリデーションできるように作られています。

Validate for PHPのスクリプト版をPre Alphaとしてリリースします。このブログのGitHubリポジトリのリンクは0.7.0ブランチに向いています。開発版はmasterブランチを参照してください。

基本的な使い方

  • 入力データ仕様($spec)を配列として定義する
  • validate()で入力データ($inputs)を入力データ仕様($spec)に適合しているかバリデーションする
  • validate()からバリデーション済みのデータが返される。アプリはこれを使う。

デフォルトでは仕様外の入力データにはInvalidArgumentExceptionを発生させます。フォームデータバリデーションで例外は困ります。例外を無効化することもできます。オプションの数はそれなり在ります。REFERENCE.mdを参照してください。

$inputsが配列の場合、バリデーション済みの要素は削除されます。

  • validate()に使った後の$inputsに「未検証」のデータのみ残る

この動作により、複数のバリデーションを行いデータを検証できます。つまり、全ての入力データをバリデーションできるように設計されています。

例1: 一つ一つデータをバリデーションする

MVCのコントローラーなどでバリデーションする場合(ユーザーとのやり取りが必要ない場合)のバリデーションに利用できます。

Webアプリの入力データにはHTTPヘッダー、GET、POSTがあり、さらに$_COOKIEの中身もチェックする必要があります一つ一つ指定するのは面倒です。後でまとめて一気にチェックする例を紹介します。

例2: フォームなどの入力をチェックする

1つ注意点があります。validate_get_status()は最後のバリデーションのステータスを返します。同じ$ctx(未初期化だと自動初期化。最初のvalidate()呼び出しで初期化されている)を使っているので、2回目のvalidate()呼び出しの結果がvalidate_get_status()で分かります。

あまり良くない例なので、後で修正します。

$ctxが同じなのでvalidate()で発生したエラーやエラーメッセージは$ctxの中に保存されます。validate_get_user_errors($ctx)の配列の中身を見るとエラー発生状況が分かります。

一度にまとめてバリデーションするとvalidate_get_status()で全体のバリデーション状態を確認できます。

例3: まとめてバリデーションする

一つ一つ変数をバリデーションするのは非効率です。エントリポイント毎にまとめる、フォームごとにまとめないと管理が大変です。「まとめて管理する」はとでも重要です。Validate for PHPの場合、これが容易です。

複雑なバリデーションが必要な場合もあります。PHP関数のコールバックで「普通のPHPコード」でバリデーションルールが記述できます。APIの使い方を覚える必要もありません。

バリデーションルールは「PHPの配列」その物です。新しい文法/構文を覚える必要もありません。意味と種類を知るだけで使えます。ルールを作る為に変換したり、コードを実行する必要もないので効率も良いです。

例4: 余分なパラメーターをバリデーションする

$_GETやHTTPヘッダーにはアプリケーションでは直接は使っていない余計なパラメーターが含まれている事があります。validate()はバリデーション済みの値を戻り値として返します。余計なパラメーターがあっても、完全に無視することもできます。

しかし、OWASP TOP 10 A10:2017では上記のような動作をするアプリは脆弱なアプリである、としています。余分なパラメーターを含め、全てバリデーションします。様々なバリデーション方法があるのですが、先ずは基本パターンのみ紹介します。

これはHTTPヘッダーのみの例でしたが、$GET、$_POST、$_COOKIE、$_FILESなどに対して同じような仕組みで全ての入力データをバリデーション可能になります。

まとめ

1つのリクエストの入力は多くても数十でしょう。アプリケーションへの入力種別は大抵の場合は数百程度まででしょう。

バリデーションルール仕様の定義は細かいので煩雑に見えるかも知れません。しかし、細かいルールの定義は1回&1箇所にまとめることができます。実際にコントローラーやフォームなどで使う際には、単純かつ解りやすい一次元配列になります。

Validate for PHPは配列でバリデーションルールを定義できるので、使いまわしが簡単です。

  1. アプリケーションへの各入力データの仕様を全て定義する配列を作る(この部分は煩雑に見える)
  2. 上記の仕様を使い、配列で各エントリポイント(MVCならコントローラー)の入力データ仕様を定義する(ここは単純な一次元配列)
  3. validate()でバリデーションする(基本、呼ぶだけ)

これでアプリケーションレベルの入力データバリデーションが完璧に行えます。

Validate for PHPはフォームデータのバリデーションや出力データのバリデーションにも使えます。

バリデーションはアプリケーション機能とは独立して追加できるので、足りていない所に追加すると良いでしょう。

を読めば基本的な使い方をマスターできると思います。

参考

Facebook Comments
Pocket