nginx 防盜鏈配置


背景:防止第三方引用鏈接訪問我們的圖片,消耗服務器資源和網絡流量,我們可以在服務器上做防盜鏈限制。

實現防盜鏈的方式有兩種:refer方式和簽名方式。 

refer方式實現防盜鏈

工作模塊:ngx_http_referer_module。

作用變量:$invalid_referer,全局變量。

配置域:server, location

配置:

 
         

server {
   listen 80;
   server_name www.imcati.com refer-test.imcati.com;
   root /usr/share/nginx/html;
   location ~*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        valid_referers none blocked www.imcati.com;
        if ($invalid_referer) {
            return 403;
           }
      }
   }

valid_referers: 指定資源訪問是通過以下幾種方式為合法,即白名單。
none:允許缺失的頭部訪問。
blocked:允許referer沒有對應值的請求。
server_names:若referer站點域名與server_name中本機配的域名一樣允許訪問。

訪問refer-test.imcati.com/index.html測試:

index.html

<!DOCTYPE html>
<html>
<head>
<title>test</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<p>image address:<a href="http://www.imcati.com/test.jpg">image</a></p>
</body>
</html>

點擊圖片地址:

 

可以把none去掉,防止別人通過右鍵另存圖片地址,當然別人也可以通過偽造refer來進行訪問。

那么如何從根本上解決防盜鏈問題呢?

我們可以通過簽名方式實現。

簽名方式實現防盜鏈

工作模塊:第三方模塊HttpAccessKeyModule。

配置:

server {
    listen       80;
    server_name  www.imcati.com refer-test.imcati.com;
    root /usr/share/nginx/html;

    location ~*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        accesskey on;
        accesskey_hashmethod md5;
        accesskey_arg "key";
        accesskey_signature "mypass$remote_addr";
    }
}
}

accesskey on | off: 模塊開關
accesskey_hashmethod md5|sha—1: 簽名加密方式
accesskey_arg: GET參數名稱
accesskey_sign: 加密規則

$sign = md5('mypass' . $_SERVICE['REMOTE_ADDR']);
//img src=/test.png?key=<?=$sign?>

擴展:

secure_link 實現文件防盜鏈

工作模塊:http_secure_link_module 模塊。

配置段:location。

配置:

server {
  listen 80;
  server_name www.imcati.com;
  root /usr/share/nginx/html;

  location ~* \.(rar|zip|7z|tar)?$ {
    #這里配置了2個參數一個是st,一個是e
    secure_link $arg_st,$arg_e;
    #st的哈希格式為自定義秘鑰+url+e,e為時間戳單位s,url為請求地址
    secure_link_md5 key$uri$arg_e;
    if ( $secure_link = "" ) {
    #資源不存在或哈希比對失敗
    return 403;
      }
   if ( $secure_link = "0" ) {
    #時間戳過期
    return 403;
      }
  }
}

secure_link : secure_link md5_hash [,expiration_time] 

secure_link_md5 : secure_link_md5 secret_token_concatenated_with_protected_uri 

Java生成防盜鏈地址(使用Apache commons-codec jar包)
注意:進行md5運算時,視頻名字前加斜桿 如:/link.zip

public static void main(String[] args) {
String time = String.valueOf(System.currentTimeMillis() / 1000 + Long.valueOf(600));// +600代表600秒后地址失效
String md5 = Base64.encodeBase64URLSafeString(DigestUtils.md5("key" + "/link.zip" + time));
return "http://127.0.0.1/link.zip?st=" + md5 + "?e=" + time;
}

最終請求url:http://127.0.0.1/link.zip?st=xxxxxxx?e=xxxxxx


免責聲明!

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



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