2010-02-05 106 views
1

用户输入相对URL我有使用用户输入包含文件到一个PHP脚本需要的项目。用户输入可以是任何相对URL(EX:/folder1/folder2/file.jpg,/资料夹/文件夹2 /)结构匹配的preg_match

请问以下是一个很简单的正则表达式来检查,如果输入的是理智:

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

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

回答

2

你可以把所有的文件将被包含在一个单一的目录执行的话/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. 

} 
1

我会构建所有允许文件的白名单,只允许与之相匹配的文件。如果由于某种原因这样做不实际,那么我不情愿尝试某种类型的正则表达式(但路径分隔符根据平台而不同,所以祝你好运)。一定要用php指令open_basedir来锁定这个东西。这至少可以减少发生事件时的损害。