[PHP-users 27499] Re: 正規表現について

kei sumigama ksumigama @ space-i.com
2005年 11月 15日 (火) 14:09:05 JST


> > 正規表現のpreg_replace関数またはmb_ereg_replacを使用した場合、
> > 置換処理時に、関数を通す事は不可能なのでしょうか?
> 

preg_replace関数であれば perl と同じく e 修飾子を使うことができるようですが、
以下のようなコードを実行した場合に文字列中の関数が実行されてしまうので、
セキュリティーホールになります。

<?
$str='func(1)*func(2)';
echo preg_replace('/(.+)/e', '$1', $str);

function func($num){
 return $num*10;
}
?>

ですので後方参照変数をダブルクォートで囲む必要があります。

preg_replace('/(.+)/e', '"$1"', $str);
preg_replace('/(.+)/e', 'func("$1")', $str);

$str='".func(1)*func(2)."'; のような文字列が与えられた場合は、
マッチした文字列中のダブルクォートはエスケープされ \" のようになって
後方参照変数に納められ eval実行されますので、文字列中の任意の関数は
実行されなくなりセキュリティ的にも大丈夫のようです。



PHP-users メーリングリストの案内