ja:rule:inp:入力文字エンコーディングをバリデーションする
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| ja:rule:inp:入力文字エンコーディングをバリデーションする [2016/03/18 06:51] – created yohgaki | ja:rule:inp:入力文字エンコーディングをバリデーションする [2016/03/18 07:55] (current) – yohgaki | ||
|---|---|---|---|
| Line 2: | Line 2: | ||
| PHPの文字列型は文字エンコーディング情報を持たないバイナリ型である。APIや外部システムが入力文字エンコーディングのバリデーションを行っている場合も多いが、文字エンコーディングを利用したインジェクション攻撃のリスクを無くす為に入力文字エンコーディングはバリデーションしなければならない。 | PHPの文字列型は文字エンコーディング情報を持たないバイナリ型である。APIや外部システムが入力文字エンコーディングのバリデーションを行っている場合も多いが、文字エンコーディングを利用したインジェクション攻撃のリスクを無くす為に入力文字エンコーディングはバリデーションしなければならない。 | ||
| + | |||
| + | 外部からの文字列型データの文字エンコーディングは全て正しい文字エンコーディングであることをバリデーションしなければならない。 | ||
| Line 14: | Line 16: | ||
| </ | </ | ||
| + | filter_var関数のFILTER_DEFAULTのみでは$nameは$_GET[' | ||
| + | htmlspecialchars関数は文字エンコーディングをinternal_encoding設定(default_charsetのみ設定されている場合はdefault_charset)の文字エンコーディングでバリデーションするが、PHP 5.4 と PHP 5.5 のデフォルト値は、 UTF-8 で、それより前のバージョンの PHP のデフォルト値は ISO-8859-1 でした。 | ||
| ===== 適合コード例 ===== | ===== 適合コード例 ===== | ||
| - | [ルール/推奨事項に適合するコードおよびその解説。複数あって構わない。その場合、セクション名の後に" | + | <code php> |
| + | <?php | ||
| + | // PHP 5.6未満の場合、internal_encoding設定なども必要 | ||
| + | ini_set(' | ||
| + | // 文字列型データの場合、長さのチェックも行うべき | ||
| + | if (strlen($_GET[' | ||
| + | throw new Exception(' | ||
| + | } | ||
| + | // 文字エンコーディングチェック | ||
| + | if (mb_check_encoding($_GET[' | ||
| + | throw new Exception(' | ||
| + | } | ||
| + | $name = filter_var($_GET[' | ||
| + | // 不要な文字を含む場合のバリデーション | ||
| + | if (strlen($name) !== strlen($_GET[' | ||
| + | throw new Exception(' | ||
| + | } | ||
| + | ?> | ||
| + | |||
| + | Your name is <?php echo htmlspecialchars($name) ?>. | ||
| + | </ | ||
| + | |||
| + | PHP 5.6以降の場合、ini_set(' | ||
| + | filterモジュールには文字列バリデーションオプションがない。サニタイズフィルターを適用後、文字列の長さの変化でバリデーションすることが可能である。 | ||
| ===== 例外 ===== | ===== 例外 ===== | ||
| - | [ルール/推奨事項の例外] | + | $_GET/ |
| ===== リスク評価 ===== | ===== リスク評価 ===== | ||
| - | [ルール/推奨事項のリスク評価] | + | 文字エンコーディングを利用したインジェクション攻撃が可能となるケースはプログラム内のどこにあるのか判別しづらい。ライブラリや外部システムなどの入れ替えで文字エンコーディング脆弱になる場合もある。 |
| - | + | ||
| - | [評価例 - 英語表記に統一] | + | |
| ^ Rule ^ Severity ^ Likelihood ^ Remediation Cost ^ Priority ^ Level ^ | ^ Rule ^ Severity ^ Likelihood ^ Remediation Cost ^ Priority ^ Level ^ | ||
| - | | IDS05-J | medium | unlikely | + | | IDS05-J | medium | likely |
| ===== 関連ガイドライン ===== | ===== 関連ガイドライン ===== | ||
| ===== 参考文献 ===== | ===== 参考文献 ===== | ||
| + | |||
| + | |||
ja/rule/inp/入力文字エンコーディングをバリデーションする.1458283889.txt.gz · Last modified: 2016/03/18 06:51 by yohgaki
