php filter_input POST や GET などの変数をフィルタリングする
php filter_input POST や GET などの変数をフィルタリングする
mixed 変数の値 = filter_input(int $type, string $variable_name [, int $filter = FILTER_DEFAULT [, mixed $options ]]);
フィルタリングに失敗した場合 FALSE や NULL を返す
[ ]省略可
説明 | HTMLのフォームやURLから送信される POST や GET などの変数をフィルタリングする。フィルタリングとは見込んでいるデータかどうかチェックすることです。 | |
---|---|---|
引数 | int 必須 $type | 入力タイプを INPUT_GET、INPUT_POST、 INPUT_COOKIE、INPUT_SERVER か INPUT_ENV の何れかで指定します。これらは、$_GET(ゲット変数)、$_POST(ポスト変数)、$_COOKIE(グッキー変数)、$_SERVER(サーバー変数)、$_ENV(環境変数)のことです。 |
引数 | string 必須 $variable_name | フィルタリングする変数の名前です。 |
引数 | int $filter | 適用するフィルタの種類をIDで指定する。フィルタのIDは定数で用意されているので、こちらの一覧で確認してみましょう。検証用フィルタ、除去用フィルタ。省略した場合、FILTER_DEFAULT が適応されます。これは FILTER_UNSAFE_RAW と同等の意味になります。結果的に、デフォルトでは何もフィルタリングをしません。 |
引数 | mixed $options | オプションあるいはフラグの論理和の連想配列。オプションを指定可能なフィルタの場合、この配列の flags フィールドにフラグを指定します。 |
返り値 | mixed | フィルタリングに成功した場合は指定された変数の値を返します。失敗した場合に FALSE を返し、また、変数 variable_name が設定されていない場合には、 NULL を返します。 |
サンプル
1 2 3 4 5 6 | <?php $name = filter_input(INPUT_POST, 'name'); echo $name; //$_POST['name'] が存在しなくても echo $name がエラーを起こさない //通常、初期化されていない変数を扱うと PHP Notice: Undefined index が発生する ?> |
◆ 引数 や 返り値 のデータ型の説明
データ型 引数 や 返り値 のデータ型の説明引数 や 返り値 | 内容(引数 | 返り値) |
---|---|
string | 文字列型 を受け入れる。 | 文字列型 を返す。 |
int | 整数型 を受け入れる。 | 整数型 を返す。 |
float | 浮動小数点数型 を受け入れる。 | 浮動小数点数型 を返す。 |
bool | 論理型 を受け入れる。 | 論理型 を返す。 |
number | 整数型 または 浮動小数点数型 を受け入れる。 | 整数型 または 浮動小数点数型 を返す。 |
array | 配列型 を受け入れる。 | 配列型 を返す。 |
object | オブジェクト型 を受け入れる。 | オブジェクト型 を返す。 |
array|object | 配列型 または オブジェクト型 を受け入れる。 | 配列型 または オブジェクト型 を返す。 |
mixed | 複数の データ型 を受け入れる(パラメーター)、或いは、返す(返り値)ことが可能。全てのデータ型ではありません。例えば gettype()関数 は全ての型を受け入れますが、一方、str_replace()関数 は、文字列型 と 配列型 のみを受け入れます。また、reset()関数 や end()関数 は、返り値に 配列型 と 論理型(FALSE)を返します。 |
void | パラメータ一覧で void が使用されている場合、その関数がパラメータを受け付けないことを表します。 | 返り値の型が void である場合、返り値に意味がないことを表します。 |
callback | callback 疑似型がこのドキュメントで使われていたのは、PHP 5.4 で callable タイプヒントが導入される前のことでした。両者はまったく同じ意味です。 |
◆ php filter_input() 内容
HTMLのフォーム(formタグのinputタグなどで送信されるデータ)やURL(https://wepicks.net/?name=data&name=dataなどの形式で送信されるデータ)で送信された POST変数 や GET変数、また、SESSION変数 や COOKIE変数 などのスーパーグローバル変数をフィルタリングします。フィルタリングとは、対象の変数が存在するか、想定しているデータ型か、格納している値は予測している内容か、など、データ内容のチェックを行うことです。
この関数のパラメーター int $type で、INPUT_GET、INPUT_POST、 INPUT_COOKIE、INPUT_SERVER か INPUT_ENV の何れかを指定し、スーパーグローバル変数の $_GET(ゲット変数)、$_POST(ポスト変数)、$_COOKIE(グッキー変数)、$_SERVER(サーバー変数)、$_ENV(環境変数)のフィルタリングを行います。
int $filter = FILTER_DEFAULT で、どのようなフィルタリングを行うか指定します。例えば、 FILTER_VALIDATE_EMAIL は、メールアドレスが妥当な内容かどうか調べることが出来ます。検証フィルタや除去フィルタなど、さまざまな種類のフィルタが用意されています。以下の表で一部を紹介しているので、参照下さい。検証用フィルタ、除去用フィルタ。このパラメーター int $filter を省略した場合、FILTER_DEFAULT が適応されます。これは FILTER_UNSAFE_RAW が指定されるのと同一で、何もフィルタリングされません。
フィルタリングはプログラミングにおいて非常に重要な要素です。変数の内容は、それが想定されている情報である必要があり、それが、想定外の情報を格納している場合にそのまま処理してしまうと、バグや脆弱性につながります。例えば、メールアドレス情報を扱う GET や POST などの変数に、悪意のあるSQL文を入力され、それをフィルタリングせずに処理した場合、データベースへのハッキングにつながる可能性があります。SQLインジェクションなどと呼ばれます。
変数初期化のフィルタリングの例
フィルタリングの基本は変数の初期化です。変数を初期化することで、エラーやデータの汚染を防ぐことが出来ます。フィルタリングの詳細はこちらを参照下さい。
例えば、$_POST["name"] や $name を以下のように初期化されていない状態で扱うと、エラー PHP Notice: Undefined index が発生します。スクリプト上で存在していなかった変数を扱うと警告が発生するのです。
1 2 3 | $name = $_POST['name']; echo $name; //エラー PHP Notice: Undefined index |
これを防ぐために、変数の存在のチェックと変数の初期化を行います。
1 2 3 4 5 6 7 8 9 10 | <?php if(isset($_POST['name']) == true){ //$_POST['name'] の存在をチェックして存在していれば値を $name に格納 $name = $_POST['name']; } else{ //$_POST['name'] が存在していなければ変数 $name を作成して空の値を格納(=変数の初期化) $name = ''; } echo $name; ?> |
このように処理すれば $_POST["name"] が存在しなくても、$name は初期化され、エラーが発生しません。
filter関数はこのような変数の初期化処理をもっとシンプルに記述するこが出来ます。
1 2 | $name = filter_input(INPUT_POST, 'name'); echo $name; |
こちらでもエラーが発生せず、変数の初期化が可能です。
値 | if($var) | isset() | empty() | is_null() |
---|---|---|---|---|
$var = 1 | TRUE | TRUE | FALSE | FALSE |
$var = ""; | FALSE | TRUE | TRUE | FALSE |
$var = "0"; | FALSE | TRUE | TRUE | FALSE |
$var = 0; | FALSE | TRUE | TRUE | FALSE |
$var = NULL; | FALSE | FALSE | TRUE | TRUE |
$var | FALSE | FALSE | TRUE | TRUE |
$var = array() | FALSE | TRUE | TRUE | FALSE |
$var = array(1) | TRUE | TRUE | FALSE | FALSE |
メールアドレスをチェックするフィルタリングの例
さらに、パラメーターの int $filter でフィルタの種類を選択し、値をチェックすることが出来ます。例えば、FILTER_VALIDATE_EMAIL を指定すると、値がメールアドレスとして妥当な内容か調べることが出来ます。
入力フォームから $_POST["mail"] が送信され、その内容をチェックしたい場合。
入力フォーム
1 2 3 4 | <form action="#" method="post"> <input type="text" name="mail" /> <input type="submit" name="" value="送信"> </form> |
フォームの送信先でメールアドレスをチェックします。
1 2 | $mail = filter_input(INPUT_POST, 'mail', FILTER_VALIDATE_EMAIL); var_dump($mail); |
$_POST['mail'] が存在しない場合は NULL になります。
誤ったメールアドレスが入力された場合は、FALSE が返ります。
正しい書式のメールアドレスが入力された場合、変数の値が返ってきます。
if文で処理した場合の例です。
1 2 3 4 5 6 7 | <?php if($mail = filter_input(INPUT_POST, 'mail', FILTER_VALIDATE_EMAIL)){ echo "正しいメールアドレスです。:".$mail."<br>\n"; }else{ echo "誤ったメールアドレスです。<br>\n"; } ?> |
成功の場合
失敗の場合
誤ったメールアドレスです。
bool(false)
誤ったメールアドレスです。
パラメーターの mixed $options で細かくデータを判定
int $filter の種類によって様々な種類の mixed $options が用意されています。例えば、int $filter の一つである FILTER_VALIDATE_INT は、値が整数値であるかどうかを判定します。さらに、オプションで指定した範囲内にあるかどうかを検証することが出来ます。
以下の例ではフォームで送信される値が整数値の 0 ~ 9 であるかチェックします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <form action="" method="post"> <input type="text" name="integer" /> <input type="submit" name="" value="送信"> </form> <?php //オプションで数値範囲を 0 ~ 9 で指定する $options = array('options' => array('min_range' => 0, 'max_range' => 9)); //フィルタリング 成功の場合は変数の値を返し、失敗の場合 FALSE を返す //変数が存在しない場合は NULL $priority = filter_input(INPUT_POST, 'integer', FILTER_VALIDATE_INT, $options); //返り値の内容 var_dump($priority); echo "<br>\n"; //$priority は 整数値 か FALSE/NULL(0の場合もあるので注意) if($priority === false || $priority === NULL){ echo "誤った数値です。<br>\n"; }else{ echo "正しい数値です。".$priority."<br>\n"; } ?> |
$_POST['integer'] が存在しない場合は NULL になります。
誤った数値です。
誤ったデータが入力された場合は、FALSE が返ります。
誤った数値です。
正しい数値が入力された場合、変数の値が返ってきます。
正しい数値です。1
int(9)
正しい数値です。9
フィルタの種類によってオプションの指定が異なりますので、必要に応じて確認してみましょう。検証用フィルタ、除去用フィルタ。
◆ php filter_input() パラメーター
値 | 内容 |
---|---|
必須 int $type | 入力タイプを INPUT_GET、INPUT_POST、 INPUT_COOKIE、INPUT_SERVER か INPUT_ENV の何れかで指定します。これらは、$_GET(ゲット変数)、$_POST(ポスト変数)、$_COOKIE(グッキー変数)、$_SERVER(サーバー変数)、$_ENV(環境変数)のことです。 |
必須 string $variable_name | フィルタリングする変数の名前。 |
int $filter | 適用するフィルタの種類をIDで指定する。フィルタのIDは定数で用意されているので、こちらの一覧で確認してみましょう。検証用フィルタ、除去用フィルタ。省略した場合、FILTER_DEFAULT が適応されます。これは FILTER_UNSAFE_RAW と同等の意味になります。結果的に、デフォルトでは何もフィルタリングをしません。 |
mixed $options | オプションあるいはフラグの論理和の連想配列。オプションを指定可能なフィルタの場合、この配列の flags フィールドにフラグを指定します。 |
◆ php filter_input() 返り値
mixed
フィルタリングに成功した場合は指定された変数の値を返します。失敗した場合に FALSE を返し、また、変数 variable_name が設定されていない場合には、 NULL を返します。フラグ FILTER_NULL_ON_FAILURE が指定されている場合は、変数が設定されていなければ FALSE、 フィルタリングに失敗したら NULL を返します。
◆ php filter_input() 変更履歴
PHPバージョン | 変更内容 |
---|---|
– | – |
検証用フィルタ一覧
ID | 名前 | オプション | フラグ | 説明 |
---|---|---|---|---|
FILTER_VALIDATE_BOOLEAN | 'boolean' | default | FILTER_NULL_ON_FAILURE | '1'、'true'、'on' および 'yes' の場合に |
FILTER_VALIDATE_EMAIL | 'validate_email' | default | FILTER_FLAG_EMAIL_UNICODE | 値が妥当な e-mail アドレスであるかどうかを検証します。 この検証は、e-mail アドレスが RFC 822 に沿った形式であるかどうかを確かめます。 ただし、コメント、空白の折り返し (whitespace folding) および ドットなしドメイン名 (dotless domain name) には対応していません。 |
FILTER_VALIDATE_FLOAT | 'float' | default , decimal | FILTER_FLAG_ALLOW_THOUSAND | 値が float であるかどうかを検証し、成功した場合は値を float に変換します。 |
FILTER_VALIDATE_INT | 'int' | default , min_range , max_range | FILTER_FLAG_ALLOW_OCTAL , FILTER_FLAG_ALLOW_HEX | 値が整数であるかどうか、オプションで指定した範囲内にあるかどうかを検証し、成功した場合は整数に変換します。 |
FILTER_VALIDATE_IP | 'validate_ip' | default | FILTER_FLAG_IPV4 , FILTER_FLAG_IPV6 , FILTER_FLAG_NO_PRIV_RANGE , FILTER_FLAG_NO_RES_RANGE | 値が IP アドレスであるかどうかを検証します。 オプションで IPv4 あるいは IPv6 のみの指定、 プライベートアドレスや予約済みアドレスではないことの指定もできます。 |
FILTER_VALIDATE_MAC | 'validate_mac_address' | default | 値が MAC アドレスであるかどうかを検証します。 | |
FILTER_VALIDATE_REGEXP | 'validate_regexp' | default , regexp | 値が、Perl 互換の正規表現 regexp に一致するかどうかを検証します。 | |
FILTER_VALIDATE_URL | 'validate_url' | default | FILTER_FLAG_SCHEME_REQUIRED , FILTER_FLAG_HOST_REQUIRED , FILTER_FLAG_PATH_REQUIRED , FILTER_FLAG_QUERY_REQUIRED | 値が URL 形式である (» こちら に準拠している) かどうか、 オプションで、必須コンポーネントが含まれているかどうかを検証します。 妥当な URL が、HTTP プロトコル http:// を指定しているとは限りません。 つまり、その URL が期待通りのプロトコル (ssh:// や mailto: など) を使っているかどうか、さらなる検証が必要だということです。 この関数は、ASCII の URL のみを正しいとみなすことに注意しましょう。 国際化ドメイン名 (非 ASCII 文字を含むもの) は失敗します。 |
除去用フィルタ一覧
ID | 名前 | フラグ | 説明 |
---|---|---|---|
FILTER_SANITIZE_EMAIL | 'email' | 英字、数字および !#$%&'*+-=?^_`{|}~@.[] 以外のすべての文字を取り除きます。 | |
FILTER_SANITIZE_ENCODED | 'encoded' | FILTER_FLAG_STRIP_LOW , FILTER_FLAG_STRIP_HIGH , FILTER_FLAG_STRIP_BACKTICK , FILTER_FLAG_ENCODE_LOW , FILTER_FLAG_ENCODE_HIGH | 文字列を URL エンコードします。オプションで、 特殊文字を取り除いたりエンコードしたりします。 |
FILTER_SANITIZE_MAGIC_QUOTES | 'magic_quotes' | addslashes() を適用します。 | |
FILTER_SANITIZE_NUMBER_FLOAT | 'number_float' | FILTER_FLAG_ALLOW_FRACTION , FILTER_FLAG_ALLOW_THOUSAND , FILTER_FLAG_ALLOW_SCIENTIFIC | 数字、+- および オプションで .,eE 以外のすべての文字を取り除きます。 |
FILTER_SANITIZE_NUMBER_INT | 'number_int' | 数字、プラス記号、マイナス記号 以外のすべての文字を取り除きます。 | |
FILTER_SANITIZE_SPECIAL_CHARS | 'special_chars' | FILTER_FLAG_STRIP_LOW , FILTER_FLAG_STRIP_HIGH , FILTER_FLAG_STRIP_BACKTICK , FILTER_FLAG_ENCODE_HIGH | ''<>& および ASCII 値が 32 未満の文字を HTML エスケープします。オプションで、 特殊文字を取り除いたりエンコードしたりします。 |
FILTER_SANITIZE_FULL_SPECIAL_CHARS | 'full_special_chars' | FILTER_FLAG_NO_ENCODE_QUOTES , | htmlspecialchars() に ENT_QUOTES を指定してコールするのと同じです。
クォートのエンコードを無効にするには FILTER_FLAG_NO_ENCODE_QUOTES を設定します。 htmlspecialchars() と同様、このフィルタは
default_charset に対応しています。
現在の文字セットで無効な文字となるバイトシーケンスが検出されると文字列全体を拒否し、
結果は長さ 0 の文字列となります。
このフィルタをデフォルトのフィルタとして使う場合は、以下の警告を参考にして
デフォルトのフラグを 0 に設定しましょう。 |
FILTER_SANITIZE_STRING | 'string' | FILTER_FLAG_NO_ENCODE_QUOTES , FILTER_FLAG_STRIP_LOW , FILTER_FLAG_STRIP_HIGH , FILTER_FLAG_STRIP_BACKTICK , FILTER_FLAG_ENCODE_LOW , FILTER_FLAG_ENCODE_HIGH , FILTER_FLAG_ENCODE_AMP | タグを取り除きます。オプションで、 特殊文字を取り除いたりエンコードしたりします。 |
FILTER_SANITIZE_STRIPPED | 'stripped' | 'string' フィルタのエイリアス。 | |
FILTER_SANITIZE_URL | 'url' | 英字、数字および $-_.+!*'(),{}|\\^~[]`<>#%';/?:@&= 以外のすべての文字を取り除きます。 | |
FILTER_UNSAFE_RAW | 'unsafe_raw' | FILTER_FLAG_STRIP_LOW , FILTER_FLAG_STRIP_HIGH , FILTER_FLAG_STRIP_BACKTICK , FILTER_FLAG_ENCODE_LOW , FILTER_FLAG_ENCODE_HIGH , FILTER_FLAG_ENCODE_AMP | 何もせず、オプションで特殊文字を取り除いたりエンコードしたりします。 FILTER_DEFAULT は、このフィルタのエイリアスです。 |
フィルタフラグ
ID | 使える場所 | 説明 |
---|---|---|
FILTER_FLAG_STRIP_LOW | FILTER_SANITIZE_ENCODED , FILTER_SANITIZE_SPECIAL_CHARS , FILTER_SANITIZE_STRING , FILTER_UNSAFE_RAW | コードが 32 未満の文字を除去します。 |
FILTER_FLAG_STRIP_HIGH | FILTER_SANITIZE_ENCODED , FILTER_SANITIZE_SPECIAL_CHARS , FILTER_SANITIZE_STRING , FILTER_UNSAFE_RAW | コードが 127 より大きい文字を除去します。 |
FILTER_FLAG_STRIP_BACKTICK | FILTER_SANITIZE_ENCODED , FILTER_SANITIZE_SPECIAL_CHARS , FILTER_SANITIZE_STRING , FILTER_UNSAFE_RAW | バックティック文字を除去します。 |
FILTER_FLAG_ALLOW_FRACTION | FILTER_SANITIZE_NUMBER_FLOAT | ピリオド (.) を数値の小数点として許可します。 |
FILTER_FLAG_ALLOW_THOUSAND | FILTER_SANITIZE_NUMBER_FLOAT , FILTER_VALIDATE_FLOAT | カンマ (,) を数値の桁区切り文字として許可します。 |
FILTER_FLAG_ALLOW_SCIENTIFIC | FILTER_SANITIZE_NUMBER_FLOAT | e あるいは E を、 科学記法の数値として許可します。 |
FILTER_FLAG_NO_ENCODE_QUOTES | FILTER_SANITIZE_STRING | このフラグを指定すると、シングルクォート (') およびダブルクォート (") をエンコードしません。 |
FILTER_FLAG_ENCODE_LOW | FILTER_SANITIZE_ENCODED , FILTER_SANITIZE_STRING , FILTER_SANITIZE_RAW | コードが 32 未満のすべての文字をエンコードします。 |
FILTER_FLAG_ENCODE_HIGH | FILTER_SANITIZE_ENCODED , FILTER_SANITIZE_SPECIAL_CHARS , FILTER_SANITIZE_STRING , FILTER_SANITIZE_RAW | コードが 127 より大きいすべての文字をエンコードします。 |
FILTER_FLAG_ENCODE_AMP | FILTER_SANITIZE_STRING , FILTER_SANITIZE_RAW | アンパサンド (&) をエンコードします。 |
FILTER_NULL_ON_FAILURE | FILTER_VALIDATE_BOOLEAN | boolean 値として認識できない値の場合に NULL を返します。 |
FILTER_FLAG_ALLOW_OCTAL | FILTER_VALIDATE_INT | ゼロ (0) で始まる入力を八進数とみなします。 ゼロの後には 0-7 しか続けることができません。 |
FILTER_FLAG_ALLOW_HEX | FILTER_VALIDATE_INT | 0x あるいは 0X で始まる入力を十六進数とみなします。 後に続けられる文字は a-fA-F0-9 だけです。 |
FILTER_FLAG_EMAIL_UNICODE | FILTER_VALIDATE_EMAIL | Allows the local part of the email address to contain Unicode characters. |
FILTER_FLAG_IPV4 | FILTER_VALIDATE_IP | IPv4 形式の IP アドレスを許可します。 |
FILTER_FLAG_IPV6 | FILTER_VALIDATE_IP | IPv6 形式の IP アドレスを許可します。 |
FILTER_FLAG_NO_PRIV_RANGE | FILTER_VALIDATE_IP | IPv4 プライベート領域 10.0.0.0/8, 172.16.0.0/12 および 192.168.0.0/16 を許可しません。 FD あるいは FC ではじまる IPv6 アドレスを許可しません。 |
FILTER_FLAG_NO_RES_RANGE | FILTER_VALIDATE_IP | 予約済みの IPv4 範囲 0.0.0.0/8, 169.254.0.0/16, 127.0.0.0/8 および 240.0.0.0/4 を許可しません。 予約済みの IPv6 範囲 ::1/128、::/128、 ::ffff:0:0/96 および fe80::/10 を許可しません。 |
FILTER_FLAG_SCHEME_REQUIRED | FILTER_VALIDATE_URL | URL がスキームを含むことを要求します。 |
FILTER_FLAG_HOST_REQUIRED | FILTER_VALIDATE_URL | URL がホストを含むことを要求します。 |
FILTER_FLAG_PATH_REQUIRED | FILTER_VALIDATE_URL | URL で、パス部分を必須とします。 |
FILTER_FLAG_QUERY_REQUIRED | FILTER_VALIDATE_URL | URL で、クエリ文字列を必須とします。 |
FILTER_REQUIRE_SCALAR | 値がスカラーであることを必須とします。 | |
FILTER_REQUIRE_ARRAY | 値が配列であることを必須とします。 | |
FILTER_FORCE_ARRAY | 値がスカラーである場合は、スカラー値をひとつだけ持つ配列として扱います。 |
php filter_input() サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <form action="" method="post"> <input type="text" name="mail" /> <input type="submit" name="" value="送信"> </form> <?php $mail = filter_input(INPUT_POST, 'mail', FILTER_VALIDATE_EMAIL); var_dump($mail); ?> <br> <?php if($mail = filter_input(INPUT_POST, 'mail', FILTER_VALIDATE_EMAIL)){ echo "正しいメールアドレスです。:".$mail."<br>\n"; }else{ echo "誤ったメールアドレスです。<br>\n"; } ?> |
変数が存在しない場合は NULL
誤ったメールアドレスです。
誤った値の場合は FLASE
誤ったメールアドレスです。
正しいメールアドレスの場合は 値を返す
正しいメールアドレスです。:info@wepicks.net
タグ(=記事関連ワード)
日付
最終更新日:2019年12月11日