全面披露:我不是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";}
答案 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);