自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聽說你的資源被盜用了,那你知道 Nginx 怎么防盜鏈嗎?

新聞 應(yīng)用安全
本文就來說一個主要提供變量并修改變量的值的模塊,也就是我們要講的防盜鏈模塊:referer 模塊。

 

本文就來說一個主要提供變量并修改變量的值的模塊,也就是我們要講的防盜鏈模塊:referer 模塊。

簡單有效的防盜鏈?zhǔn)侄?/h2>

場景

如果做過個人站點的同學(xué),可能會遇到別人盜用自己站點資源鏈接的情況,這就是盜鏈。說到盜鏈就要說一個 HTTP 協(xié)議的 頭部,referer 頭部。當(dāng)其他網(wǎng)站通過 URL 引用了你的頁面,用戶在瀏覽器上點擊 URL 時,HTTP 請求的頭部會通過 referer 頭部將該網(wǎng)站當(dāng)前頁面的 URL 帶上,告訴服務(wù)器本次請求是由誰發(fā)起的。

例如,在谷歌中搜索 Nginx 然后點擊鏈接:

<img src="https://s3plus.meituan.net/v1/mss_f32142e8d47149129e9550e929704625/yzz-test-image/20200614144801.229887" />

在打開的新頁面中查看請求頭會發(fā)現(xiàn),請求頭中包含了 referer 頭部且值是 https://www.google.com/ 。

<img src="https://s3plus.meituan.net/v1/mss_f32142e8d47149129e9550e929704625/yzz-test-image/20200614143843.338211" />

像谷歌這種我們是允許的,但是有一些其他的網(wǎng)站想要引用我們自己網(wǎng)站的資源時,就需要做一些管控了,不然豈不是誰都可以拿到鏈接。

目的

這里目的其實已經(jīng)很明確了,就是要拒絕非正常的網(wǎng)站訪問我們站點的資源。

思路

  • invalid_referer 變量

    • referer 提供了這個變量,可以用來配置哪些 referer 頭部合法,也就是,你允許哪些網(wǎng)站引用你的資源。

referer 模塊

要實現(xiàn)上面的目的,referer 模塊可得算頭一號,一起看下 referer 模塊怎么用的。

  • 默認(rèn)編譯進 Nginx,通過 --without-http_referer_module 禁用

referer 模塊有三個指令,下面看一下。

  1. Syntax: valid_referers none | blocked | server_names | string ...; 
  2. Default: — 
  3. Context: server, location 
  4.  
  5. Syntax: referer_hash_bucket_size size; 
  6. Default: referer_hash_bucket_size 64;  
  7. Context: server, location 
  8.  
  9. Syntax: referer_hash_max_size size; 
  10. Default: referer_hash_max_size 2048;  
  11. Context: server, location 

 

  1. valid_referers 
  2. referer_hash_bucket_size 
  3. referer_hash_max_size 

這里面最重要的是 valid_referers 指令,需要重點來說明一下。

valid_referers 指令

可以同時攜帶多個參數(shù),表示多個 referer 頭部都生效。

參數(shù)值

  • none

    • 允許缺失 referer 頭部的請求訪問
  • block:允許 referer 頭部沒有對應(yīng)的值的請求訪問。例如可能經(jīng)過了反向代理或者防火墻
  • server_names:若 referer 中站點域名與 server_name 中本機域名某個匹配,則允許該請求訪問
  • string:表示域名及 URL 的字符串,對域名可在前綴或者后綴中含有 * 通配符,若 referer 頭部的值匹配字符串后,則允許訪問
  • 正則表達式:若 referer 頭部的值匹配上了正則,就允許訪問

invalid_referer 變量

  • 允許訪問時變量值為空
  • 不允許訪問時變量值為 1

實戰(zhàn)

