Nginx服務之防盜鏈功能

一:原理

盜鏈是一種損害原有網站合法利益,給原網站所在服務器造成額外負擔的非法行爲。要採取防盜鏈的措施,首先需要了解盜鏈的實現原理。 客戶端向服務器請求資源時,爲了減少網絡帶寬,提高響應時間,服務器一般不會一次將所有資源完整地傳回給客戶端。比如在請求一個網頁時,首先會傳回該網頁的文本內容,當客戶端瀏覽器在解析文本的過程中發現有圖片存在時,會再次向服務器發起對該圖片資源的請求,服務器將存儲的圖片資源再發送給客戶端。在這個過程中,如果該服務器上只包含了網頁的文本內容,並沒有存儲相關的圖片資源,而是將圖片資源鏈接到其他站點的服務器上去了,這就形成了盜鏈行爲。

比如內網用戶通過Internet訪問域名爲www.test.com這個服務器上的WEB服務,而該服務器沒有存儲圖片資源,而是將圖片鏈接到域名爲www.fz.com服務器上,這就形成了盜鏈行爲。這種情況下客戶端請求圖片資源實際上是來自其他的服務器。
要實現防盜鏈,需要了解HTTP協議中的請求頭部的Referer頭域和採用URL的格式表示訪問當前網頁或者文件的源地址。通過該頭域的值,我們可以檢測到訪問目標資源的源地址。這樣,如果我們檢測到Referer頭域中的值並不是自己站點內的URL,就採取組織措施,實現防盜鏈。
需要注意是,由於Referer頭域中的值可以被更改的,因此該方法不能完全阻止所有盜鏈行爲。

二:配置指令

Nginx配置中有一個指令valid_referers,用來獲取Referer頭域中的值,並且根據該值的情況給Nginx全局變量$invalid_referer的值,如果Referer頭域中沒有符合valid_referers指令配置的值,$invalid_referer變量將會被賦值爲1。
valid_referer指令的語法結構爲:

valid_referers none | blocked | server_names | string ....;
none 檢測Referer頭域不存在的請求
blocked 檢測Referer頭域的值被防火牆或者代理服務器刪除或僞裝的情況。
這種情況下,該頭域的值不以“http://”或者“https://”開頭
server_names 設置一個或多個URL,檢測Referer頭域的值是否是這些URL中的某個。
從nginx 0.5.33以後支持使用通配符“*”。

三:實例配置

環境:centos6.5的主機兩臺
盜鏈服務器的IP爲172.25.254.2 域名www.test.com
被盜鏈服務器爲172.25.254.3 域名www.fz.com
客戶端用來測試,IP爲172.25.254.56
最終達到的效果是,www.fz.com站點成功防盜鏈,而且將客戶端請求的URL重寫爲http://summer.fz.com/123.jpg,成功防止盜鏈行爲。

1盜鏈服務器的配置

編輯nginx配置文件,創建一個測試的站點

server {
        listen 80;
        server_name www.test.com;

        location / {
                root /www;
                index index.html;
        }

}

mkdir /www
vim /www/index.html

<html>
<body>
<h1>www.test.com</h1>
<img src="http://www.fz.com/haha.jpg">
</body>
</html>

img語句意思爲:當客戶端訪問自身服務器的www.test.com圖片資源時,由於沒有圖片提供給客戶端,將圖片資源鏈接到www.fz.com上,從而返回給客戶端。

2.被盜鏈服務器的配置

編輯nginx配置文件,創建一個測試的站點

server {
        listen 80;
        server_name www.fz.com;
        location / {
                root /www;
                index index.html;
        }
}

mkdir /www
/www中要有haha.jpg圖片。
到這一步當客戶端用瀏覽器訪問www.test.com,返回的是www.fz.com上圖片資源 ,盜鏈成功。
這裏寫圖片描述
這裏寫圖片描述
可以看到Referer的頭域的值來自www.test.com

3 實現防盜鏈的配置實例

server {
        listen 80;
         server_name www.fz.com;

        location / {
                root /www;
                index index.html;
        }
        location ~* \.(jpg|jpeg|gif|png)$ {
                valid_referers www.fz.com;
                if ($invalid_referer) {
                        rewrite ^/ http://summer.fz.com/daolian.jpg;
                }
        }
}
server {
        listen 80;
        server_name summer.fz.com;
        location / {
                root /summer;
                index index.html;
        }
}

在配置中,當有網絡連接對以jpg|jpeg|gif|png爲後綴的圖片資源發起請求時,如果檢測到Referer頭域中沒有符合valid_referers指令配置的值,就將客戶端請求 URL重寫爲http://summer.fz.com/daolian.jpg
爲什麼還要一個server標籤,這是有原因的,當時自己看書看博文學習做實驗的時候,發現一直跳轉不到想要的結果,而是一個空白頁面,幾經周折,在51的博文無意發現關於Nginx防盜鏈的一段話,就是rewrite ^/ http://summer.fz.com/daolian.jpg
這個圖片是盜鏈返回的圖片,也就是替換盜鏈網站所有盜鏈的圖片。這個圖片要放在沒有設置防盜鏈的網站上,因爲防盜鏈的作用,這個圖片如果也放在防盜鏈網站上就會被當作防盜鏈顯示不出來了,盜鏈者的網站所盜鏈圖片會顯示X符號。
所以爲了達到自己期待效果,新建一個server標籤,讓URL重寫到該站點下的圖片。
最後,我用客戶端再次訪問www.test.com,看看結果怎樣?
這裏寫圖片描述
顯示的不是被盜鏈的圖片,而是我們自定義的圖片;
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章