PHP限制对超全局变量的访问或移动变量数据


PHP restrict access to superglobals or move the variable data

这个困境来自于一个插件系统,我们试图实现安全程序,限制插件只能使用我们的系统传递给它的数据。

问题来自密码或其他可能存在于$_POST或其他全局变量中的敏感数据。

最初的想法是,为了限制对这些全局变量的访问,将复制数据,清空全局变量,并在调用插件后替换它:

$tmpPost = $_POST;
$_POST = [];
pluginCall();
$_POST = $tmpPost;
unset($tmpPost);

我预见的问题是效率和内存使用。如果页面有大量的输入数据,比如文件上传,那该怎么办?将数据复制到另一个变量

将使脚本内存使用量增加一倍(我假设还增加了加载时间)
$tmpPost = $_POST;

所以我的困境和问题:

是否有办法限制对超全局变量的访问和/或是否有办法重新分配变量而不复制它(本质上是移动)?

我不怕猜!!

猜测,但是如果您从$_POST转移到使用filter_input_array(INPUT_POST, ...)的系统,您甚至根本不需要超全局变量(因为该函数不使用$_POST来获取外部数组源)。你可以清除$_POSTfilter_input_array()得到你需要的所有值。然后,正如你所建议的,它真的是由你来指向你的插件正确的输入。

下面是我的自定义消毒类中的一个示例。你只需要看这一行和PHP手册就能明白我的意思。

$_POST = [];
$this->filteredInputArray = filter_input_array(INPUT_POST, $filterDefinition); 

我还没有试过这个确切的顺序,但它可能值得一试。