[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 メーリングリストの案内