2012-02-16 175 views
1

我有一個我的網站現在設置,所以用戶必須登錄(PHP + Cookies + SQL)才能看到可用的文件列表。但是,文件以可預測的目錄格式上傳,一旦用戶知道URL,就可以將所述文件暴露給未經授權的用戶。他們只是PDF文件。我很好奇我應該如何保護目錄,但我認爲它將與.htaccess。這些文件使用從數據庫中提取的簡單動態標籤進行鏈接。有沒有一種安全有效的方法來保護整個目錄,並允許登錄用戶快速查看鏈接,但將未經授權的用戶重定向到登錄屏幕?謝謝!PHP + htaccess:保護PDF文件

Zach

回答

0

首先確保您的Web服務器的目錄列表已禁用。這可確保沒有人能查看您的所有文件的列表。其次,以難以讓人猜測的方式命名文件。不要使用簡單的數據庫id(例如1.pdf等) - 要麼使用某種類型的哈希值,要麼使用一些有意義但不容易猜測的名稱。

您可以使用數據庫ID,時間戳,隨機值和標籤的組合。例如:

top-secret-document-20120216-77-33.pdf 

當然,詹姆斯·邦德將移動的敏感文件的網站外樹,並有一個PHP腳本讀取和文件輸出用於登錄的用戶。

編輯:現在你提到敏感文件,那麼你真的應該更多地考慮這一點。您可以考慮將文件移動到數據庫中。和/或在htaccess中檢查cookie。

+0

Hi Zaf, 感謝您的回覆。文件名不一定很容易猜到,但他們有敏感的信息,我希望有一個解決方案,可以完全保護他們給一個未經授權的用戶(.htaccess希望)... – Zakman411 2012-02-16 10:07:08

+0

@ Zakman411我添加了一些關於移動將文件導入數據庫。你也可以在htaccess中檢查cookies。 – zaf 2012-02-16 10:19:36

+0

如果您通過文件系統權限:'chmod 711/path/to/secret/directory'(假設所有者不是Web服務器用戶帳戶)來刪除Web服務器讀取目錄內容的能力,則哈希名稱工作得特別好。_traverse_目錄只需要'x'執行訪問。 – sarnold 2012-02-18 02:19:11

0

要做到這一點,最好的方法是使用PHP提供文件並禁止直接通過使用FilesMatch的.htaccess文件訪問PDF文件。

如果您需要我進一步闡述如何做到這一點,請告訴我。

<FilesMatch "\.(htaccess|htpasswd|pdf)$"> 
    Order Allow,Deny 
    Deny from all 
</FilesMatch> 
+0

是的,這將是偉大的 - 任何幫助? – Zakman411 2012-02-16 10:38:54

+0

Mark R的答案實際上包含了您需要的PHP材料和一個可行的重寫規則,但只要您將添加到我的代碼中的代碼添加到我的代碼中,您就不必擔心將文件放到Web根目錄之外回答你的.htaccess文件。 實際上,您應該將FilesMatch代碼放置在PDF存儲目錄中的.htaccess文件中,以免它不會無意中影響您不想拒絕訪問的文件。 – 2012-02-16 10:43:11

+0

你介意在你的回答中發帖嗎?我實際上更喜歡不把這些文件移到web根目錄之外(我使用CPanel,但我不確定這是可能的)。 – Zakman411 2012-02-17 21:33:19

3

唯一真正安全的方式做,這是把文件的工作web目錄之外,併爲他們服務通過一個PHP文件登錄的用戶。如果你希望這些文件仍然保留.pdf擴展名,你可以使用htaccess將你的php文件名改寫成你的php文件+幾個參數。

的.htaccess:

RewriteRule ^([A-Za-z0-9-]+).pdf$ index.php?filename=$1 [L,QSA] 

的index.php:

if($logged_in){ 

    $temp_file = $_GET['filename']; 

    //make sure no one is trying to inject anything funny 
    $temp_file = str_replace('.','',$temp_file);    //prevent file path manipulation 
    $temp_file = str_replace('/','',$temp_file);    //prevent file path manipulation 
    $temp_file = str_replace('%00','',$temp_file);    //prevent null char injector 
    $temp_file = preg_replace('[^A-Za-z0-9]', '', $temp_file); //just to be sure 

$file = STORAGE_DIR.$temp_file.'pdf'; 

    if (file_exists(file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
    } 
} 
else{ 

    header('Location: '.LOGIN_PAGE); 
    exit; 
} 
+0

感謝您的回覆!這看起來像是一種可能性。我唯一擔心的是我的系統使用PHP的標籤填充「href」路徑後,從數據庫中拉出列表。有沒有辦法將這種方法合併到標籤中? – Zakman411 2012-02-16 10:44:35

+1

我不確定我是否遵守,如果您正確實施此方法,則不需要更改鏈接。如果您的數據庫提取了一個名爲yourdomain.com/pdf-files/example.pdf的url,則只需將pdf文件目錄中的所有pdf文件移動到工作Web目錄之外,然後將腳本和htaccess文件安裝到pdf文件中。 – MarkR 2012-02-16 10:49:27

+0

+1爲無知:) – halfer 2012-02-16 19:37:50

0

我有一個基於PHP的下載系統的基本框架,到能夠很容易地添加用戶的安全性。如果你想看看,它是here。它使用Symfony 1.3和Propel,因此您可以將它連接到各種各樣的數據庫。沒有F/OSS許可證,但是如果你願意,我會添加一個!