This is an old revision of the document!
Table of Contents
外部へ出力するデータはデフォルトで全て無害化する
安全なコードを書く為には、外部(データベース、OS、クライアントなど)へ出力するデータはデフォルトで全て無害化することが必要です。
無害化しなければならないデータは「形式」を持つデータ全てです。一文字でも意味がある文字がある文字列、特定の形式を持つデータ(データの位置に意味がある構造/形式)等全てです。
出力先のデータ形式には
- 可変長テキスト - SQL/XML/HTML/メールメッセージ/XPATHクエリ/LDAPクエリなど構造化されたテキスト
- 固定長テキスト - データの位置で意味が定まる物
- 可変長バイナリ - NULL文字など制御文字で構造化されたバイナリ
- 固定長バイナリ - 画像のヘッダーなど(固定長と可変長の組み合せである場合もある)
等があります。Web環境では可変長テキストが多用されますが、無害化すべきデータは可変長テキストに限りません。構造化されてないテキストデータでも無害化が必要です。
- 文字エンコーディングバリデーション - 文字エンコーディングベースの攻撃防止に必要
文字エンコーディングのバリデーションは出力時にも行えますが、入力を受け付けた時点でバリデーションしないと問題を生む場合も少なくありません。入力バリデーションと出力時に出力を無害化する処理は独立したセキュリティ対策です。セキュアなコードを書く場合には、入力と出力の両方でセキュリティを意識したコードが必要です。
固定長/可変長のデータ(文字やデータ位置に意味があるデータ)、文字エンコーディングを持つデータは全て出力する前に無害化(エスケープするかエスケープが必要ないAPIを利用、またはバリデーション)しなければなりません。
データ形式がスカラーであるかどうか、で振るまいが変る出力先もあります。このようなAPIを持つ出力先にはデータ型のバリデーションも欠かせません。
データ形式をバリデーションしたり、出力データをエスケープするだけでは不十分な場合も少くありません。例えば、データベースクエリで取得するレコード数は最大値を制限(LIMIT句で取得可能なレコード数の値を制限)していないと、システムが応答不能になる問題が発生する場合があります。
出力データのサイズが大きすぎないようにする必要がある場合もあります。例えば、データベースのカラムサイズに制限がある場合(普通はある)はカラムサイズを超えないデータサイズを出力しないと、整合性のないデータがデータベースに保存される場合があります。例:PostgreSQLのvarchar型は大きすぎるデータでエラーとなるが、SQLite3のvarchar型は大きさをチェックしないで保存する。
このルールに非適合となるコードは多岐に渡る。非適合コード例は一部に過ぎない。
非適合コード例(Output depends on input validation)
<?php $db = pg_connect('host=localhost'); if (!$db) { throw new Exception('Cannot connect to database'); } // There should be arbitrary length limit validation if (strspn(strlen($_GET['id']) > 100) { throw new Exception('Invalid integer format'); } // Validate $_GET['id'] contains only 0 to 9 chars if (strspn($_GET['id'], '0123456789') !== strlen($_GET['id'])) { throw new Exception('Invalid integer format'); } $id = $_GET['id']; // Usually there are many lines of codes and/or input/output // codes are stored in different files. // $id is used without escape/validation at output $sql = 'SELECT * FROM sample WHERE num = '.$id; $ret = pg_query($sql); if ($ret === FALSE) { throw new Exception('Query failed'); } ?>
適合コード例
[ルール/推奨事項に適合するコードおよびその解説。複数あって構わない。その場合、セクション名の後に“(適合パターン名)“を記述する。]
非適合コード例(SQLite3 varchar column)
SQLite3のvarchar型は長さのバリデーションを行わない。
適合コード例
[ルール/推奨事項に適合するコードおよびその解説。複数あって構わない。その場合、セクション名の後に”(適合パターン名)“を記述する。]
例外
[ルール/推奨事項の例外]
リスク評価
[ルール/推奨事項のリスク評価]
[評価例 - 英語表記に統一]
| Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
|---|---|---|---|---|---|
| IDS05-J | medium | unlikely | medium | P4 | L3 |
