PHP で値を検証したいとき、filter 関数(filter_var や filter_input 関数)を使用すると簡単に値を検証できます。この記事は、filter 系関数に指定するフィルタ型についてのメモです。
FILTER_SANITIZE_STRING、FILTER_SANITIZE_SPECIAL_CHARS、FILTER_SANITIZE_FULL_SPECIAL_CHARS の違い
覚えてしまえば簡単だとは思いますが、私は覚えが悪いのでメモです(アウトプットすると覚えられる気がする)。
以下のコードの出力結果は…
<?php
$var = '<script>alert("XSS");</script>';
var_dump(filter_var($var, FILTER_SANITIZE_STRING));
var_dump(filter_var($var, FILTER_SANITIZE_SPECIAL_CHARS));
var_dump(filter_var($var, FILTER_SANITIZE_FULL_SPECIAL_CHARS));
このようになります。
string(21) "alert("XSS");"
string(54) "<script>alert("XSS");</script>"
string(52) "<script>alert("XSS");</script>"
結果から分かるように、違いは以下のようになります。
|ID|説明|
|---|---|---|
|FILTER_SANITIZE_STRING|タグを取り除く。オプションで、 特殊文字を取り除いたりエンコードしたりする|
|FILTER_SANITIZE_SPECIAL_CHARS|'"<>& および ASCII 値が 32 未満の文字を HTML エスケープする。オプションで、 特殊文字を取り除いたりエンコードしたりする|
|FILTER_SANITIZE_FULL_SPECIAL_CHARS|htmlspecialchars() に ENT_QUOTES を指定してコールするのと同じ|
より詳しい仕様などは PHP マニュアルの「フィルタの型」をご覧ください。
終わり
私のような雑魚い頭的には「FILTER_SANITIZE_FULL_SPECIAL_CHARS を指定しておけばいい」という感じですかね(笑)