我正在尝试编写一个调用存储在 MySQL 数据库中的 PHP 的页面。存储在 MySQL 数据库中的页面包含我想在页面加载时运行的 PHP(和 HTML)代码。
我怎么能这样做呢?
您可以为此使用eval命令。不过我建议不要这样做,因为使用这种方法有很多陷阱。调试很困难(呃),它意味着一些安全风险(数据库中的不良内容被执行,呃哦)。
请参阅php 中的 eval 何时是邪恶的?例如。Google for Eval is Evil,你会发现很多例子说明为什么你应该找到另一个解决方案。
补充:另一篇很好的文章,其中提到了一些漏洞利用是这篇博文。指过去由于 Eval 使用不当导致的 vBulletin 和 phpMyAdmin 漏洞。
简单的:
$x // your variable with the data from the DB
<?php echo eval("?>".$x."<?") ?>
让我知道,在许多应用程序中都非常适合我,不禁注意到每个人都会很快说出它有多糟糕,但实际上很难提供直接的答案......
eval()
此处的其他回复中涵盖了功能。我同意你应该限制使用,eval
除非它是绝对需要的。而不是在 db 中包含 PHP 代码,您可以只拥有一个类名,该类名具有称为execute()
. 每当您需要运行自定义 PHP 代码时,只需实例化您刚刚从 db 获取的名称类并->execute()
在其上运行。它是更清洁的解决方案,为您提供了很大的灵活性,并显着提高了站点安全性。
您可以查看 PHP 中的eval函数。它允许您运行任意 PHP 代码。但是,这可能是一个巨大的安全风险,最好避免。
您是否考虑过使用您的源代码控制系统为各种安装(以及它们之间不同的模块)存储不同的分叉?这将是我能想到的应用程序配置的几个最佳实践之一。你的要求不是什么稀奇事,所以是别人过去解决的问题;并且将代码存储在数据库中是一种我认为您很难找到参考或建议作为最佳实践的方法。
还好你发布了澄清。您可能无意中提出了答案以寻找合适的问题。
我的做法是在数据库中有一个字段来标识需要执行的代码块的独特之处。那一个词在该代码的文件名中。我将字符串放在一起以指向要包含的 php 文件。例子:
$lookFor = $row['page'];
include("resources/" . $lookFor . "Codebase.php");
这样,即使黑客可以访问您的数据库,他也无法将恶意代码直接放在那里执行。他也许可以更改引用词,但除非他真的可以将文件直接放到服务器上,否则对他没有任何好处。如果他可以将文件直接放到服务器上,那么如果他真的想讨厌的话,无论如何你都会沉没。只值我的两分钱。
是的,您想要执行存储的代码是有原因的,但也有缺点。
从数据库中读取 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;