ja:rule:out:出力バリデーションにブラックリスト方式を用いない

This is an old revision of the document!


出力バリデーションにブラックリスト方式を用いない

入力バリデーションにブラックリスト方式を用いないように、出力バリデーションにもブラックリスト方式を用いてはならない。ブラックリスト方式はホワイトリスト方式に比べ脆弱である。

このルールが適用される出力先は全ての出力先である。ここで紹介する非適合コード例は一部に過ぎない。

非適合コード例(Path traversal)

パストラバーサルに“../“が利用される、という単純な考えで”../“を許可しないブラックリスト作ってもパストラバーサル対策にならない。

// Remove "../" from file name
$module = strtr($_GET['module'], '../', '');
include(MODULE_PATH.'/'.$module);

”../“を削除しても、攻撃者は”…/…/..“を入力とすれば”../“を生成できる。 ===== 適合コード例(Whitelisting) ===== 適合コードはホワイトリスト型のバリデーションを行う。 <code php> 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); </code>

例外

大量のエラーログなどが問題となる場合、ホワイトリストの定義が困難な場合、などの特殊なケースではブラックリスト方式もあり得る。この場合、慎重に対策を評価しなければならない。

リスク評価

ブラックリスト方式はホワイトリスト方式より脆弱性で、ブラックリスト方式の対策は致命的な結果をもたらす場合も少なくない。

Rule Severity Likelihood Remediation Cost Priority Level
IDS05-J Critical likely medium P4 L3

関連ガイドライン

参考文献

ja/rule/out/出力バリデーションにブラックリスト方式を用いない.1458519706.txt.gz · Last modified: 2016/03/21 00:21 by yohgaki

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki