データベースのテキスト フィールドから php コードを実行するための bb コード オプションを作成しようとしています。何かのようなもの[?php]code[/?]
安全ではないことはわかっていますが、誰もページを編集することはできません。主に、物事を計算したり、ファイルを含めたりするために使用したいと考えています。
これは私がソファを持っているものです:
$txt = preg_replace("#\[?php\](.+?)\[/?\]#is", eval("\\1"), $txt);
データベースのテキスト フィールドから php コードを実行するための bb コード オプションを作成しようとしています。何かのようなもの[?php]code[/?]
安全ではないことはわかっていますが、誰もページを編集することはできません。主に、物事を計算したり、ファイルを含めたりするために使用したいと考えています。
これは私がソファを持っているものです:
$txt = preg_replace("#\[?php\](.+?)\[/?\]#is", eval("\\1"), $txt);
あなたが提供した例は、eval()前に評価として機能せずpreg_replace()、結果は実際に置換として使用されます。\\1は有効な PHP 式ではないため、指定されたコードが解析エラーを返すことを期待しています。
最初に を使用preg_match()して PHP 式を抽出し、次にeval()それを抽出してから、bb タグ間のテキストをeval().
とはいえ、上でコメントしたように、私は個人的にそのようなことをすることを強くお勧めしません. これは基本的にサーバーへの任意のアクセスを提供するものであり、どのような点でも非常に悪い設計思想です。特定のディレクトリからページを含めるなど、実際には特定の数の操作のみが必要だと思います。すべての予防措置を講じて、限られた数の操作専用の専用 bb タグを実装できます。
eval最初にバッファリング、文字列全体、php タグの終了を開始し、バッファを変数として取得できます。
$txt = "Result of 2+2 = [?php] echo 4; [/?].";
$txt = str_replace(array('[?php]', '[/?]'), array('<?php','?>'), $txt);
ob_start();
eval('?>'.$txt);
$txt = ob_get_contents();
ob_end_clean();
echo $txt;