Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP导入\请求\变量的正确(安全)替代方案是什么?_Php - Fatal编程技术网

PHP导入\请求\变量的正确(安全)替代方案是什么?

PHP导入\请求\变量的正确(安全)替代方案是什么?,php,Php,充分披露:我不是一个PHP程序员,而是一个Javascript/节点程序员,但我正试图帮助一位朋友修复他们网站上的一个致命PHP错误 也就是说 Fatal error: Call to undefined function import_request_variables() 我查过了,import\u request\u变量不推荐使用 相关的代码是这样的——我注意到开发人员似乎已经尝试了更现代的形式,并放弃了它 import_request_variables("pgc", "re_");

充分披露:我不是一个PHP程序员,而是一个Javascript/节点程序员,但我正试图帮助一位朋友修复他们网站上的一个致命PHP错误

也就是说

Fatal error: Call to undefined function import_request_variables()
我查过了,import\u request\u变量不推荐使用

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

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_");
我在这里找到了一个关于堆栈溢出的解决方案,建议使用相同的提取方法

extract($_GET, EXTR_PREFIX_ALL, 'p');
extract($_POST, EXTR_PREFIX_ALL, 'p');
这是正确的方法吗?我在其他帖子中读到过,例如,这可能会导致安全错误,PHP文档也是如此

最好是专门导入变量,但我不确定自己是否精通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";}
哇。导入请求变量在PHP5中消失了,那是很久以前的事了。。。希望你升级到7级

无论如何,看起来您基本上是在尝试形成POST,而POST的内容决定了用户发送到的URL。由于您不能信任用户输入,或者无论如何都不应该根据白名单检查$\u 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);

我会说-如果你在代码中做的第一件事是提取,那没关系。如果你在中间做某件事,它可能会覆盖你的一些变量。但是如果您使用的是never php版本,那么这个版本也很酷:Thank-@kuh chan,但是与GET一起使用它安全吗?下面是一个示例,其中提取可能存在安全问题:如果提取在第一行中完成,则不会有任何问题,因为$sum将被数据库值覆盖。如果您使用我建议的语法,您将完全控制导入的变量,我认为更重要的问题是,为什么要从POST/GET数据中创建变量?您已经在superglobals中填充了这些数据,为什么不按原样使用它们呢?@Dharman-我正在尝试修复其他开发人员很久以前留下的代码。我不知道他在做什么,除了抓取查询参数-content.php?sec=films,例如-然后用它加载不同的内容-见我在上面的主要帖子中的编辑。我试着使用extract,但取消了他的代码注释,但$re_sub和$re_sec却一无所获。您是否建议采用另一种方法来获取这些变量?
$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);