まず私が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)はこの修飾子を非推奨にします)を読んでください。
BBCodeを解析するために 'eval'を使うのはおそらく、最低限だと言うと非常に危険です。 – netcoder