2011-03-29 89 views
3

這是的情況:我有一個Apache服務器,其中託管一個PHP程序,該程序允許用戶登錄和用戶可以上傳文件,並將他們的上傳文件分享給他人,所以,我有一個名爲「附件「在htdoc文件夾中,這是存儲用戶的附件。但我不希望人們直接訪問此文件夾,我只讓一些用戶(基於他們的用戶權限)獲取他們想要的文件,其他人可以訪問該文件...如何讓只有授權的用戶訪問某些文件?

For例如,上傳file_a,並與B,C共享。用戶B,C可以通過鏈接獲得鏈接,但用戶D即使獲得了鏈接,但他/她仍然無法下載,即使他/她正在記錄或不記錄。我怎樣才能做這個檢查?謝謝。

回答

0

三個選項:

  1. 放入一個blob文件,並跟蹤應用程序的權限。
  2. 安全性稍差,但更容易實現:不允許任何人訪問實際文件,然後使用uuid生成符號鏈接,但只允許它在下載期間持續存在。
  3. 爲每個用戶提供他們自己的目錄,只有他們有權訪問(htaccess)併爲他們應該在該目錄中訪問的每個文件創建符號鏈接。

1號是最乾淨的,但另外兩個是可行的解決方案。

2

一種解決方法是使文件夾保密(即:將其從htdocs中移出)並使用網關腳本。事情是這樣的:

$fullpath = '/path/to/your/files/'.basename($_GET['filename'])); 

// verify that the user is valid here 
// verify that file exists here 

// get the mime type 
$finfo = finfo_open(); 
$mime = finfo_file($finfo, $fullpath, FILEINFO_MIME_TYPE); 

// send it to the client 
header('Content-Disposition: attachment; filename='.basename($fullpath)); 
header('Content-Type: '.$mime); 
readfile($fullpath); 

所以,你鏈接到它想:

http://yourdomain.com/files.php?filename=foobar.zip

+0

您可以附加更多的GET參數,如通過實際時間和用戶ID生成的一些加密數據,以確保某個用戶有權下載某些文件。 例如: 'http://yourdomain.com/files.php?filename = foobar.zip&id = d90abc8374&checkstate = ff94ad0e5700' – Wh1T3h4Ck5 2011-03-29 15:49:45

2

不要讓文件在您的分貝斑點......相反,保持文件在你的web目錄之外,然後有一個php文件來檢查訪問,並且如果文件有正確的訪問權限,則將文件提供給人員。

 $file = 'file_path'; 
     header("Content-Type: image/jpeg"); 
     header("Content-Length: " . filesize($file)); 
     header("Content-Disposition: attachment; filename=\"filename.jpg\""); 
     header('Cache-Control: private'); 
     header('Pragma: private'); 
     $fp = fopen($file,"rb"); 
     fpassthru($fp); 
     fclose($fp); 
     exit(); 
相關問題