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

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

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

kei sumigama
> > 正規表現の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 mailing list  [hidden email]
http://ns1.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://www.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|

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

nomoto
  nomotoです。

>> > 正規表現のpreg_replace関数またはmb_ereg_replacを使用した場合、
>> > 置換処理時に、関数を通す事は不可能なのでしょうか?
>
>preg_replace関数であれば perl と同じく e 修飾子を使うことができるようですが、
>以下のようなコードを実行した場合に文字列中の関数が実行されてしまうので、
>セキュリティーホールになります。
>
>ですので後方参照変数をダブルクォートで囲む必要があります。
>
>preg_replace('/(.+)/e', '"$1"', $str);
>preg_replace('/(.+)/e', 'func("$1")', $str);

今回、はじめて/e 修飾子があることを知りました。eval処理してしまう
とは怖いですね。

preg_replace_callbackというのがあるようなので、こちらを使うほうが
安全ではないでしょうか。
preg_replace_callback('/(.+)/', 'func', $str);

http://www.php.net/manual/ja/function.preg-replace-callback.php
_______________________________________________
PHP-users mailing list  [hidden email]
http://ns1.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://www.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|

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

kei sumigama
> preg_replace_callbackというのがあるようなので、こちらを使うほうが
> 安全ではないでしょうか。
> preg_replace_callback('/(.+)/', 'func', $str);

できることが違います。
例えば preg_replace_callback に 後方参照変数以外の変数を渡したい場合は
global スコープの変数を汚染することになります。

毒も薬になります。
用法を誤らず適所で使っていただければ良いかと思います。


_______________________________________________
PHP-users mailing list  [hidden email]
http://ns1.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://www.php.gr.jp/php/novice.php3
Reply | Threaded
Open this post in threaded view
|

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

水沼寛喜
お世話になっております。水沼です。

nomoto様、おく様、kei sumigama様、鈴木様など多数の方々の
ご支援により、解決致しました。

大変ありがとうございました。

> -----Original Message-----
> From: [hidden email]
> [mailto:[hidden email]] On Behalf Of kei sumigama
> Sent: Tuesday, November 15, 2005 4:14 PM
> To: PHP-users ML
> Subject: [PHP-users 27503] Re:正規表現について
>
>
> > preg_replace_callbackというのがあるようなので、こちらを使うほうが
> > 安全ではないでしょうか。
> > preg_replace_callback('/(.+)/', 'func', $str);
>
> できることが違います。
> 例えば preg_replace_callback に 後方参照変数以外の変数を渡したい場合は
> global スコープの変数を汚染することになります。
>
> 毒も薬になります。
> 用法を誤らず適所で使っていただければ良いかと思います。
>
>
> _______________________________________________
> PHP-users mailing list  [hidden email]
> http://ns1.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://www.php.gr.jp/php/novice.php3
>


_______________________________________________
PHP-users mailing list  [hidden email]
http://ns1.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://www.php.gr.jp/php/novice.php3