バリデーションを行うデータはバリデーションを行う前に全ての変換作業を行わなければならない。変換作業を後で行うとバリデーションが無意味となる場合が多々ある。
PHPの場合、$_GET, $_POST, $_COOKIE, $_FILES配列のデータはデコード後のデータが保存されている。複数回のデコードはセキュリティ問題の原因となる。基本的には複数回デコードは行ってはならない。
バリデーションを行ってから変換を行うと、バリデーションの意味が無くなる場合多い。mb_convert_kana($str, 'knr')は全角文字を半角文字に変換する。strip_tags()は全角文字のタグを取り除かないので、mb_convert_kana()の変換により<script>などの危険な文字列が許容される。
非適合コード
//制御文字、長さなど他のバリデーションも必須 if ($_GET['param'] !== strip_tags($_GET['param'])) { throw('Parameter Cannot contain HTML tags'); } $param = mb_convert_kana($_GET['param'], 'knr');
適合コードはバリデーションの前に必要な変換作業を行う。これによりバリデーションロジックが正しく異常な入力を検出できるようになる。
適合コード
$param = mb_convert_kana($_GET['param'], 'knr'); //制御文字、長さなど他のバリデーションも必須 if ($param !== strip_tags($param)) { throw('Parameter Cannot contain HTML tags'); }
ソフトウェアへの入力バリデーションは入力データ処理の初めに実施しなければならない。入力バリデーションは初めに実施しなければならない処理だが、データ変換処理はその前に行わなければならない。
入力バリデーションの後にデータの変換操作を行うと、攻撃者にセキュリティ対策用のバリデーター/フィルターなどをバイパスさせる抜け道をつくる。この問題は任意コード実行を許すことになりえる。
| Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
|---|---|---|---|---|---|
| critical | likely | low | P15 | L5 |