2011-11-25 200 views
0

我對文件夾和文件權限的工作方式有一些疑問。說我有用戶目錄以外的「保護」,如下..php文件夾和文件權限

users 
    -- usera 
    -- docs 
    -- userb 
    -- docs 
protected 

我不想誰沒有權限,訪問用戶A的目錄任何用戶B。另外,我不希望任何人通過url鏈接訪問目錄目錄。基本上我只想讓用戶能夠訪問他們自己的目錄,而不是其他人。如何做呢?

謝謝!

+1

這需要更多的上下文。訪問如何? 「受保護」的相關性是什麼?在讀取或下載文件時訪問 – deceze

+0

。保護是一個目錄,具有.htaccess'拒絕所有'託管php腳本。 – twb

+0

由於您談論的是「權限」,這通常是文件系統的事情,所以這仍然有點令人困惑。當你通過網絡服務器訪問文件時,你似乎在談論更多的抽象權限,或者你是? – deceze

回答

1

我在這裏回答了一個類似的問題limiting users to subdirectories,您應該可以根據自己的需要進行調整,我也在這裏複製了它。

的download.php

<?php 
/** Load your user assumed $user **/ 

$file = trim($_GET['file']); 

/** Sanitize file name here **/ 

if (true === file_exists('/users/user'.$user->id.'/'.$file)) { 
    //from http://php.net/manual/en/function.readfile.php 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="'.$file.'"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
} else { 
    throw new Exception('File Not Found'); 
} 

的.htaccess要使用/download.php?file=filename.ext拒絕所有直接下載文件

deny from all 

這樣,你會鏈接到文件夾和它只會從當前用戶的用戶目錄下載該文件。

您會希望確保您清理輸入文件名,以便您不易受目錄橫向漏洞利用攻擊。

+0

嗨,這會給服務器帶來額外的負擔嗎?使100個用戶一次下載不同的1mb文件(100x100mb)會導致內存或處理能力癱瘓? – twb

+0

yup ..我想我會使用這種方法,與xsendfile一起。乾杯 – twb

1

沒有更多信息可以繼續,我的建議是確保用戶目錄位於Web根目錄之上。這將阻止他們被鏈接到。然後創建一個驗證用戶是誰的PHP腳本。一旦您知道登錄用戶的身份,您可以使用fpassthru()(http://php.net/fpassthru)或類似功能將文檔交付給用戶。

+0

您好,還需要其他什麼信息?有沒有其他的方法,因爲我會認爲使用passthr會給服務器帶來很大的處理負擔? – twb

+0

在關於速度和服務器資源使用情況的fpassthru PHP頁面上有一些有趣的評論。使用fread可能實際上更快。您應該瀏覽該頁面上的評論以獲取一些好的提示。如果你不想使用PHP函數,你可以看看像mod-auth-token http://code.google.com/p/mod-auth-token/ – Daniel

+0

mod-auth-token看起來不錯!但我不能在共享主機上得到這個? – twb