什么是PHP import_request_variables的正确(安全)替代方法?

时间:2019-03-16 12:39:13

标签: php

全面披露:我不是PHP程序员,而是Javascript / Node程序员,但我正在尝试帮助朋友修复他们网站上的致命PHP错误。

为了机智,

Fatal error: Call to undefined function import_request_variables()

我已经查找过,import_request_variables()已过时。

相关的代码段是这样的-我注意到开发人员似乎已经尝试了更现代的形式(?),并放弃了它。

import_request_variables("pgc", "re_");
//extract($_GET, EXTR_PREFIX_ALL, "pgc");
//extract($_POST, EXTR_PREFIX_ALL, "pgc");
//extract($_GET, EXTR_PREFIX_ALL, "re_");
//extract($_POST, EXTR_PREFIX_ALL, "re_");

我在Php import_request_variable stopped working的Stack Overflow上找到了一个解决方案,建议使用相同的提取方法

extract($_GET, EXTR_PREFIX_ALL, 'p');
extract($_POST, EXTR_PREFIX_ALL, 'p');

这是正确的方法吗?我在其他帖子(例如here)中读到,这可能会导致安全错误,PHP文档here

也是如此
Warning
Do not use extract() on untrusted data, like user input (e.g. $_GET, $_FILES).

最好是专门导入变量,但是我不确定我对PHP的熟练程度是否足以遍历所有代码并弄清楚每个变量的使用位置...

快速安全地解决此问题的最佳方法是什么?

感谢您的帮助!

编辑:

这是使用变量的代码,其价值所在

if ($re_sub && $re_sec) { $content="./$re_sec/$re_sub.php";}
else if ($re_sec)    { $content="./$re_sec/index.php";}
else              { $content="./home.php";}

1 个答案:

答案 0 :(得分:1)

哇。 import_request_variables在很久以前的PHP5中消失了……希望您升级到7!

无论如何,看来您基本上是在尝试形成POST,而帖子的内容决定了用户发送到的URL。由于您不信任用户输入(或始终不应该),因此您需要根据白名单检查$ _POST数组中发送的内容。根据您拥有的部分和子部分,可以对该白名单进行硬编码,将其保存在单独的包含文件中,存储在数据库中等。

给出类似的结构

home
  sec1
    sec1sub1
    sec1sub2
    sec1sub3
  sec2
    sec2sub1
    sec2sub2
    sec2sub3
  sec3
    sec3sub1
    sec3sub2
    sec3sub3

您可以执行类似的操作,循环遍历白名单,查看是否发送了匹配的POST变量,如果已发送,则将其添加到URL。

$url="/";
$whitelist=array();
$whitelist['cars']=array("compact","sedan","sportscar");
$whitelist['trucks']=array("diesel","4x4");
$whitelist['suvs']=array("crossovers","domestic","import");

foreach($whitelist as $k=>$v){
  if(isset($_POST[$k])){
    $url=$url."/".$k;
    foreach($v as $subv){
       if(isset($_POST[$subv])){
          $url=$url."/".$subv;
       }
    }
  }
}
header("location :".$url);