1. 程式人生 > >nginx作防盜鏈設置

nginx作防盜鏈設置

響應時間 檢查 行為 存儲 html 標記 tle 一次 href

盜鏈是一種損害原有網站合法權益,給原網站所在服務器造成額外負擔的非法行為。

盜鏈的實現原理:

客戶端向服務器請求資源時,為了減少網絡帶寬,提高響應時間,服務器一般不會一次將所有資源完整地傳回給客戶端。比如在請求一個網頁時,首先會傳回該網頁的文本內容。當客戶端瀏覽器在解析文本的過程中發現有圖片存在時,會再次向服務器發起對該圖片資源的請求,服務器將請求圖片資源再發送給客戶端。在這個過程中,如果該服務器上只包含了網頁的文本內容,並沒有存儲相關圖片資源,而是將圖片資源鏈接到其他的服務器,這就是形成了盜鏈的行為。這種情況下,客戶端請求的圖片資源實際上是來自於其他服務器的。

要實現防盜鏈,需要了解http的referer頭域和采用URL的格式表示訪問當前網頁或者文件的原地址。通過referer頭域,我們可以檢測到訪問目標資源的源地址。這樣如果我們檢測到的referer頭域中的值並不是自己站點內的URL,就采取阻止措施,實現防盜鏈。

需要說明的是referer頭域的值,可以被修改,因此該方法並不能完全阻止所有的盜鏈行為。

通過一個實例來說明referer頭域和防盜鏈的設置。

先看一個html代碼,這是nginx自帶的默認的頁面,我們在頁面中加入了一個img標簽,插入一張圖片,插入的圖片的URL地址,是來自另一個服務器!


<!
DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Welcome to nginx!</title> <style> body { width
: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</
p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> <div>

<!-- 插入的圖片 -->
<h4>我的測試圖片</h4> <img src="http://www.test.com/one.jpg">

</div> </body> </html>

然後我們在瀏覽器中訪問這個web頁面:

技術分享圖片

在www.test.com服務器上查看訪問日誌,如下:

192.168.1.103 - - [04/Nov/2018:18:06:44 +0800] "GET /one.jpg HTTP/1.1" 304 0 "http://www.abc.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"
192.168.1.103 - - [04/Nov/2018:18:06:45 +0800] "GET /one.jpg HTTP/1.1" 304 0 "http://www.abc.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"
192.168.1.103 - - [04/Nov/2018:18:06:46 +0800] "GET /one.jpg HTTP/1.1" 304 0 "http://www.abc.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"
192.168.1.103 - - [04/Nov/2018:18:06:46 +0800] "GET /one.jpg HTTP/1.1" 304 0 "http://www.abc.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"

在如上的日誌中標記的就是referer頭域,該頭域指明了此次訪問來自哪裏?說明這些訪問日誌來自www.test.com這個URL。

知道了上面的知識,再來說防盜鏈,當www.abcc.om再來www.test.com這個服務器上拉取圖片時,test服務器拒絕abc的訪問,怎麽拒絕呢?就是根據訪問的referer頭域,確定的!

在www.test.com上做如下設置:

        location ~* ^.*\.(gif|jpg|png)$
        {
            valid_referers none  blocked  www.test.com; 
            if ($invalid_referer)
            {
                return 403;
            }
        }

#如上在test服務器的配置文件中加上如上配置,上面是針對gif,jpg,png格式做的防盜鏈。
#valid_referers: 這個相當於白名單,出現在valid_referers中的值,都是允許訪問的;如果當前訪問的referer不符合valid_referers定義的值,則給invalid_referer賦值為1.
如果當前訪問的referer的值符合valid_referers定義的值,則給invalid_referer定義為0.

#valid_referers的取值可以有三種形式:
  • none表示檢查referer頭域不存在的情況。
  • blocked,檢查referer頭域的值被防火墻或者代理服務器刪除或偽裝的情況。這種情況下頭域的值不是以“http”或者“https”開頭的。
  • server_namse: 設置一個或多個URL,檢查referer頭域的值是否是這些URL中的某一個。nginx0.5.33之後支持使用通配符“*”;

按照以上的設置判斷一下www.abc.com頁面的訪問,因為www.abc.com不在valid_referers設置的可訪問頭域中,因此給invalid_referer賦值為1,則拉取圖片時返回403錯誤,也就是訪問不到圖片資源,

訪問結果如下:

技術分享圖片

nginx作防盜鏈設置