ja:rule:inp:入力文字エンコーディングをバリデーションする

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
ja:rule:inp:入力文字エンコーディングをバリデーションする [2016/03/18 06:51] – created yohgakija:rule:inp:入力文字エンコーディングをバリデーションする [2016/03/18 07:55] (current) yohgaki
Line 2: Line 2:
  
 PHPの文字列型は文字エンコーディング情報を持たないバイナリ型である。APIや外部システムが入力文字エンコーディングのバリデーションを行っている場合も多いが、文字エンコーディングを利用したインジェクション攻撃のリスクを無くす為に入力文字エンコーディングはバリデーションしなければならない。 PHPの文字列型は文字エンコーディング情報を持たないバイナリ型である。APIや外部システムが入力文字エンコーディングのバリデーションを行っている場合も多いが、文字エンコーディングを利用したインジェクション攻撃のリスクを無くす為に入力文字エンコーディングはバリデーションしなければならない。
 +
 +外部からの文字列型データの文字エンコーディングは全て正しい文字エンコーディングであることをバリデーションしなければならない。
  
  
Line 14: Line 16:
 </code> </code>
  
 +filter_var関数のFILTER_DEFAULTのみでは$nameは$_GET['name']の値となる。FILTER_FLAG_STRIP_LOWでASCII値の32以下の文字が削除される。$nameはASCII値の32以下の文字を含まない文字列となるが、文字エンコーディングはバリデーションされない。
  
 +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('default_charset', 'UTF-8'); 
 +// 文字列型デの場合、長さのチェッも行うべき 
 +if (strlen($_GET['name'] > 100) { 
 +  throw new Exception('Too long string'); 
 +
 +// 文字エンコーディングチェック 
 +if (mb_check_encoding($_GET['name']) === FALSE) { 
 +  throw new Exception('Invalid encoding'); 
 +
 +$name = filter_var($_GET['name'], FILTER_DEFAULT, [FILTER_FLAG_STRIP_LOW]); 
 +// 不要な文字を含む場合のバリデーション 
 +if (strlen($name) !== strlen($_GET['name'])) { 
 +  throw new Exception('Contains invalid chars'); 
 +
 +?> 
 + 
 +Your name is <?php echo htmlspecialchars($name) ?>. 
 +</code> 
 + 
 +PHP 5.6以降の場、ini_set('default_charset', 'UTF-8')で全ての文字エンコディグのデフォルト値がUTF-8になる。mb_check_encoding($_GET['name'])でUTF-8エンコーディングであることが確認される。
  
 +filterモジュールには文字列バリデーションオプションがない。サニタイズフィルターを適用後、文字列の長さの変化でバリデーションすることが可能である。
  
 ===== 例外 ===== ===== 例外 =====
  
-[ルル/推奨事項例外]+$_GET/$_POST/$_COOKIEなどブラウザからの変数は正しい文字エンコディングであることが保証されない。しかし、データベースなど場合、保存時に文字エンコーディングがバリデーションされる物もある。この場合、入力文字エンコーディングのバリデーションを省略しても構わない。
  
 ===== リスク評価 ===== ===== リスク評価 =====
  
-[ルル/推奨事項のリスク評価] +文字エンコディングを利用したインジェクション攻撃が可能となるケースはプログラム内どこにあるのか判別しづらい。ライブラや外部シテムなどの入れ替えで文字エンコーディング脆弱なる場合もある。
- +
-[評価例 - 英語表記統一]+
  
 ^ Rule ^ Severity ^ Likelihood ^ Remediation Cost ^ Priority ^ Level ^ ^ Rule ^ Severity ^ Likelihood ^ Remediation Cost ^ Priority ^ Level ^
-| IDS05-J | medium | unlikely | medium | P4 | L3 |+| IDS05-J | medium | likely | medium | P4 | L3 |
  
 ===== 関連ガイドライン ===== ===== 関連ガイドライン =====
  
 ===== 参考文献 ===== ===== 参考文献 =====
 +
 +
ja/rule/inp/入力文字エンコーディングをバリデーションする.1458283889.txt.gz · Last modified: 2016/03/18 06:51 by yohgaki

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki