1. 程式人生 > >Nginx下載防盜鏈(迅雷等下載軟件)

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

() com 否則 進行 ret lac 4.2 href www.

什麽是下載盜鏈
假設我們是一個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 服務器的時間不能相差太大,否則容易出現文件一直都是過期狀態.

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