0

我正在尝试为从数据库文本字段运行 php 代码创建一个 bb 代码选项。就像是[?php]code[/?]

我知道它不安全,但是没有人可以编辑页面,我主要想用它来让它计算事物或包含文件。

这就是我到目前为止所拥有的:

$txt = preg_replace("#\[?php\](.+?)\[/?\]#is", eval("\\1"), $txt);
4

2 回答 2

0

您可以先开始缓冲,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;
于 2013-07-06T17:23:48.407 回答
0

您提供的示例不能作为eval()之前的评估preg_replace(),结果实际上用作替换。\\1不是一个有效的 PHP 表达式,所以我希望给定的代码会返回一个解析错误。

您应该preg_match()先使用提取 PHP 表达式,然后提取eval()它,然后才将 bb 标记之间的文本替换为eval().

也就是说,如上所述,我个人强烈不建议这样做。这基本上提供了对服务器的任意访问,无论如何都是一个非常糟糕的设计理念。我猜你真的只需要一定数量的操作,比如包含来自特定目录的页面。您可以使用所有预防措施专门针对那些数量有限的操作实施专用的 bb 标签。

于 2013-07-06T14:32:01.733 回答