Nginx下載防盜鏈(迅雷等下載軟件)

什麼是下載盜鏈

 
假設咱們是一個B站,有些視頻資源是能夠提供給用戶下載的。這時迅雷等其餘下載軟件,也提供下載該視頻的服務,
可是迅雷很不厚道的,將咱們的下載資源提供給他的用戶,下載。佔用咱們的帶寬來服務他的用戶,這是絕對不能夠忍了的。
 
使用來源判斷根本不靠譜,只能防止一些小白站點的盜鏈,迅雷之類的下載工具徹底無效,若是你是
nginx 的話,使用 secure link 完美解決這個問題,遠離迅雷.
 
本文僅用於下載服務器,不適用於圖片防盜鏈.
 
原理

  1. 用戶訪問 down.php
  2. down.php 根據 secret 密鑰、過時時間、文件 uri 生成加密串
  3. 將加密串與過時時間做爲參數跟到文件下載地址的後面
  4. nginx 下載服務器接收到了客戶端傳來的加密串與過時時間,同時本身也使用配置文件裏的密鑰,也根據過時時間,文件uri 生成本身的加密串
  5. 將用戶傳進來的加密串與本身生成的加密串進行對比,一致容許下載,不一致 403整個過程實際上很簡單,
 
secure link module

 
例子:
location /s/ {
    secure_link $arg_md5,$arg_expires;
    secure_link_md5 "$secure_link_expires$uri$remote_addr secret";

    if ($secure_link = "") {
        return 403;
    }

    if ($secure_link = "0") {
        return 410;
    }

    ...
}

 

secure_link 
  • 實際是由客戶端傳來的,加密串和過時時間 的變量
  • 當nginx secure_link_md5 指令作完內部檢查
    • 先後臺的加密串不一致
      • 設置 secure_link = ""
    • 先後臺的加密串一致
      • 檢查是否過時
        • 過時
          • 設置secure_link="0"
        • 未過時
          • 設置secure_link="1"
 
secure_link_md5
  • 是將所需參數傳給後臺處理
    • 連接過時時間
    • 連接URI
    • 遠程地址
 
 
部署

 
安裝
將http_secure_link_module 加到nginx中
不須要下載第三方模塊
# ./configure --with-http_secure_link_module \
--prefix=/usr/local/nginx-1.4.2 --with-http_stub_status_module
# make
# make install

 

配置nginx
server {
     listen 80;
     server_name s1.down.ttlsa.com;
     access_log /data/logs/nginx/s1.down.ttlsa.com.access.log main;
     index index.html index.php index.html;
     root /data/site/s1.down.ttlsa.com;
     location / {
          secure_link $arg_st,$arg_e;
          secure_link_md5 ttlsa.com$uri$arg_e;
     if ($secure_link = "") {
          return 403;
     }
     if ($secure_link = "0") {
          return 403;
     }
 
     }
}

 

 
PHP下載頁面
<?php
# 做用:生成 nginx secure link 連接
# 站點: www.ttlsa.com
# 做者:涼白開
# 時間: 2013-09-11
$secret = 'ttlsa.com'; # 密鑰
$path = '/web/nginx-1.4.2.tar.gz'; # 下載文件
# 下載到期時間,time 是當前時間,300 表示 300 秒,也就是說從如今到 300 秒以內文件不過時
$expire = time()+300;
# 用文件路徑、密鑰、過時時間生成加密串
$md5 = base64_encode(md5($secret . $path . $expire, true));
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);
# 加密後的下載地址
echo '<a href=http://s1.down.ttlsa.com/web/nginx-1.4.2.tar.gz?st='.$md5.'&e='.$expire.'>nginx-1.4.2</a>';
echo '<br>http://s1.down.ttlsa.com/web/nginx-1.4.2.tar.gz?st='.$md5.'&e='.$expire;
?>

 

測試
打開 http://test.ttlsa.com/down.php 點擊上面的鏈接下載
下載地址以下:
http://s1.down.ttlsa.com/web/nginx-1.4.2.tar.gz?st=LSVzmZllg68AJaBmeK3E8Q&e=1378881984
頁面不要刷新,等到 5 分鐘後在下載一次,你會發現點擊下載會跳轉到 403 頁面。
 
注意事項

  • 密鑰防止泄露、以及常常更新密鑰
  • 下載服務器和 php 服務器的時間不能相差太大,不然容易出現文件一直都是過時狀態.
相關文章
相關標籤/搜索