====== 出力バリデーションにブラックリスト方式を用いない ====== 入力バリデーションにブラックリスト方式を用いないように、出力バリデーションにもブラックリスト方式を用いてはならない。ブラックリスト方式はホワイトリスト方式に比べ脆弱である。 このルールが適用される出力先は全ての出力先である。ここで紹介する非適合コード例は一部に過ぎない。 ===== 非適合コード例(Path traversal) ===== パストラバーサルに"../"が利用される、という単純な考えで"../"を許可しないブラックリスト作ってもパストラバーサル対策にならない。 // Remove "../" from file name $module = strtr($_GET['module'], '../', ''); include(MODULE_PATH.'/'.$module); "../"を削除しても、攻撃者は".../.../..//"を入力とすれば"../"を生成できる。 ===== 適合コード例(Whitelisting) ===== 適合コードはホワイトリスト型のバリデーションを行う。 // Allow only certain chars and do not allow too long name if (strlen($_GET['module'] > 32) { throw new Exception('Too long module name'); } if (strlen(strspn($_GET['module'], 'abcdefghijklmnopqrstuvwxyz_')) != strlen($_GET['module']) { throw new Exception('Invalid module name'); } include(MODULE_PATH.'/'.$module); ===== 例外 ===== 大量のエラーログなどが問題となる場合、ホワイトリストの定義が困難な場合、などの特殊なケースではブラックリスト方式もあり得る。この場合、慎重に対策を評価しなければならない。 ===== リスク評価 ===== ブラックリスト方式はホワイトリスト方式より脆弱性で、ブラックリスト方式の対策は致命的な結果をもたらす場合も少なくない。 ^ Rule ^ Severity ^ Likelihood ^ Remediation Cost ^ Priority ^ Level ^ | IDS05-J | Critical | likely | medium | P4 | L3 | ===== 関連ガイドライン ===== ===== 参考文献 =====