Nginx防盜鏈

referer 模塊

該模塊可以進行防盜鏈設置。

 

概述

對於圖片來說,A網站,如果想使用B網站的圖片,可以直接寫上B網站圖片的鏈接地址,或者將B網站的圖片通過右鍵另存爲的方式下載到本地,然後在頁面上使用。如果B網站不想A網站這麼幹了,那麼B網站可以採取防盜鏈的措施來幹這個工作,結果就是,A網站想請求所需要的資源,通過url的方式,獲取的可能不是原來的圖片了,出現404或者別的圖片替代了。如果通過瀏覽器直接打開圖片url,那麼仍然有可能顯示404,這就是防盜鏈。

 

語法

該指令"valid_referers"的語法:

valid_referers    [none|blocked|server_names] ...

默認值:none

使用環境:server,location

該指令會根據Referer Header頭的內容分配一個值爲0或1給變量$invalid_referer。如果Referer Header頭不符合valid_referers指令設置的有效,變量$invalid_referer將被設置爲1.

 

該指令的參數可以爲下面的內容

valid_referers 表示合法的referers設置

none: 表示無Referer值的情況,直接通過瀏覽器或者其他工具訪問。

blocked: 表示有referers,但是值被代理服務器或者防火牆隱藏;

server_names:表示一個或多個主機名稱。從Nginx 0.5.33版本開始,server_names中可以使用通配符"*"號。lutixia.net: 表示通過lutixia.net訪問的referers,*.jfedu.net: 表示通過*.jfedu.net訪問的referers,*表示任意host主機。

 

再說的通俗一點

valid_referers 定資源訪問是通過以下幾種方式爲合法,即白名單

none: 允許缺失的頭部訪問

blocked: 允許referer沒有對應值的請求

server_names:表示一個或多個主機名稱。從Nginx 0.5.33版本開始,server_names中可以使用通配符"*"號。lutixia.net: 表示通過lutixia.net訪問的referers,*.jfedu.net: 表示通過*.jfedu.net訪問的referers,*表示任意host主機。

 

HTTP Referer

HTTP Referer是Header的一部分,當瀏覽器向Web服務器發送請求的時候,一般會帶上Referer,告訴服務器我是從哪個頁面鏈接過來的,服務器藉此可以獲得一些信息用於處理,例如防止未經允許的網站盜鏈圖片、文件等。因此HTTP Referer頭信息是可以通過程序來僞裝生成的,所以通過Referer信息防盜鏈並非100%可靠,但是,它能夠限制大部分的盜鏈情況。

Referer到底是什麼東西?我的nginx配置文件很簡單,打開autoindex功能,即將整個目錄列出來。然後將默認的index.html文件修改爲index.html.bak,同時在目錄下面創建一個jfedu.html文件

   location / {

           autoindex on;

            root   html;

            index  index.html index.htm;

        }

來到主頁,可以看到將文件目錄全部列出來,我們要通過jfedu.html這個文件來做測試

下面圖片的方式是通過在網頁內通過鼠標點擊jfedu.htm來訪問該資源,可以看到是有Reference的值的,當前的reference信息就是當前網頁的信息。可以看出從當前網頁內訪問的資源的Reference是有值的,即當前網頁的信息。

下面這張圖片是通過在網址欄輸入資源地址直接訪問的,不是通過鼠標在網站內點擊訪問,可以看到Reference的值是不存在的。直接輸入鏈接標準的IP+資源是不存在Reference的值的。(匹配到的none

 

防盜鏈案例一則

這是一個正則匹配,如果是以.gif,jpg,png,swf,flv結尾的文件,就匹配這個location規則,這些規則定義就是兩個花括號裏面的內容。

location ~* \.(gif|jpg|png|swf|flv)$ {

valid_referers none blocked lutixia.net  *.jfedu.net;

root /usr/share/nginx/html;

if ($invalid_referer) {

return 403;

} }

location ~* \.(gif|jpg|png|swf|flv)${}爲設置防盜鏈的文件類型,使用豎線|分隔。~*表示忽略大小寫,只要是訪問以.gif jpg png swf flv結尾的請求就匹配花括號裏面的規則

 

valid_referers  lutixia.net  *.jfedu.net;爲白名單,使用空格分隔,可以使用*進行泛域名設置。

 

if ($invalid_referer) {}爲判斷是否符合白名單,不符合白名單將執行{}內的內容。

總結就是:以上所有來自lutixia.net  *.jfedu.net的站點都可以訪問到當前站點的圖片,如果來源域名不在這個列表中,那麼$invalid_referer等於1,在if語句中返回一個403給用戶,這樣用戶便會看到一個403的頁面。

 

測試192.168.179.179.100去盜用192.168.179.99的圖片

(1)在192.168.179.100上配置下面信息去盜用192.168.179.99的圖片jfedu.png

[root@localhost nginx-1.16.1]# vim /usr/local/nginx/html/jfedu.html

[root@localhost nginx-1.16.1]# cat /usr/local/nginx/html/jfedu.html

this is 192.168.179.100

<image src="http://192.168.179.99/jfedu.png">

 

(2)192.168.179.99提供圖片給100去盜取

[root@www nginx-1.16.1]# cp /usr/share/httpd/icons/icon.sheet.png  /usr/local/nginx/html/jfedu.png

可以看到沒加上防盜鏈規則192.168.179.100可以去盜用192.168.179.99的圖片

[root@www nginx-1.16.1]# vim /usr/local/nginx/conf/nginx.conf  --加上防盜鏈規則,注意要把自己的IP加上

location ~* \.(gif|jpg|png|swf|flv)$ {

valid_referers none blocked 192.168.179.99  lutixia.net  *.jfedu.net;

root /usr/local/nginx/html;

if ($invalid_referer) {

return 403;

} }

 

[root@www ~]# /usr/local/nginx/sbin/nginx -s reload  --重啓服務

可以看到加上防盜鏈規則之後盜取失敗了,返回403狀態碼

再來看看192.168.179.99的日誌信息,可以看到請求的資源是jfedu.png,但是referrer並不是本機,這是一個盜鏈。

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