2009-08-26 34 views
0

我正在研究一个脚本,允许用户浏览给定的目录,这不是该文件所在的目录,而是设置在一个变量中。列出文件夹内容:如何防止用户超出授权目录?

define('FOLDER', '../_files/'); 

现在,百页html允许浏览该文件夹内的子文件夹。我使用“dir”GET变量来告诉我的脚本要显示哪个子文件夹的内容,并使用相同的dir变量允许向上移动的“..”链接。

我设置了一个检查,如果$ _GET ['dir']等于文件夹,它不应该显示该“..”链接。但是,容易混淆位于url中的变量,无论我在哪里做,我的脚本允许浏览授权文件夹之上。不完全是安全的情况...

所以我想我应该检查授权目录的完整本地路径对所请求的目录,如果后者不在授权的内部,不显示“..” 。

但我不知道该怎么做。任何提示或指针,将不胜感激。谢谢

+0

即使标题不送人,这基本上是因为http://stackoverflow.com/questions/1066930/sending-variables-同样的问题for-php-filesystem-functions-with-form-submission/ – deceze 2009-08-26 08:44:11

+0

是的,类似的问题/解决方案。 – 2009-08-26 08:46:56

回答

1

你可能想看看realpath()

$foo = realpath($foo); 
if (substr($foo, 0, 8) != '/my/path') { 
    return false; 
} 

...或类似的东西。

复制自this answer,因为我觉得这个问题比较好。

+0

谢谢。 $ foo是请求的目录,并且/ my/path /授权的,对吧? – pixeline 2009-08-26 08:57:09

+0

没错。 :) – deceze 2009-08-26 08:58:38

0

或者你可以使用正则表达式

$requested = realpath($foo); 
$allowedpath = '/path/to/allowed'; 

$regex = '/^'.addslashes($allowedpath).'\/?.*$/'; 

if (!preg_match($regex, $requested)) { 
    return false; 
} 
+0

您应该使用preg_quote()而不是addslashes()。 – 2009-08-26 09:34:03

+0

preg_quote()不会替代我的斜线,因为正则表达式的开始和结束字符几乎可以是任何东西,但是您可以将它另外添加到addslashes() – stefita 2009-08-26 10:01:32

相关问题