filter_var() / filter_input()
| 対応: | PHP 5.2(2006) |
|---|
入力値のバリデーションやサニタイズを行う関数です。外部から受け取ったデータの安全性を確保するために使用します。
構文
// 変数にフィルターを適用する filter_var($value, $filter, $options); // $_GET, $_POST, $_COOKIE 等から値を取得してフィルターを適用する filter_input($type, $var_name, $filter, $options);
関数一覧
| 関数 | 概要 |
|---|---|
| filter_var($value, $filter, $options) | 変数にフィルターを適用し、バリデーションやサニタイズを行います。バリデーション失敗時は『false』を返します。 |
| filter_input($type, $var_name, $filter, $options) | 外部入力をフィルター付きで取得します。第1引数には『INPUT_GET』『INPUT_POST』『INPUT_COOKIE』などを指定します。 |
主なバリデーションフィルター
| フィルター | 概要 |
|---|---|
| FILTER_VALIDATE_EMAIL | メールアドレスの形式を検証します。 |
| FILTER_VALIDATE_URL | URLの形式を検証します。 |
| FILTER_VALIDATE_IP | IPアドレスの形式を検証します。『FILTER_FLAG_IPV4』『FILTER_FLAG_IPV6』でバージョンを限定できます。 |
| FILTER_VALIDATE_INT | 整数値を検証します。オプションで最小値・最大値の範囲を指定できます。 |
| FILTER_VALIDATE_FLOAT | 浮動小数点数を検証します。 |
| FILTER_VALIDATE_BOOLEAN | 真偽値を検証します。『true』『yes』『on』『1』を『true』として認識します。※ 文字列 'false' を渡すと true ではなく null が返ります。直感に反する挙動なので注意してください。 |
| FILTER_VALIDATE_DOMAIN | ドメイン名の形式を検証します。PHP 7.0 以降で利用可能です。 |
主なサニタイズフィルター
| フィルター | 概要 |
|---|---|
| FILTER_SANITIZE_EMAIL | メールアドレスとして不正な文字を除去します。 |
| FILTER_SANITIZE_URL | URLとして不正な文字を除去します。 |
| FILTER_SANITIZE_NUMBER_INT | 数字、プラス記号、マイナス記号以外の文字を除去します。 |
| FILTER_SANITIZE_NUMBER_FLOAT | 数字、プラス記号、マイナス記号、ピリオド以外の文字を除去します。 |
| FILTER_SANITIZE_SPECIAL_CHARS | HTMLの特殊文字をエンコードします。 |
| FILTER_SANITIZE_ADD_SLASHES | 『addslashes()』と同等の処理を行います。PHP 8.1 で『FILTER_SANITIZE_STRING』の代替として追加されました。 |
サンプルコード
sample_filter_var.php
<?php
// メールアドレスのバリデーション
$email = "user@wp-p.info";
if (filter_var($email, FILTER_VALIDATE_EMAIL) !== false) {
echo "有効なメールアドレスです。\n"; // 検証に通る
}
// 不正なメールアドレスの場合は false が返される
var_dump(filter_var("not-an-email", FILTER_VALIDATE_EMAIL)); // 『bool(false)』と出力される
// URLのバリデーション
$url = "https://wp-p.info";
if (filter_var($url, FILTER_VALIDATE_URL) !== false) {
echo "有効なURLです。\n";
}
// 整数値のバリデーションで範囲を指定する
$age = "25";
$options = ['options' => ['min_range' => 0, 'max_range' => 150]];
$valid_age = filter_var($age, FILTER_VALIDATE_INT, $options);
if ($valid_age !== false) {
echo "年齢: " . $valid_age . "\n"; // 『年齢: 25』と出力される
}
// IPアドレスのバリデーション
var_dump(filter_var("192.168.1.1", FILTER_VALIDATE_IP)); // 『string(11) "192.168.1.1"』と出力される
var_dump(filter_var("999.999.999.999", FILTER_VALIDATE_IP)); // 『bool(false)』と出力される
// filter_input() で $_GET の値を安全に取得する
$page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, [
'options' => ['min_range' => 1, 'default' => 1]
]);
// サニタイズの例
$dirty_email = "user<script>@wp-p.info";
$clean = filter_var($dirty_email, FILTER_SANITIZE_EMAIL);
echo $clean . "\n"; // 『userscript@wp-p.info』と出力される。『<』と『>』は除去されるが、テキスト(script)は残る
// 数値のサニタイズ
$price_input = "¥1,980円";
$number = filter_var($price_input, FILTER_SANITIZE_NUMBER_INT);
echo $number . "\n"; // 『1980』と出力される
filter_var.php
php filter_var.php 有効なメールアドレスです。 bool(false) 有効なURLです。 年齢: 25 string(11) "192.168.1.1" bool(false) userscript@wp-p.info 1980
概要
『filter_var()』はPHPに組み込まれたバリデーション・サニタイズ関数です。外部から受け取るすべてのデータは信頼できないため、処理前に必ずバリデーションを行ってください。メールアドレス、URL、IPアドレス、整数値など、よく使う形式の検証が標準で用意されています。
バリデーションフィルターは値が正しい形式かどうかを判定し、不正な場合は『false』を返します。サニタイズフィルターは不正な文字を除去して安全な値に変換します。一般的にはまずサニタイズを行い、その後にバリデーションで確認する流れが推奨されます。
『filter_input()』は『$_GET』や『$_POST』を直接参照する代わりに、フィルター付きで値を取得できるためより安全です。なお、『FILTER_SANITIZE_STRING』はPHP 8.1で非推奨となりました。HTMLエスケープには『htmlspecialchars()』、パスワードのハッシュ化には『password_hash()』を使用してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。