2014-02-05 120 views
0

我使用下面的代碼保護的zip文件如何保護PHP文件和下載文件鏈接

<?php 
$filename = $_GET["id"]; 

$path = "directory/{$filename}.zip"; 

$mm_type="application/octet-stream"; 

header("Pragma: public"); 

header("Expires: 0"); 

header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 

header("Cache-Control: public"); 

header("Content-Description: File Transfer"); 

header("Content-Type: " . $mm_type); 

header("Content-Length: " .(string)(filesize($path))); 

header('Content-Disposition: attachment; filename="'.basename($path).'"'); 

header("Content-Transfer-Encoding: binary\n"); 

readfile($path); 

exit(); 

?> 

直接下載鏈接是對代碼足以保護直接下載鏈接。我不希望鏈接通過IDM或其他下載管理器可見。

現在如果我在調用上面的php代碼時沒有輸入id或者輸入扭曲代碼,服務器會發送一些錯誤的php文件,指出找不到指定的文件。但該文件揭示了文件的實際位置。在這種情況下如何保護php文件。有什麼我可以在htaccess文件中做的嗎?

我是php新手。 謝謝

+0

爲什麼有人知道這個位置很重要?如果你想保護訪問,那麼要求認證將是一個更好的選擇。如果您不希望人們在不通過腳本的情況下下載文件,則該文件本身應該位於網絡空間之外。 – cHao

回答

0

我建議修改您的現有代碼,以便一旦你建立了文件名,你檢查文件是否存在,如果不提供HTTP 404錯誤。

這裏有一個改變了代碼的一個粗略的輪廓上述工作由:

$path = "directory/{$filename}.zip"; 
if(!file_exists($root . '/' . $path)) { 
    header('HTTP/1.0 404 Not Found'); 
    echo "<h1>404 Not Found</h1>"; 
    echo "The page that you have requested could not be found."; 
    exit(); 
} 

你會注意到,我在裏面加了$根變量。這需要使用站點文檔根目錄的完整路徑進行設置,因爲file_exists函數需要完整的文件系統路徑才能工作(不僅僅是相對路徑)。

+0

我嘗試了像http:// localhost/ (在xampp上使用)的完整路徑,但file_exist函數總是返回false。沒有明白爲什麼? – user3185333

+0

因此,您要查找的路徑不是域,或者「本地主機」是您的服務器存儲中文件本身所在的位置。因此,在Unix下,這可能類似於/ var/www/sitename/htdocs /或在Windows上它可能是D:/ websites/sitename/documents /等。 您可以通過使用預設$ _SERVER變量 - 但這並不總是準確的。嘗試用$ _SERVER ['DOCUMENT_ROOT']替換$ root,看看它是否有幫助。 – steve

2

最好的,我想如果你從Apache文檔根目錄移出該目錄(如果你能) 或者你可以在目錄/的.htaccess

太禁用與.htaccess中的目錄從所有

否認

喜歡這裏:deny direct access to a folder and file by htaccess

,如果你想隱藏的錯誤信息,您可以使用的error_reporting(0)你PHP(或函數之前@符號) 或只是檢查與file_exists的文件(...)

但首先你必須分析你的輸入數據的安全性, 因爲如果你的URL是這樣的:ID = ../.. /文件名任何人都可以從你的服務器

下載任何文件,例如,你必須至少去除..從輸入字符串:

$filename = str_replace('..', '', $filename); 

如果不這樣,螞蟻$ _GET [「身份證」] ==「../filename.ext」,比你$路徑是怎麼回事成爲'directory /../ filename.ext',這可能是危險的

+0

感謝好友 請你詳細解釋最後一行關於解析輸入數據的問題。我沒有得到... PLZ。 – user3185333

+0

完成。如果你在/ var/www /和你的路徑是'$ path ='dir /'。 $ filename'但是'$ filename =='../../../ etc/passwd''那麼用戶將擁有你的/ etc/passwd文件 – feco