下面來看一個配置文件。

  1. server { 
  2.     server_name referer.ziyang.com; 
  3.     listen 80
  4.  
  5.     error_log logs/myerror.log debug; 
  6.     root html; 
  7.     location /{ 
  8.         valid_referers none blocked server_names 
  9.                        *.ziyang.com www.ziyang.org.cn/nginx/ 
  10.                        ~\.google\.; 
  11.         if ($invalid_referer) { 
  12.                 return 403
  13.         } 
  14.         return 200 'valid\n'
  15.     } 

那么對于這個配置文件而言,以下哪些請求會被拒絕呢?

  1. curl -H 'referer: http://www.ziyang.org.cn/ttt' referer.ziyang.com/ 
  2. curl -H 'referer: http://www.ziyang.com/ttt' referer.ziyang.com/ 
  3. curl -H 'referer: ' referer.ziyang.com/ 
  4. curl referer.ziyang.com/ 
  5. curl -H 'referer: http://www.ziyang.com' referer.ziyang.com/ 
  6. curl -H 'referer: http://referer.ziyang.com' referer.ziyang.com/ 
  7. curl -H 'referer: http://image.baidu.com/search/detail' referer.ziyang.com/ 
  8. curl -H 'referer: http://image.google.com/search/detail' referer.ziyang.com/ 

我們需要先來解析一下這個配置文件。 valid_referers 指令配置了哪些值呢?

  1. valid_referers none blocked server_names 
  2.         *.ziyang.com www.ziyang.org.cn/nginx/ 
  3.         ~\.google\.; 
  • none:表示沒有 referer 的可以訪問
  • blocked:表示 referer 沒有值的可以訪問
  • server_names:表示本機 server_name 也就是 referer.ziyang.com 可以訪問
  • *.ziyang.com:匹配上了正則的可以訪問
  • www.ziyang.org.cn/nginx/:該頁面發(fā)起的請求可以訪問
  • ~\.google\.:google 前后都是正則匹配

下面就實際看下響應(yīng):

  1. # 返回 403,沒有匹配到任何規(guī)則 
  2. ➜  ~ curl -H 'referer: http://www.ziyang.org.cn/ttt' referer.ziyang.com/ 
  3. <html> 
  4. <head><title>403 Forbidden</title></head> 
  5. <body> 
  6. <center><h1>403 Forbidden</h1></center> 
  7. <hr><center>nginx/1.17.8</center> 
  8. </body> 
  9. </html> 
  10. ➜  ~ curl -H 'referer: http://image.baidu.com/search/detail' referer.ziyang.com/ 
  11. <html> 
  12. <head><title>403 Forbidden</title></head> 
  13. <body> 
  14. <center><h1>403 Forbidden</h1></center> 
  15. <hr><center>nginx/1.17.8</center> 
  16. </body> 
  17. </html> 
  18. # 匹配到了 *.ziyang.com 
  19. ➜  ~ curl -H 'referer: http://www.ziyang.com/ttt' referer.ziyang.com/ 
  20. valid 
  21. ➜  ~ curl -H 'referer: http://www.ziyang.com' referer.ziyang.com/ 
  22. valid 
  23. # 匹配到了 server name 
  24. ➜  ~ curl -H 'referer: http://referer.ziyang.com' referer.ziyang.com/ 
  25. valid 
  26. # 匹配到了 blocked 
  27. ➜  ~ curl -H 'referer: ' referer.ziyang.com/ 
  28. valid 
  29. # 匹配到了 none 
  30. ➜  ~ curl referer.ziyang.com/ 
  31. valid 
  32. # 匹配到了 ~\.google\. 
  33. ➜  ~ curl -H 'referer: http://image.google.com/search/detail' referer.ziyang.com/ 
  34. valid 

防盜鏈另外一種解決方案:secure_link 模塊

referer 模塊是一種簡單的防盜鏈?zhǔn)侄?,必須依賴瀏覽器發(fā)起請求才會有效,如果攻擊者偽造 referer 頭部的話,這種方式就失效了。

secure_link 模塊是另外一種解決的方案。

它的主要原理是,通過驗證 URL 中哈希值的方式防盜鏈。

基本過程是這個樣子的:

  • 由服務(wù)器(可以是 Nginx,也可以是其他 Web 服務(wù)器)生成加密的安全鏈接 URL,返回給客戶端
  • 客戶端使用安全 URL 訪問 Nginx,由 Nginx 的 secure_link 變量驗證是否通過

原理如下:

  • 哈希算法是不可逆的
  • 客戶端只能拿到執(zhí)行過哈希算法的 URL
  • 僅生成 URL 的服務(wù)器,驗證 URL 是否安全的 Nginx,這兩者才保存原始的字符串
  • 原始字符串通常由以下部分有序組成:

    • 資源位置。如 HTTP 中指定資源的 URI,防止攻擊者拿到一個安全 URI 后可以訪問任意資源
    • 用戶信息。如用戶的 IP 地址,限制其他用戶盜用 URL
    • 時間戳。使安全 URL 及時過期
    • 密鑰。僅服務(wù)器端擁有,增加攻擊者猜測出原始字符串的難度

模塊:

  • ngx_http_secure_link_module

    • 未編譯進 Nginx,需要通過 --with-http_secure_link_module 添加
  • 變量

    • secure_link
    • secure_link_expires
  1. Syntax: secure_link expression; 
  2. Default: — 
  3. Context: http, server, location 
  4.  
  5. Syntax: secure_link_md5 expression; 
  6. Default: — 
  7. Context: http, server, location 
  8.  
  9. Syntax: secure_link_secret word; 
  10. Default: — 
  11. Context: location 

