2012-04-03 14 views
2

私はXdebugでExlipseを使って自分のPHPコードをデバッグしています。しかし、コードの一種で、私はデバッグをカントがあります:コールバック関数PHPがpreg-replaceコールバック関数をデバッグ

は私がにpreg_replaceを使用しています:

$pc = preg_replace('#\[div(=(.*))?\](.*?)\[/div\]#iuUe', "\bbcode_div('\$2', '\$3')", $_POST["data"]); 

すべての権利関数を呼び出しますが、デバッグ中に日食は文句を言わない関数内で取得され、ブレークポイントであっても。

どうすればデバッガをその機能の中に入れることができますか?

EDIT:私はpreg_replaceを使用する必要があります。

+1

BBCodeを解析するために 'eval'を使うのはおそらく、最低限だと言うと非常に危険です。 – netcoder

答えて

3

あなたがpreg_replace_callback()を使用していることを確認してください:

preg_replace_callback('/ /', 'replace', 'this is not a complicated matter'); 

function replace($t) 
{ 
    var_dump($t); // <-- set breakpoint here 
} 

このブレーキ5回var_dump()を呼び出す前に。


EDIT:preg_replace()e修飾子と一緒に使用された場合、一部の牛車が必要です。この場合、ブレークポイントを設定するだけでは不十分です。 、

function replace($t) 
{ 
    // Production systems might (should) not have this function 
    if (function_exists('xdebug_break')) 
    { 
     xdebug_break(); 
    } 

    // Rest of the code... 
} 
+0

これはpreg_replaceでも使用できますか?別のコードで私はそれを使用することを余儀なくされているからです。 – NaGeL182

+0

ありがとうございます、これは今動作します – NaGeL182

+0

実際には、Xdebugはeval'edステートメントにブレークポイントを設定することをサポートしています。私は、Eclipseがdbgp:// xxファイルのサポートを実装していないことだけを考えています。このタイプのファイルは、Xdebugがeval'edコードをファイルとしてエミュレートするために使用する「疑似ファイル」です。 – Derick

2

まず私がpreg_replace_callbackを使用することを言及したかった:あなたは、明示的に破るためのXDebugを伝える必要があるだろう。 preg_replace(何らかの理由をつけることなく)を使用しなければならないと言いますが、最初にあなたに何をすべきかを説明し、理由を説明してください。preg_replaceは悪い選択です。

あなたのコードは次のようになります。

<?php 
$regex = '{\[div(?:=(.*?))?\](.*??)\[/div\]}iu'; 
$pc = preg_replace_callback($regex, function ($matches) { 
    return bbcode_div($matches[1], $matches[2]); 
}); 

それとも、まだPHP 5.2歳以上(真剣にアップデートを、)を使用する場合、次の

$pc = preg_replace('#\[div(=(.*))?\](.*?)\[/div\]#iuUe', "\bbcode_div('\$2', '\$3')", $_POST["data"]); 

それは次のように書き換えることができます。

<?php 
$regex = '{\[div(?:=(.*?))?\](.*??)\[/div\]}iu'; 
$pc = preg_replace_callback($regex, create_function('$matches', ' 
    return bbcode_div($matches[1], $matches[2]); 
')); 

ここで、なぜ/eが悪い選択であるかを説明します。それは誤った安全感を与えます。置き換えに二重引用符を使用すると、セキュリティは事実上壊れます。

<?php 
$_POST['code'] = 'echo "broken";'; 
$_POST['data'] = '[div]{${eval($_POST[code])}}[/div]'; 
$pc = preg_replace('#\[div(=(.*))?\](.*?)\[/div\]#iuUe', 'bbcode_div("$2", "$3")', $_POST["data"]); 

'文字を使用して、addslashes()エスケープするとき、それはいけない(/eが内部addslashesを使用しています!)。したがって、ユーザが"文字を入力すると、\\'のいずれかをエスケープすることができます。そうでない場合は、文字通り挿入されます(一重引用符で囲むと、\"に変更されます)。それはおそらくあなたが望むものではありません。 /e修飾子が壊れています。まあ、少なくともPHPのそれ。 Perlはうまくいっています...

特定のプロジェクトが影響を受けました。たとえば、/e修飾子を使用したroundcubeです。それはchanges in codebaseを引き起こしました。 /e修飾子を使用しないで単純に防御できるのであれば、ハッカーの攻撃に気をつけてください。

また、https://wiki.php.net/rfc/remove_preg_replace_eval_modifier(既に受け入れ済みで、次のPHPメジャーバージョン(PHP 5.5またはPHP 6.0)はこの修飾子を非推奨にします)を読んでください。

+0

私はPHPBBの変更を行っていますが、phpbbは/ eとpreg_replaceを使用しています。なぜそれも使用する必要があるのです。 – NaGeL182

+0

@ NaGel182:しかし、これは同じことをしなければならないというわけではありません。これは実装の詳細と呼ばれます。 – xfix

関連する問題