这个困境来自于一个插件系统,我们试图实现安全程序,限制插件只能使用我们的系统传递给它的数据。
问题来自密码或其他可能存在于$_POST或其他全局变量中的敏感数据。
最初的想法是,为了限制对这些全局变量的访问,将复制数据,清空全局变量,并在调用插件后替换它:
$tmpPost = $_POST;
$_POST = [];
pluginCall();
$_POST = $tmpPost;
unset($tmpPost);
我预见的问题是效率和内存使用。如果页面有大量的输入数据,比如文件上传,那该怎么办?将数据复制到另一个变量
将使脚本内存使用量增加一倍(我假设还增加了加载时间)$tmpPost = $_POST;
所以我的困境和问题:
是否有办法限制对超全局变量的访问和/或是否有办法重新分配变量而不复制它(本质上是移动)?
我不怕猜!!
猜测,但是如果您从$_POST转移到使用filter_input_array(INPUT_POST, ...)
的系统,您甚至根本不需要超全局变量(因为该函数不使用$_POST来获取外部数组源)。你可以清除$_POST
和filter_input_array()
得到你需要的所有值。然后,正如你所建议的,它真的是由你来指向你的插件正确的输入。
下面是我的自定义消毒类中的一个示例。你只需要看这一行和PHP手册就能明白我的意思。
$_POST = [];
$this->filteredInputArray = filter_input_array(INPUT_POST, $filterDefinition);
我还没有试过这个确切的顺序,但它可能值得一试。