[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_DEFAULTFILTER_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