Php 将用户输入的相对URL与preg_匹配匹配

Php 将用户输入的相对URL与preg_匹配匹配,php,Php,我有一个项目,需要使用用户输入将文件包含到PHP脚本中。用户输入可以是任何相对URL(例如:/folder1/folder2/file.jpg,/folder1/folder2/) 以下是检查输入是否正常的傻瓜式regexp: if(preg_match('/^(\/[-_a-zA-Z0-9]+)+\/?$/D', $_GET['loc'])) { //Location is good! } 显然,我希望避免任何本地文件包含攻击。在我得到白名单建议而不是像上面那样包含文件之前,我有100

我有一个项目,需要使用用户输入将文件包含到PHP脚本中。用户输入可以是任何相对URL(例如:/folder1/folder2/file.jpg,/folder1/folder2/)

以下是检查输入是否正常的傻瓜式regexp:

if(preg_match('/^(\/[-_a-zA-Z0-9]+)+\/?$/D', $_GET['loc']))
{
   //Location is good!
}

显然,我希望避免任何本地文件包含攻击。在我得到白名单建议而不是像上面那样包含文件之前,我有1000个文件,因此switch语句或if/else不起作用。

你可以将所有要包含的文件放在一个目录中,比如说
/x/y/data
然后进行如下检查:

$filename = realpath("/x/y/data/$_POST[location]");

// Make sure that $filename is under /usr/local/data    
if ('/x/y/data/' =  = substr($filename, 0, 10)) {

// safe..include the file.

} else {    

// not safe..reject.   

}

我会建立一个所有允许的文件的白名单,并且只允许与之匹配的文件。如果出于某种原因,这不实用,那么我会不情愿地尝试某种正则表达式(但路径分隔符因平台而异,所以祝你好运)。一定要用php指令open_basedir锁定这个东西。这至少可以在发生事故时将损失降到最低