User Tools

Site Tools


ja:rule:out:pcreメタ文字のエスケープはデリミター文字を指定する

Differences

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

Link to this comparison view

Next revision
Previous revision
ja:rule:out:pcreメタ文字のエスケープはデリミター文字を指定する [2016/07/11 09:48] – created yohgakija:rule:out:pcreメタ文字のエスケープはデリミター文字を指定する [2016/07/14 01:55] (current) – [非適合コード例(非互換エスケープ関数の利用)] yohgaki
Line 1: Line 1:
 ====== pcreメタ文字のエスケープはデリミター文字を指定する ====== ====== pcreメタ文字のエスケープはデリミター文字を指定する ======
  
-PHP 7.0未満のPHPではPCRE関数はe修飾子をサポートしている。ユーザー入力を正規表現に利用する場合、pcre_quote関数によるエスケープが必要だが、PCREのデリミター文字は任意の記号文字が指定できるため、オプションのデリミター文字を必ず指定しなければならない。指定しない場合、任意PHPコード実行が可能となる。+PHP 7.0未満のPHPではPCRE関数はe修飾子をサポートしている。ユーザー入力を正規表現に利用する場合、[[http://php.net/manual/ja/function.preg-quote.php|pcre_quote関数]]によるエスケープが必要だが、PCREのデリミター文字は任意の記号文字が指定できるため、オプションのデリミター文字を必ず指定しなければならない。指定しない場合、任意PHPコード実行が可能となる。
  
  
-===== 非適合コード例 =====+===== 非適合コード例(デリミター文字なし) =====
  
 <code php> <code php>
          foreach ($parameters as $parameter => $replacement) {          foreach ($parameters as $parameter => $replacement) {
              $quoted = preg_quote($parameter); // ここが非適合              $quoted = preg_quote($parameter); // ここが非適合
 +             // making sure that :param does not apply values to :param1
 +             $sql_query = preg_replace(
 +                 '/' . $quoted . '([^a-zA-Z0-9_])/',
 +                 PMA\libraries\Util::sqlAddSlashes($replacement) . '${1}',
 +                 $sql_query
 +             );
 +             // for parameters the appear at the end of the string
 +             $sql_query = preg_replace(
 +                 '/' . $quoted . '$/',
 +                 PMA\libraries\Util::sqlAddSlashes($replacement),
 +                 $sql_query
 +             );
 +         }
 +</code>
 +
 +===== 非適合コード例(非互換エスケープ関数の利用) =====
 +
 +[[http://php.net/manual/ja/function.quotemeta.php|quotemeta関数]]はPCRE正規表現のエスケープに利用できない。エスケープ対象文字が異る上、デリミター文字が指定できない。
 +
 +<code php>
 +         foreach ($parameters as $parameter => $replacement) {
 +             $quoted = quotemeta($parameter); // ここが非適合。quotemeta関数はPCRE用のエスケープ関数ではない。
              // making sure that :param does not apply values to :param1              // making sure that :param does not apply values to :param1
              $sql_query = preg_replace(              $sql_query = preg_replace(
Line 31: Line 53:
              // making sure that :param does not apply values to :param1              // making sure that :param does not apply values to :param1
              $sql_query = preg_replace(              $sql_query = preg_replace(
-                 '/' . $quoted . '([^a-zA-Z0-9_])/',+                 '/' . $quoted . '([^a-zA-Z0-9_])/', // 必ずデリミター文字は一致しなければならない
                  PMA\libraries\Util::sqlAddSlashes($replacement) . '${1}',                  PMA\libraries\Util::sqlAddSlashes($replacement) . '${1}',
                  $sql_query                  $sql_query
ja/rule/out/pcreメタ文字のエスケープはデリミター文字を指定する.1468230496.txt.gz · Last modified: 2016/07/11 09:48 by yohgaki

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki