2008-09-03 130 views
28

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

我该怎么去做这件事?

+8

感谢您的回答。与下面的许多“答案”相反,这是一个很好且有用的答案。有很多LEGIT用法,您希望将PHP命令存储在数据库中。在不知道情况下说“不这样做”只是傲慢而已。 – 2013-03-27 02:34:03

回答

30

您可以使用eval命令。 虽然我会推荐这个,因为使用这种方法存在很多陷阱。调试很难(er),它意味着一些安全风险(DB中的坏内容被执行,呃哦)。

例如参见When is eval evil in php?。谷歌for Eval是邪恶的,你会发现很多例子,为什么你应该找到另一种解决方案。

补充:另外一篇很好的文章,其中有一些引用漏洞的文章是this blogpost。指的是过去的vBulletin和phpMyAdmin漏洞,这些漏洞是由于Eval使用不当造成的。

+0

摘自“Eval is evil”:“允许任何用户提供的数据进入eval()调用都是要求被黑客攻击。” - 好的,如果我使用我自己的代码保存在数据库中并使用为动态和快速的自定义表单生成? – Jeffz 2013-05-10 14:38:00

+0

@Jeffz你最好确定没有错误的代码在那里结束。此外,你为什么要把它粘在一个数据库中,而不仅仅是一些代码文件中? – 2013-05-10 16:36:42

+0

两种方式都很好,如果你知道你在做什么; [一个]。基于文件更安全(特别是对于编码相当新颖),[B]。数据库的方式是更多功能,如果一些飞行中的代码更改是必要的,因为更新数据库比更新更容易,调整(无论)文件的内容 – Jeffz 2013-07-07 13:18:01

2

你可以看看PHP中的eval函数。它允许你运行任意的PHP代码。然而,这可能是一个巨大的安全风险,并且最好避免。

5

eval()函数在这里的其他答案中已被涵盖。我同意你应该限制使用eval,除非它是绝对需要的。您可以只使用名为​​的方法,而不使用db中的PHP代码。无论何时您需要运行自定义PHP代码,只需实例化刚刚从db中获取的名称类并在其上运行->execute()即可。这是更清洁的解决方案,并为您提供了极大的灵活性,并显着提高了网站安全性。

1

您是否考虑过使用源代码管理系统为各种安装(以及它们之间不同的模块)存储不同的分支?这将是我能想到的应用程序配置的几个最佳实践之一。你的并不是一个不寻常的要求,所以这是一个过去被其他人解决的问题。并将代码存储在数据库中是我认为你很难找到引用或被建议为最佳实践。

你发布了澄清的好事。你可能无意中提出了一个答案来寻找一个合适的问题。

22

简单:

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

让我知道,在许多应用中为我的伟大工程,不能不注意到,每个人都快点说,这是多么糟糕,但速度缓慢实际上助阵用直接回答...

0

我如何做到这一点是在数据库中有一个字段,用于标识需要执行的代码块的唯一性。那个单词在该代码的文件名中。我把字符串放在一起指向要包含的php文件。例如:

$lookFor = $row['page']; 

include("resources/" . $lookFor . "Codebase.php"); 

这样,即使黑客可以访问你的DB,他也不能将恶意代码直接放在那里执行。他也许可以改变这个引用词,但是除非他能够直接将文件直接放到服务器上,否则这对他没有好处。如果他可以将文件直接放到服务器上,那么无论如何,如果他真的想要变得讨厌的话,你就会沉没。只是我的两美分价值。

是的,有理由想要执行存储的代码,但也有缺点。

0

从数据库中读取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; 
相关问题