<轉>PHP防止下載鏈接被盜用(以及各種花式授權下載)


說到下載文件,就出現了一個問題,難道非要給別人一個那個文件的鏈接才可以么?這樣一來,別人豈不是可以輕松的知道了那個文件在你服務器的位置?還有,怎樣才可以防止別人用迅雷來下載你的文件,讓你的服務器不堪重負?

經過我這兩天在網上不斷的尋覓,加上自己的一些思考。想到了一些解決的方法。

第一:防止盜鏈

現在覺得這個其實很簡單,只是很多人將它弄復雜了。

原理是這樣的:當服務器要我們下載文件的時候,我們會拿到一個鏈接,然后我們通過這個鏈接找到這個文件,然后將它下載下來。那么也就是說這個鏈接必須要有的,那么如何防止盜鏈呢?那就是給你的鏈接並不是真正的文件鏈接了。這一點很容易想到。那么不給你真正的鏈接又怎樣讓你下載文件呢?這是個問題。

我們再想,我們在用php做網頁的時候,總是會把php代碼穿插在HTML代碼中間,然后用php去生成剩下的代碼,然后傳給客戶端。也就是說客戶端會接受到我們php腳本運行的結果。想到這里,問題就簡單了很多。

也就是說:如果我的php腳本運行的結果就是你要下載的文件可不可以呢?

答案是肯定的,這樣我們就實現了文件防盜鏈。就是說你能得到的鏈接就是這個php文件,然后再由這個百變php文件變成你想要的文件來供你下載。

思路理順了,代碼就好寫了:

$FileAddress : 文件的相對路徑。

$DownloadName : 文件下載到客戶端的名字。

if(file_exists($FileAddress) && $file=fopen($FileAddress,”r”)) //首先要判斷文件是否存在,如果文件跟本不存在的話,后邊的代碼也是白費。
{
Header(“content-type:application/octet-stream”); //聲明文件類型,這里是為了讓客戶端下載它,而不是打開它,所以聲明為未知二進制文件。否則客戶端會根據其文件類型在線打開它。
Header(“content-Length:”.filesize($FileAddress)); //聲明文件的大小,告訴客戶端這個文件的大小,否則客戶端下載的時候看不到進度。
Header(“content-disposition:attachment;filename=”.$DownloadName); //聲明文件名,這里就是告訴客戶端它要下載的文件的名字,否則名字就會是你php文件的名字。
echo fread($file,filesize($FileAddress)); //這里就是將加載的文件echo出來,因此這個php文件不能出現其他任何的文字,就是說這里若是出現了任何其他的輸出的話都會輸出到客戶端下載的文件里。
fclose($file); //最后關閉句柄。
}

上邊這些代碼就成功的勝任了防止盜鏈的任務,只需要定義那兩個變量就可以。那兩個變量可 以通過GET來獲取,比如我們將文件實際鏈接與它的編號在數據庫中做一個映射,我們只需要GET到一個文件ID即可對文件進行下載,保證了我們真實文件地 址的安全。當然也可以是對文件真實鏈接進行加密之類的,總之就是不要講真實鏈接再放到客戶端可以看到的地方就好,不然真的就是呵呵。

第二:防止迅雷下載

其實通過上邊的代碼,我們只能做到鏈接的隱藏,並不能防止客戶端用迅雷等工具對其進行下載。那么如何做到防止用迅雷等工具下載它呢?

正如我之前所說我們可以通過各種途徑來使php文件得到這個文件的路徑,那么,我們只要不要將這些信息加在鏈接里邊就好了。比如:可以通過POST來傳輸文件的ID,可以通過session來傳輸文件的ID。

這就是我所說的:花式授權下載。

1.我們可以在下載的前導頁寫入客戶端session,來儲存其授權碼,將文件ID也儲存進去,然后再在下載的php里加入驗證session的代碼,這樣就算客戶端將連接輸入迅雷下載也是沒有用的。

2.我們可以在下載的前導頁加入一個隱藏的表單,用POST提交給實現下載功能的php,這樣也能達到防止第三方下載工具下載的目的。

總之這樣的方法很多,我還有很多東西沒有學到,目前能想出來的方法就這兩種,主要的思路就是將要下載文件的信息和鏈接分開來,這樣就可以達到只憑一個鏈接無法下載文件的目的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM