====== 入力バリデーションにブラックリスト方式を用いない ====== 入力バリデーションにはホワイトリスト方式を用い、ブラックリスト方式は用いない。サイニタイズはブラックリスト方式であり、利用は極力避ける。 ホワイトリスト方式はデフォルトで全てを拒否し、必要最小限を許可する方式である。デフォルトで**全て**を拒否していないとホワイトリストにひはならない。 ===== 非適合コード例 ===== if (strstr($_POST['email'], "\0")) { throw new Exception('email cannot contain null char'); } some_useful_function($_POST['email']); ヌル文字のみチェックするブラックリスト方式では不必要なリスク/不安定要素をコード内に持ち込む。 ===== 非適合コード例(sanitize_filter)===== $email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); some_useful_function($email); FILTER_SANITIZE_EMAILは「英字、数字および !#$%&'*+-=?^_`{|}~@.[] 以外のすべての文字を取り除きます」。入力としては安全になりますが、不正な入力を安全な形に変換してまで処理する必要性がある場合はあまりない。 ===== 適合コード例 ===== $email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL); if ($email === FALSE) { throw new Exception('Invalid email'); } some_useful_function($email); FILTER_VALIDATE_EMAILはRFC822形式(コメントなどは除く)のメールアドレスのみを許可する。 ===== 例外 ===== バリデーションエラーが大量に発生することが問題になる場合はサニタイズフィルターの利用を検討しても構わないが、サニタイズは攻撃に対して脆弱な防御の仕組みである。 ===== リスク評価 ===== 入力バリデーションは可能な限り厳格に行う必要がある。仕様(データの形式、長さ、範囲)として受け入れる必要がないデータを処理するとプログラム内部の処理または出力で誤作動のリスクを増加させる。 ^ Rule ^ Severity ^ Likelihood ^ Remediation Cost ^ Priority ^ Level ^ | IDS05-J | high | likely | low | P15 | L15 | ===== 関連ガイドライン ===== ===== 参考文献 ===== * http://php.net/manual/en/book.filter.php