變量值及帶過期時間的配置示例

  • secure_link

    • 值為空字符串:驗證不通過
    • 值為 0:URL 過期
    • 值為 1:驗證通過
  • secure_link_expires

    • 時間戳的值

命令行生成安全鏈接

  • 生成 md5
  1. echo -n '時間戳URL客戶端IP密鑰' | openssl md5 -binary | openssl base64 | tr +/ - | tr -d = 
  • 構(gòu)造請求 URL
  1. /test1.txt?md5=md5生成值&expires=時間戳(如 2147483647) 

Nginx 配置

  • secure_link &dollar;arg_md5,$arg_expires;

    • secure_link 后面必須跟兩個值,一個是參數(shù)中的 md5,一個是時間戳
  • secure_link_md5 \"&amp;dollar;secure_link_expires&dollar;uri&dollar;remote_addr secret";

    • 按照什么樣的順序構(gòu)造原始字符串

實戰(zhàn)

下面是一個實際的配置文件,我這里就不做演示了,感興趣的可以自己做下實驗。

  1. server { 
  2.     server_name securelink.ziyang.com; 
  3.     listen 80
  4.     error_log  logs/myerror.log  info; 
  5.     default_type text/plain; 
  6.     location /{ 
  7.         secure_link $arg_md5,$arg_expires; 
  8.         secure_link_md5 "$secure_link_expires$uri$remote_addr secret"
  9.  
  10.         if ($secure_link = "") { 
  11.             return 403
  12.         } 
  13.  
  14.         if ($secure_link = "0") { 
  15.             return 410
  16.         } 
  17.  
  18.         return 200 '$secure_link:$secure_link_expires\n'
  19.     } 
  20.  
  21.     location /p/ { 
  22.         secure_link_secret mysecret2; 
  23.  
  24.         if ($secure_link = "") { 
  25.             return 403
  26.         } 
  27.  
  28.         rewrite ^ /secure/$secure_link; 
  29.     } 
  30.  
  31.     location /secure/ { 
  32.         alias html/; 
  33.         internal; 
  34.     } 

僅對 URI 進行哈希的簡單辦法

除了上面這種相對復(fù)雜的方式防盜鏈,還有一種相對簡單的防盜鏈方式,就是只對 URI 進行哈希,這樣當(dāng) URI 傳

  1. secure_link_secret secret; 

命令行生成安全鏈接

  • 原請求

    • link
  • 生成的安全請求

    • /prefix/md5/link
  • 生成 md5

    • echo -n 'linksecret' | openssl md5 –hex

Nginx 配置

  • secure_link_secret secret;

這個防盜鏈的方法比較簡單,那么具體是怎么用呢?大家都在網(wǎng)上下載過資源對吧,不管是電子書還是軟件,很多網(wǎng)站你點擊下載的時候往往會彈出另外一個頁面去下載,這個新的頁面其實就是請求的 Nginx 生成的安全 URL。如果這個 URL 被拿到的話,其實還是可以用的,所以需要經(jīng)常的更新密鑰來確保 URL 不會被盜用。

今天這篇文章詳細(xì)講了防盜鏈的具體用法,最近的這兩篇文章都是說的已有的變量用法,下一篇文章講一下怎么生成新的變量。

責(zé)任編輯:張燕妮 來源: segmentfault.com
相關(guān)推薦

2025-02-04 10:05:16

SpringForbiddenReferer?

2019-08-25 07:15:47

Nginx防盜鏈Linux

2017-03-22 14:41:43

2011-05-31 14:57:17

PHP盜鏈

2025-01-09 08:36:05

2024-07-18 09:19:17

Nginx圖片安全性

2023-01-13 16:53:17

Annotation底層元注解

2014-07-09 08:02:52

WiFi

2023-10-10 14:03:47

swap排序解法

2024-01-31 23:27:50

盜鏈Node.js

2010-11-23 10:21:53

跳槽

2018-07-09 15:32:57

2020-09-01 16:56:58

華為云

2022-12-01 08:09:05

SQLOracleSPM

2019-03-27 14:20:27

大數(shù)據(jù)核心價值數(shù)據(jù)分析

2013-01-16 09:58:57

無線網(wǎng)無線網(wǎng)盜用

2022-06-27 07:32:00

JavaArrayList語法糖

2019-09-29 09:39:54

離職目標(biāo)強項

2023-06-30 08:26:24

Java注解Java程序元素

2020-07-03 14:30:34

Node內(nèi)存前端
點贊
收藏

51CTO技術(shù)棧公眾號