0

我想要做的是从数据库中提取 html 和 PHP 代码,然后执行它。例如,我可能有:

<?php 
  $test = <<<END
    <p> <?php 
    echo time(); 
    ?> </p>
    END;
  echo $test;
?>

我想要的是让 $test 打印

<p> 12:00PM </p>                  //right

而不是打印:

<p> <?php echo time(); ?> </p>    //wrong

当我使用回声功能时会发生这种情况。

请不要告诉我如何使用 JavaScript 或其他解决方法做同样的事情。而是坚持这个问题并记住该示例只是演示我的问题的示例。实际的代码要复杂得多。

我查看了包含 PHP 代码的 Javascript 字符串变量,但没有一个答案有效。

谢谢,

布雷特

4

3 回答 3

7

我强烈建议不要做你要求做的事情。这有很多很好的理由。

正如其他人所说,这个问题的答案是使用eval(). 但是,eval()它有几个主要问题。

首先,从对该问题的评论进行跟进,通过它运行的代码执行速度明显慢于常规 PHP 代码。尽管 PHP 是一种脚本语言,但它确实进行了优化以加快运行速度。这些优化都不适用于 eval 块,因为脚本引擎在实际运行之前无法知道代码的外观。

不仅如此,从数据库加载代码也比使用常规include()语句从文件加载代码要慢。

其次,eval()这是您可能遇到的最大的安全问题之一。一条eval()语句将运行它给出的任何PHP 代码,这意味着攻击者可以操纵该代码将能够在您的服务器上做任何事情。简而言之,eval()代码中的单个语句可以将一个小黑客变成一个灾难性的黑客。

一种不涉及过多更改概念的替代解决方案是将 PHP 代码保存到文件而不是数据库中。这将允许您include()在适当的时候简化它,并消除上面讨论的速度问题。如果您愿意,您仍然可以使用数据库来存储它,并使用 cron 作业或类似的方法将其导出到缓存文件,或者您可以直接将其保存到文件中。

但是,这种解决方案不一定能消除安全风险。您仍然可以有效地运行任意代码,这仍然意味着黑客可以通过相对简单的黑客攻击造成很大的破坏。

因此,我建议重新考虑为什么需要允许将用户输入的 PHP 代码输入到您的软件中。

于 2012-05-14T19:27:59.147 回答
4

您可以为此使用eval ()

$test = <<<END
<p> <?php 
echo time(); 
?> </p>
END;


ob_start();
eval("?>$test");
$result = ob_get_clean();
于 2012-05-14T04:24:25.400 回答
1

像这样的东西可能有用...

<?php echo writedata($code_to_parse); ?>

<?php
function writedata($data){
    if(substr($data,0,2)=="?>"){
        eval($data);
    // eval will run & echo the code immediately, so return an empty $code
    $code="";
}else{
    $code="$data";
}
return $code;
}
?>

现在,您可以通过一个函数调用处理纯 html 和混合 php/html。

样本数据:

?>Bonjour. The time now is <?php echo $timenow; ?> in Paris.

<div class="bluebox">Perfect day for swimming</div>

使用 eval() 有一些副作用,记住它会在调用它时立即执行,因此有时会产生意想不到的结果。

于 2012-05-14T05:16:08.190 回答