User Tools

Site Tools


ja:rule:inp:正規表現に用いられる入力データにメタ文字がないことを確認する

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
ja:rule:inp:正規表現に用いられる入力データにメタ文字がないことを確認する [2016/03/06 07:14] yohgakija:rule:inp:正規表現に用いられる入力データにメタ文字がないことを確認する [2017/07/04 01:28] (current) – [例外] yohgaki
Line 41: Line 41:
 非適合なコードは信頼できないユーザーに対して正規表現となる文字列を許可し正規表現検索を実行する。 非適合なコードは信頼できないユーザーに対して正規表現となる文字列を許可し正規表現検索を実行する。
  
 +<color #ed1c24>**非適合コード**</color>
 <code php> <code php>
 function search_log($user, $pattern) { function search_log($user, $pattern) {
Line 52: Line 53:
 } }
  
-search_log($_SESSION['username'], $_POST['pattern']); +$log = search_log($_SESSION['username'], $_POST['pattern']); 
-</php>+var_dump($log); 
 +</code>
  
 このコードは攻撃者に正規表現インジェクションを許す。 このコードは攻撃者に正規表現インジェクションを許す。
Line 61: Line 63:
 検索パターンにアルファベットのみを許可する。 検索パターンにアルファベットのみを許可する。
  
 +<color #00a2e8>**適合コード**</color>
 <code php> <code php>
 function search_log($user, $pattern) { function search_log($user, $pattern) {
Line 72: Line 75:
 } }
  
 +// Length check
 +if (mb_strlen($_POST['pattern'], 'UTF-8') < 1) {
 +  throw new Exception('Validation error: Too short UTF-8 string');
 +}
 +if (mb_strlen($_POST['pattern'], 'UTF-8') > 30) {
 +  throw new Exception('Validation error: Too long UTF-8 string');
 +}
 // $_POST['pattern'] is validated by JavaScript at client side and // $_POST['pattern'] is validated by JavaScript at client side and
 // must not contain other than alphabet chars. // must not contain other than alphabet chars.
Line 79: Line 89:
 $log = search_log($_SESSION['username'], $_POST['pattern']); $log = search_log($_SESSION['username'], $_POST['pattern']);
 var_dump($log); var_dump($log);
-</php>+</code>
  
 ===== 適合コード例(Detect Meta Character) ===== ===== 適合コード例(Detect Meta Character) =====
Line 85: Line 95:
 preg_quote()はPCRE正規表現のメタ文字をエスケープする。エスケープされた場合、元の文字列より長くなることを利用してバリデーションを行う。 preg_quote()はPCRE正規表現のメタ文字をエスケープする。エスケープされた場合、元の文字列より長くなることを利用してバリデーションを行う。
  
 +<color #00a2e8>**適合コード**</color>
 <code php> <code php>
 function search_log($user, $pattern) { function search_log($user, $pattern) {
Line 96: Line 107:
 } }
  
 +// Length check
 +if (mb_strlen($_POST['pattern'], 'UTF-8') < 1) {
 +  throw new Exception('Validation error: Too short UTF-8 string');
 +}
 +if (mb_strlen($_POST['pattern'], 'UTF-8') > 30) {
 +  throw new Exception('Validation error: Too long UTF-8 string');
 +}
 +// Char encoding check
 +if (mb_check_encoding($_POST['pattern'], 'UTF-8')) {
 +  throw new Exception('Validation error: Invalid UTF-8 encoding');
 +}
 +// Allow only following char patterns
 +if (!mb_ereg('\A[\x20-\x7e\x80-\xFF]+\z', $_POST['pattern'])) {
 +  throw new Exception('Invalid char', $_POST['pattern']);
 +}
 // $_POST['pattern'] is validated by JavaScript at client side and // $_POST['pattern'] is validated by JavaScript at client side and
-// must not contain other than alphabet chars.+// must not contain meta chars.
 if (strlen($_POST['pattern']) !== strlen(preg_quote($_POST['pattern'], '#')) { if (strlen($_POST['pattern']) !== strlen(preg_quote($_POST['pattern'], '#')) {
   throw new Exception('Validation error: pattern may contain regex meta chars.');   throw new Exception('Validation error: pattern may contain regex meta chars.');
Line 103: Line 129:
 $log = search_log($_SESSION['username'], $_POST['pattern']); $log = search_log($_SESSION['username'], $_POST['pattern']);
 var_dump($log); var_dump($log);
-</php>+</code>
  
 ===== 適合コード例の解説 ===== ===== 適合コード例の解説 =====
Line 110: Line 136:
  
 ログフォーマットが変更された場合に意図せず秘密にすべきログが取得できてしまう可能性がある点にも注意が必要である。 ログフォーマットが変更された場合に意図せず秘密にすべきログが取得できてしまう可能性がある点にも注意が必要である。
 +
 +ユーザー定義正規表現を許可する場合、ReDoSに対してかなり脆弱になる。
  
 ===== 例外 ===== ===== 例外 =====
  
-  * 正規表現を利用するユーザーが権限を持つシステム管理者のみ限定されている場合。+  * 正規表現を利用するユーザーが権限を持つシステム管理者のみ限定されている場合、などそもそも検索対象全てにアクセス権限を持っている時。 
 +  * 検索対象のデータが機密情報でない場合。
  
 ===== リスク評価 ===== ===== リスク評価 =====
ja/rule/inp/正規表現に用いられる入力データにメタ文字がないことを確認する.1457248459.txt.gz · Last modified: 2016/03/06 07:14 by yohgaki

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki