2012-12-23 68 views
0

我有一個網站,其中包含用戶登錄和會話。我想讓我的用戶上傳文件到網絡服務器,但只有他們可以登錄。以PHP保護上傳的文件

我明白,如果我上傳到某種公共網頁目錄中的文件將通過仍然可以訪問:

http://www.mydomain.com/files/thefile.pdf

不過,我想我可以將文件存儲在目錄正上方我的公共HTML根(說它是/ mnt/content/web/html)。

所以,我可以做一個名爲目錄(到/ mnt /內容/ WEB/uniqueidfortheuser)和存儲我的文件存在,然後通過PHP的語法引用文件:

(../uniqueidfortheuser/thefile。 PDF)。

我的問題 - 這是否足夠安全或有我忽略的東西? uniqueidfortheuser的名字將被存儲在數據庫中並且對用戶來說是未知的,並且他們必須有有效的會話才能訪問他們的文件夾的唯一名稱。而且我不認爲他們能夠從網絡中調用文件夾中的任何文件。

回答

1

更好 - 當用戶上傳文件時,包含文件的user_ID。然後,當您嘗試檢索文件時,請確保它屬於用戶。

因此,即使他們猜測另一個文件 - 它無關緊要!

您需要使用readfile:

function user_files($file_name = "") 
    { 
     // Check user is logged in 
     if ($user->logged_in()) 
     { 
      // Check file_name is valid and only contains valid chars 
      if ((preg_match('^[A-Za-z0-9]{1,32}+[.]{1}[A-Za-z]{3,4}$^', $file_name)) 
      { 
       // Now check file belongs to user - PSUEDOCODE 
       if ($filename == $user->records) 
       { 
        header('Content-Type: '.get_mime_by_extension(YOUR_PATH.$file_name))); 
        readfile(YOUR_PATH.$file_name); 
       } else { 
        echo 'You do not have access to this file'; 
       } 
      } 
     } 
    } 

周圍有一個目錄遍歷等一些問題 - 所以你需要一個像我所使用的preg_match

+0

哇,真棒答案先檢查$ FILE_NAME。我現在會試試這個。萬分感謝! –