【问题标题】:How do I execute PHP that is stored in a MySQL database?如何执行存储在 MySQL 数据库中的 PHP?
【发布时间】:2008-09-03 10:14:26
【问题描述】:

我正在尝试编写一个调用存储在 MySQL 数据库中的 PHP 的页面。存储在 MySQL 数据库中的页面包含我想在页面加载时运行的 PHP(和 HTML)代码。

我该怎么做呢?

【问题讨论】:

  • 感谢您提出这个问题。与下面的许多“答案”相反,这是一个很好且有用的答案。有许多 LEGIT 用途,您希望将 PHP 命令存储在数据库中。在不知道情况的情况下说“不要这样做”是傲慢的。

标签: php mysql


【解决方案1】:

您可以为此使用eval 命令。 我建议不要这样做,因为使用这种方法有很多陷阱。 调试很困难(呃),它意味着一些安全风险(数据库中的错误内容会被执行,呃哦)。

例如见When is eval evil in php?。 Google for Eval 是邪恶的,你会发现很多例子说明你应该寻找另一个解决方案。

补充:另一篇很好的文章提到了一些漏洞利用是this blogpost。指过去由于 Eval 使用不当导致的 vBulletin 和 phpMyAdmin 漏洞。

【讨论】:

  • 摘自“Eval is evil”:“允许任何用户提供的数据进入 eval() 调用就是要求被黑客入侵。” - 好的,如果我使用存储在数据库中的自己的代码并使用例如用于动态和快速的自定义表单生成?
  • @Jeffz 你最好非常确定那里没有坏代码。再说了,你为什么要把它放在一个数据库里,而不是放在几个代码文件里呢?
  • 两种方式都很好,如果你知道自己在做什么; [一个]。基于文件更安全(尤其是对于相当新的编码),[B]。 db 方式更通用,如果需要对代码进行一些即时更改,因为更新 db 比更新、调整(无论)文件的内容更容易
【解决方案2】:

简单:

$x // your variable with the data from the DB
<?php echo eval("?>".$x."<?") ?>

让我知道,在许多应用程序中都非常适合我,不禁注意到每个人都会很快说出它有多糟糕,但实际上提供直接答案的速度却很慢......

【讨论】:

  • 我修正了你的降价 - 如果你不缩进四个空格,&lt;?php ?&gt; 将被视为 HTML 标记并被隐藏
  • +1 这个解决方案实际上是有效的。仅应用 eval($x) 并不能解决问题,因为它破坏了“
【解决方案3】:

eval() 函数在此处的其他回复中有所介绍。我同意你应该限制使用eval,除非它是绝对需要的。除了在 db 中包含 PHP 代码,您还可以只使用一个类名,该类名具有称为 execute() 的方法。每当您需要运行自定义 PHP 代码时,只需实例化您刚刚从 db 获取的名称类并在其上运行 -&gt;execute()。它是更清洁的解决方案,为您提供了很大的灵活性,并显着提高了网站安全性。

【讨论】:

    【解决方案4】:

    您可以查看 PHP 中的eval 函数。它允许您运行任意 PHP 代码。不过,这可能会带来巨大的安全风险,最好避免。

    【讨论】:

      【解决方案5】:

      您是否考虑过使用源代码控制系统为各种安装(以及它们之间不同的模块)存储不同的分叉?这将是我能想到的应用程序配置的几个最佳实践之一。你的要求不是什么稀奇事,所以是别人过去解决的问题;并且将代码存储在数据库中是一种我认为您很难找到参考或建议作为最佳实践的方法。

      还好你发布了澄清。您可能无意中提出了答案以寻找合适的问题。

      【讨论】:

        【解决方案6】:

        从数据库中读取 php 代码并保存到具有唯一名称的文件中,然后包含文件 这种运行 php 代码和调试它的简单方法。

        $uniqid="tmp/".date("d-m-Y h-i-s").'_'.$Title."_".uniqid().".php";    
        $file = fopen($uniqid,"w");
        fwrite($file,"<?php \r\n ".$R['Body']);
        fclose($file);                          
        // eval($R['Body']);
        include $uniqid;
        

        【讨论】:

          【解决方案7】:

          我的做法是在数据库中创建一个字段,用于标识需要执行的代码块的独特之处。那一个词在该代码的文件名中。我将字符串放在一起以指向要包含的 php 文件。示例:

          $lookFor = $row['page'];
          
          include("resources/" . $lookFor . "Codebase.php");
          

          这样,即使黑客可以访问您的数据库,他也无法将恶意代码直接放入其中执行。他或许可以更改引用词,但除非他真的可以将文件直接放到服务器上,否则这对他没有好处。如果他可以将文件直接放到服务器上,那么如果他真的想讨厌的话,无论如何你都会沉没。只值我的两美分。

          是的,您想要执行存储的代码是有原因的,但也有缺点。

          【讨论】:

          • 您关于即使黑客可以访问您的数据库,这种包含方法也是安全的说法是不正确的。它仍然容易受到多种攻击,包括一种称为“空字节中毒”或“空字节注入”的攻击,它可以有效地删除(忽略)字符串的结尾。请参阅herehere 了解更多详情。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-19
          • 1970-01-01
          • 2012-06-08
          • 2010-10-17
          • 2013-08-14
          相关资源
          最近更新 更多