2015-06-27 58 views
4

我有问题。我有一个PHP脚本(PHP 5),它将URL参数$_GET['file']保存到变量$file。现在有办法检查这个变量是否是一个有效的文件名(例如:hello.txt而不是/../otherdir/secret.txt)。因为没有检查$ file变量,黑客就可以使用/../来到我的父文件夹。检查字符串是否有效文件名

+1

您是否尝试过的东西?或写了一些伪代码?或做了一些研究? – Rizier123

+1

只需删除'/' – adeneo

回答

4

您可以在PHP的basename功能看,它会与文件名返回,见下面的例子:

$file = '../../abc.txt'; 
echo basename($file); //output: abc.txt 

注:basename让你从路径字符串的文件名,不论文件的实际存在与否。可以使用file_exists函数来验证文件物理存在。

+0

非常感谢! <3 – askerno

+3

作为一个方面说明,这并不真正检查文件名是否为“有效”。它只是简单地删除最后一个PHP目录分隔符。我明白OP的意图是要做到这一点。但其他人可能会认为这证实了一些事情 - 事实并非如此。 –

-1

会这样吗? http://php.net/manual/en/function.file-exists.php E.g,你的情况,

if(file_exists(str_replace("../", "", $file))){ 
    // valid 
} 
else{ 
    // invalid 
} 

文件可以在子文件夹,但不是在父文件夹。

但是,如果你在文件名有兴趣,

if(file_exists(pathinfo($file, PATHINFO_BASENAME))){ 
    // valid 
} 
else{ 
    // invalid 
} 

应该工作。

+0

之前的所有内容即可正常工作,但我认为kamal pal的版本更加紧凑​​,我不想转到子文件夹..但是也要感谢您<3 – askerno

-2

我会想结合卡迈勒朋友的和Pancake_M0nster的回答创建简单:

if(file_exists(basename($file))){ 
    // valid 
} 
else{ 
    // invalid 
} 
+0

结合两种不同的解决方案并不总是提供更好或更有效的答案。有时候,它甚至会破坏功能:在这种情况下,只有'$ file'与主脚本位于同一目录时,结果才会是“真”。 –