[PHP] filter_inputの使い方

2019-02-16PHP

スポンサーリンク

filter_inputとは?

今まで、POSTやGETは、issetを使っていたが、PHP5.2以降filter_input使用が推奨されていた。

if(!isset($_POST['hoge'])){
  // エラー処理
}

POSTやGETなどの外部からの変数を、フィルターして無害な値にしてくれたり、弾いてくれる。 issetやその他のバリデーションが1行で書けそう。 GET、POST、COOKIE、SERVERなどの変数を受け取ることができる。

filter_inputの使い方

第3引数にフィルターを指定。 省略も可能だが、その場合はFILTER_DEFAULT(FILTER_UNSAFE_RAWと同じ)が適用される。 第3引数に指定するフィルターは主に、FILTER_VALIDATE(検証フィルタ)とFILTER_SANITIZE(除去フィルタ)があり、動きが異なる。

// $_GET['val']を受け取る
$val = filter_input(INPUT_GET, 'val');

// $_POST['num']を受け取る
if(!$num = filter_input(INPUT_POST,'num',FILTER_VALIDATE_INT)){
  // INTではないない場合の処理

}

入力値ではない値をフィルタできるfilter_varもある。

FILTER_VALIDATEの動き

VALIDATEに通ると(変数に)その値が代入される。 VALIDATEに引っかかるとFALSE、値がなかった場合はNULLが返ってくる。
FILTER_NULL_ON_FAILUREというフラグで、VALIDATEに引っかかるとNULL、値がなかった場合FALSEと指定することも可能。
存在チェックとともに、型チェック等も行うことができ不正な値はエラーとしてはじくことが可能。

// 1をPOSTで送信
$num = filter_input(INPUT_POST,'num',FILTER_VALIDATE_INT);
// 1aをPOSTで送信
$str= filter_input(INPUT_POST,'text',FILTER_VALIDATE_INT);

var_dump($num); //int 1
var_dump($str); //boolean false

FILTER_SANITIZEの動き

FILTER_VALIDATEと違い、不正値を検出しない。特殊文字やタグなどを取り除いた値が返される。
全てが不正文字だと空文字、intとその他の値だと、intだけが返される。
また、FILTER_VALIDATEと違い、数値であってもString型で返される。

// 10をPOSTで送信
$num = filter_input(INPUT_POST,'num',FILTER_SANITIZE_NUMBER_INT);
// aaをPOSTで送信
$str= filter_input(INPUT_POST,'text',FILTER_SANITIZE_NUMBER_INT);
// 1aをPOSTで送信
$mix= filter_input(INPUT_POST,'mix',FILTER_SANITIZE_NUMBER_INT);

var_dump($num); //string '10'
var_dump($str); //string ''
var_dump($mix); //string '1'

メールアドレスにFILTER_SANITIZE_EMAIL(英字、数字および !#$%&’*+-=?^_`{|}~@.[] 以外のすべての文字を取り除く)を使うと、エラーを返せず意図したアドレスと異なったまま処理が進んでしまう。
// <mail>@/をPOSTで送信
$mail = filter_input(INPUT_POST,'mail',FILTER_SANITIZE_EMAIL));

var_dump($mail); //string 'mail@'

配列を受け取る

チェックボックスとかhiddenで、値を配列で送信し、filter_inputで受け取る場合、第四引数にFILTER_REQUIRE_ARRAYを書く。
<input type="hidden" name="hoge[]" value="1">
<input type="hidden" name="hoge[]" value="2">
<input type="hidden" name="hoge[]" value="3">
$hoge = filter_input(INPUT_POST, 'hoge', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);

var_dump($hoge);
// array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" }

フィルタの種類

フィルタ一覧


以上

Posted by Agopeanuts