====== pcreメタ文字のエスケープはデリミター文字を指定する ====== PHP 7.0未満のPHPではPCRE関数はe修飾子をサポートしている。ユーザー入力を正規表現に利用する場合、[[http://php.net/manual/ja/function.preg-quote.php|pcre_quote関数]]によるエスケープが必要だが、PCREのデリミター文字は任意の記号文字が指定できるため、オプションのデリミター文字を必ず指定しなければならない。指定しない場合、任意PHPコード実行が可能となる。 ===== 非適合コード例(デリミター文字なし) ===== foreach ($parameters as $parameter => $replacement) { $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 ); } ===== 非適合コード例(非互換エスケープ関数の利用) ===== [[http://php.net/manual/ja/function.quotemeta.php|quotemeta関数]]はPCRE正規表現のエスケープに利用できない。エスケープ対象文字が異る上、デリミター文字が指定できない。 foreach ($parameters as $parameter => $replacement) { $quoted = quotemeta($parameter); // ここが非適合。quotemeta関数はPCRE用のエスケープ関数ではない。 // 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 ); } ===== 適合コード例 ===== foreach ($parameters as $parameter => $replacement) { $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 ); } ===== 例外 ===== 例外はない。必ずデリミター文字を指定する。 ===== リスク評価 ===== [ルール/推奨事項のリスク評価] [評価例 - 英語表記に統一] ^ Rule ^ Severity ^ Likelihood ^ Remediation Cost ^ Priority ^ Level ^ | IDS05-J | medium | unlikely | medium | P4 | L3 | ===== 関連ガイドライン ===== ===== 参考文献 ===== * https://github.com/phpmyadmin/phpmyadmin/commit/1cc7466db3a05e95fe57a6702f41773e6829d54b