2011-08-06 179 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

相關問題