入力チェックを行いたい場合、自前で判定処理作るのが常というのはありますが、PHPはFilter関数と呼ばれる言語自体に用意された、検証とサニタイズを行う機能があります。ちなみに検証とサニタイズの定義は下記ということになっています。
データの検証=データが適切な形式であるかどうかを判断。
データのサニタイズ=データから不正な文字を削除。
PHP Filter 関数
PHP Filter関数は、外部からの入力を検証およびサニタイズするために使用します。
PHP のFilter拡張機能は、ユーザーの入力をチェックするために必要な機能を備えており、 データの検証をより簡単かつ迅速に行うように設計されています。
filter_list()関数を使用すると、PHPが言語として提供しているPHP Filter拡張機能のリスト一覧を確認できます。
なぜフィルターを使用するのか?
多くのWebアプリケーションは外部入力を受けて成立します。そのためPHPは自身でそれを補完出来る機能を提供したわけです。条件によっては結構使えるので検討して見るのも良いでしょう。
想定している外部入力とデータは次のとおりです。
- 入力フォームからのユーザー入力
- Cookies
- Webサービスのデータ
- Server変数
- データベースクエリの結果
PHP filter_var() 関数
filter_var()関数は、データの検証とサニタイズの両方を行い、指定されたフィルタを用いて指定した変数をフィルタリングします。この関数は2つのデータを受け取ります。
- チェックしたい変数
- 使用するチェックの種類
文字列のサニタイズ
filter_var()関数を使って、文字列からすべてのHTMLタグを削除します。
<?php $str = "<h1>Hello World!</h1>"; $newstr = filter_var($str, FILTER_SANITIZE_STRING); var_dump($newstr); //Hello World!
整数の検証
次の例では、filter_var()関数を使って、変数$target_numが整数であるかどうかを調べています。
以下のコードの例だと、$target_num が整数であれば"Integer is valid" となり、$target_numが整数でない場合、"Integer is not valid"と出力されます。
<?php
$target_num = 100;
if (!filter_var($target_num, FILTER_VALIDATE_INT) === false) {
var_dump("Integer is valid");
} else {
var_dump("Integer is not valid");
}
//string(16) "Integer is valid"
Tip: filter_var()と0の問題
0の扱いが独特なため、上の例では、$target_numが0に設定されていた場合、"Integer is not valid"を返してしまいます。この問題を解決するには以下の記述を使用します。
<?php
$target_num = 0;
if (filter_var($target_num, FILTER_VALIDATE_INT) === 0 || !filter_var($target_num, FILTER_VALIDATE_INT) === false) {
var_dump("Integer is valid");
} else {
var_dump("Integer is not valid");
}
//string(16) "Integer is valid"
IPアドレスの検証
filter_var() 関数を使用して、変数$ipが有効なIPアドレスであるかどうかを調べます。
<?php
$ip = "127.0.0.1";
if (!filter_var($ip, FILTER_VALIDATE_IP) === false) {
var_dump("$ip is a valid IP address");
} else {
var_dump("$ip is not a valid IP address");
}
//string(31) "127.0.0.1 is a valid IP address"
メールアドレスのサニタイズと検証
まず$email_address変数から不正な文字をすべて取り除き、次に$emailが有効なメールアドレスであるかどうかをチェックします。
<?php
$email_address = "john.wick@example.com";
// Remove all illegal characters from email
$email = filter_var($email_address, FILTER_SANITIZE_EMAIL);
// Validate e-mail
if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
var_dump("$email is a valid email address");
} else {
var_dump("$email is not a valid email address");
}
//string(46) "john.wick@example.com is a valid email address"
URLのサニタイズとバリデーション
まず$target_url変数から不正な文字をすべて削除し、次に$urlが有効なURLであるかどうかを調べます。
<?php
$target_url = "https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8";
// Remove all illegal characters from a url
$url = filter_var($target_url, FILTER_SANITIZE_URL);
// Validate url
if (!filter_var($url, FILTER_VALIDATE_URL) === false) {
var_dump("$url is a valid URL");
} else {
var_dump("$url is not a valid URL");
}
//string(99) "https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8 is a valid URL"