我有一个PHP代码存储在数据库中,我需要执行它时检索。
但我的代码是HTML和PHP的混合,主要用在“echo”中;
一个看起来像我的代码的示例:
echo "Some Text " . $var['something'] . " more text " . $anotherVar['something2'];
如果我使用echo"";
或不使用echo"";
将数据添加到DB,我如何执行类似的代码?
有什么想法吗?
更新:
我忘了提一下,我正在一个网站上使用这个,这个网站将在内联网上使用,安全性将在服务器上执行,以确保数据安全。
9条答案
按热度按时间hec6srdp1#
我有一个PHP代码存储在数据库中
现在停止。
将代码移出数据库。
再也不要将 * 代码 * 与 * 数据 * 混在一起。
vh0rcniy2#
这不仅是一个坏主意,而且还邀请了几种类型的黑客企图。
你可以使用
eval()
,但千万不要使用它。eval()
非常危险,因为它允许执行任意PHP代码。因此不鼓励使用它。如果你已经仔细验证了除了使用这个构造之外没有其他选择,请特别注意不要在没有事先正确验证的情况下将任何用户提供的数据传递给它。jhkqcmku3#
它允许你传递一个包含PHP的字符串,并像直接将它写入文件一样运行它。
在数据库中存储可执行的PHP并不是一种常见的做法;您所存储的代码是否真的如此不同,以至于维护它的多个副本比修改它来对数据库中的静态数据做同样的事情更有意义?使用
eval
通常被认为是不好的做法,因为它可能导致维护问题,如果有办法避免它,通常是值得的。jum4pzuy4#
可以使用eval()执行代码:
但请注意,这并不安全:如果有人能够访问您的数据库,他就能够在您的服务器上执行任何代码,
tyky79it5#
请使用eval()函数。
这里有一些信息
http://www.php.net/manual/en/function.eval.php
大致如下:
如果这是最后的手段,你希望它是安全的,因为它会评估任何东西,黑客喜欢这样。
sg2wtvxw6#
正如每个人都指出的那样,使用eval()是一种不适合您的需要的方法,但是使用白名单方法可以得到几乎相同的结果。
//$sql_fn_parameters[0] =函数名称
//$sql_fn_parameters[1,2,3.....] =函数参数
调用用户函数数组()或调用用户函数()
(您也可以筛选任何参数数组$sql_sourced_parameters_array不包含任何有风险的语法,以提高安全性。)
并且从数据库控制您的代码,没有任何风险。
似乎有点长的路要走,但实现后,它真的是一个快乐的使用管理面板驱动的PHP流。
但是从长远来看,用OOP构建这样的结构更好。(类的自动加载等)
ddhy6vgd7#
Eval显然不安全。
最佳航线IMO
1.将数据保存在表中
1.准备好获取和处理数据时,运行存储过程
e5njpo688#
你不应该这样滥用数据库。一般来说,动态代码执行是一个坏主意。你可以使用像Smarty或XSLT这样的模板引擎来解决这个问题。
ntjbwcob9#
有几种方法可以实现这一点:
1)利用邪恶
eval($data);
这不是一个错字,eval通常被认为是邪恶的,而且有很好的理由。如果你认为你已经完全验证了用户数据可以安全地使用
eval
,你很可能错了,你已经给了黑客对你系统的完全访问权。即使你只对你自己的数据使用eval
,现在只要破解数据库就可以完全访问其他所有内容,调试eval
中使用的代码也是一场噩梦。2)将数据保存到文件中,然后将其包括在内
file_put_contents($path, $data); include $path;
仍然存在与
eval
相同的安全问题,但至少这一次代码更容易调试。您甚至可以在执行代码之前对其进行测试,例如:这种方法的缺点是在保存代码时会产生额外的开销。
3)直接从数据库执行代码。
你需要使用允许这样做的数据库软件。据我所知,这只包括将内容存储为文本文件的数据库软件。内置“php eval”的数据库软件不是一件好事。你可以尝试txt-db-api。或者,你可以自己写。如果这样做,维护起来会非常困难,但如果您确切地知道数据的结构化方式,则需要考虑此问题以后也不太可能改变主意。
这可以保存大量的开销,并有很多速度上的好处。但很可能不会。许多类型的查询在使用传统数据库时运行得更快,因为它们是专门为此目的而设计的。如果有可能试图在同一时间多次写入一个文件,那么你必须创建一个锁定方法来处理这种情况。
4)将php代码存储为数据库外部的文本文件
如果你的数据库中有很多不是php代码的数据,为什么还要把php代码存储在数据库中呢?这可以保存很多开销,而且如果你的数据库被黑客入侵,那么它可能不再足以获得对你系统的完全访问。
一些安全注意事项
在99%以上的情况下,您甚至不应该尝试执行您正在执行的操作。虽然您可能发现了一个例外,但仅仅作为一个Intranet是不够的,当然也不意味着忽略安全实践是安全的。除非Intranet上的每个人都需要完全的管理员访问权限,最好每个人都有最低限度的权限如果一台机器被黑客入侵了,您不希望黑客轻易访问整个Intranet上的所有内容。黑客很可能会隐藏他们正在做的事情,并引入漏洞,以便以后绕过您的服务器安全。
我正在开发的CMS当然需要这样做。我设计它主要是为了产生动态内容,而不是静态内容。数据本身主要是代码。我从简单的文本文件开始,但它慢慢演变成一个复杂的文本文件数据库。它非常快速和高效。因为我唯一需要的查询是非常简单的,并且使用索引。我现在专注于向自己隐藏复杂性,并通过更大的自动化使其易于维护。直接编写php代码或执行管理任务需要一个单独的环境,只有我自己才有超级用户权限。这只是出于必要,因为我从内部管理我的服务器,我已经制作了自己的调试工具,并为代码构建了一个特定的环境,以隐藏复杂性。使用传统的代码编辑器,那么通过ssh上传将变得太复杂而无法有效。客户端只能间接编写php代码,我不得不尽可能地做到这一点,只是为了避免明显的安全风险。也没有那么明显的风险。我不得不创建一个完整的框架,名为
Jhp
,然后被解析成php
。每个函数都必须传递一个白名单,被重命名或抛出一个错误,每个变量都被重命名,等等。如果不编写自己的解析器,只使用一个简单的黑名单,它将永远不会是安全的。任何客户端都是不可信的,除非我可以确认每个请求都完全来自我自己,即使这样,我的代码错误也会在保存之前检查,这样我就不会意外地破坏我的系统,而且万一我仍然这样做,我有另一个相同的环境来修复它,和详细的错误信息,甚至工作的致命错误,同时总是对公众隐藏。结论
除非你和我一样(至少),那么你很可能只是被黑客攻击。如果你确信值得去那些长度,那么也许你已经发现了一个例外。如果你的目标是用代码产生代码,那么数据总是代码,它不能被分离。只要记住,除了我在这个答案中所提到的之外,还有更多的安全考虑,除非你所做的事情的全部目的使这成为必要,否则为什么要费心把数据和代码混合在一起呢?