2011-08-06 229 views
1

您好我正在做的PHP某种文件浏览器的,我想举例来说,如果我有这样的根文件夹:如何限制在PHP中访问目录及其子目录?

/ (root) 
| 
| 
|---home 
     | 
     | 
     |---user 
      | 
      | 
      |---folder 
      | 
      |---folder1 
      | 
      |---file1 

现在我怎么会做这样user将只能浏览/ home/user /内的文件,并且无法执行例如cd ../../并去外面?非常感谢:) 这是我使用的cd命令代码:

<?php 
function cd($actualdir, $dir) { 
    //echo $actualdir.$dir."<br>"; 
    if($dir == "..") { 
     $expdir = explode("/", $actualdir); 
     $newdir = array_pop($expdir); 
     $fulldir = ""; 
     foreach($expdir as $value) { 
      $fulldir .= $value."/"; 
     } 
     $fulldir = substr($fulldir, 0, -1); 
     if($fulldir == "./rootfs/home") { 
      return "permission denied"; 
     } else { 
      return $fulldir; 

     } 

    } else { 
     if(file_exists($actualdir."/".$dir)) { 
      //echo $dir; 
      return $actualdir."/".$dir; 
     } else { 
      return "no"; 
     } 
    } 

} 

?> 

BTW的根目录,只是在web服务器根目录应该为系统根行事壳

编辑:基本上,如果用户只user让他进入到/home/user及其子目录。如果用户只有test/home/test和子目录。这是所有

回答

2

你可以使用realpath($ fulldir)让文件系统解析相对路径(如..和符号链接)。

$fulldir = $actualdir . "/" . $dir; 
$rootdir = "/home/user"; 
$length = strlen($rootdir); 

$realdir = realpath($fulldir); 
if ($realdir === false) 
    return "file does not exist"; 

if(substr($realdir, 0, $length) != $rootdir) 
    return "permission denied"; 

return "OK: $realdir"; 
+0

这一工程的一半,因为它停止'CD ..'但不是'CD ../../'or类似:(此外,杀死'CD ..'在允许迪尔斯 – pmerino

+0

你尝试在现有文件夹结构?我加了这个检查,以确保公正。 – giraff

+0

啊终于得到了它,谢谢! – pmerino

-1

最简单的解决方案?不要让用户实际上导航您的文件系统。在数据库中表示它是否是文档上传应用程序或类似文件。

所以你会有数据库中的目录(类别)和每个类别的文件(项目)。

0

终于结束了这样:

if(strpos($dir, "../../") !== false) { 
     return $dir." not allowed"; 
    } 
    if($dir == "..") { 
     $expdir = explode("/", $actualdir); 
     $newdir = array_pop($expdir); 
     $fulldir = ""; 
     foreach($expdir as $value) { 
      $fulldir .= $value."/"; 
     } 
     $userlength = strlen($user); 
     $finalength = strlen($user)+14; 
     $userdir = substr($actualdir."/".$dir, 0, $finalength); 

     $fulldir = substr($fulldir, 0, -1); 
     if (strpos($fulldir, $userdir) !== false) { 
      return $fulldir; 

     } else { 
      return "permission denied"; 
     } 
+0

你在哪里的来自+14? – giraff

+0

哦,如果我进入会发生什么'../ ..'?或者'...'(赢)?或'./ ..'? – giraff

相关问题