簡單有效的防盜鏈手段
場景
如果做過個人站點的同學,可能會遇到別人盜用自己站點資源鏈接的情況,這就是盜鏈。說到盜鏈就要說一個 HTTP 協議的 頭部,referer 頭部。當其他網站通過 URL 引用了你的頁面,用戶在瀏覽器上點擊 URL 時,HTTP 請求的頭部會通過 referer 頭部將該網站當前頁面的 URL 帶上,告訴服務器本次請求是由誰發起的。
例如,在谷歌中搜索 Nginx 然后點擊鏈接:

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

像谷歌這種我們是允許的,但是有一些其他的網站想要引用我們自己網站的資源時,就需要做一些管控了,不然豈不是誰都可以拿到鏈接。
目的
這里目的其實已經很明確了,就是要拒絕非正常的網站訪問我們站點的資源。
思路
invalid_referer 變量referer 提供了這個變量,可以用來配置哪些 referer 頭部合法,也就是,你允許哪些網站引用你的資源。
referer 模塊
要實現上面的目的,referer 模塊可得算頭一號,一起看下 referer 模塊怎么用的。
默認編譯進 Nginx,通過 --without-http_referer_module 禁用
referer 模塊有三個指令,下面看一下。
Syntax: valid_referers none | blocked | server_names | string ...;Default: —Context: server, locationSyntax: referer_hash_bucket_size size;Default: referer_hash_bucket_size 64;Context: server, locationSyntax:referer_hash_max_sizesize;Default:referer_hash_max_size2048;Context:server,locationvalid_referers 指令,配置是否允許 referer 頭部以及允許哪些 referer 訪問。referer_hash_bucket_size 表示這些配置的值是放在哈希表中的,指定哈希表的大小。referer_hash_max_size 則表示哈希表的最大大小是多大。
這里面最重要的是 valid_referers 指令,需要重點來說明一下。
valid_referers 指令
可以同時攜帶多個參數,表示多個 referer 頭部都生效。
參數值
none允許缺失 referer 頭部的請求訪問block:允許 referer 頭部沒有對應的值的請求訪問。例如可能經過了反向代理或者防火墻server_names:若 referer 中站點域名與 server_name 中本機域名某個匹配,則允許該請求訪問string:表示域名及 URL 的字符串,對域名可在前綴或者后綴中含有 * 通配符,若 referer 頭部的值匹配字符串后,則允許訪問正則表達式:若 referer 頭部的值匹配上了正則,就允許訪問
invalid_referer 變量
允許訪問時變量值為空不允許訪問時變量值為 1
實戰
下面來看一個配置文件。
server{server_namereferer.ziyang.com;listen80;error_loglogs/myerror.logdebug;roothtml;location/{valid_referersnoneblockedserver_names*.ziyang.comwww.ziyang.org.cn/nginx/
~\.google\.;if($invalid_referer) {return403;
}return200valid\n;
}
}
那么對于這個配置文件而言,以下哪些請求會被拒絕呢?
curl -Hreferer: http://www.ziyang.org.cn/ttt referer.ziyang.com/curl -Hreferer: http://www.ziyang.com/ttt referer.ziyang.com/curl -Hreferer: referer.ziyang.com/
curl referer.ziyang.com/
curl -Hreferer: http://www.ziyang.com referer.ziyang.com/curl -Hreferer: http://referer.ziyang.com referer.ziyang.com/curl -Hreferer: http://image.baidu.com/search/detail referer.ziyang.com/curl -Hreferer: http://image.google.com/search/detail referer.ziyang.com/
我們需要先來解析一下這個配置文件。valid_referers 指令配置了哪些值呢?
valid_referersnoneblockedserver_names*.ziyang.comwww.ziyang.org.cn/nginx/
~\.google\.;none:表示沒有 referer 的可以訪問blocked:表示 referer 沒有值的可以訪問server_names:表示本機 server_name 也就是 referer.ziyang.com 可以訪問*.ziyang.com:匹配上了正則的可以訪問www.ziyang.org.cn/nginx/:該頁面發起的請求可以訪問~\.google\.:google 前后都是正則匹配
下面就實際看下響應:
返回 403,沒有匹配到任何規則
? ~ curl -H referer: http://www.ziyang.org.cn/ttt referer.ziyang.com/<html><head><title>403 Forbidden
免責聲明:本文內容來自用戶上傳并發布,站點僅提供信息存儲空間服務,不擁有所有權,信息僅供參考之用。