nginx作防盜鏈設置
盜鏈是一種損害原有網站合法權益,給原網站所在服務器造成額外負擔的非法行為。
盜鏈的實現原理:
客戶端向服務器請求資源時,為了減少網絡帶寬,提高響應時間,服務器一般不會一次將所有資源完整地傳回給客戶端。比如在請求一個網頁時,首先會傳回該網頁的文本內容。當客戶端瀏覽器在解析文本的過程中發現有圖片存在時,會再次向服務器發起對該圖片資源的請求,服務器將請求圖片資源再發送給客戶端。在這個過程中,如果該服務器上只包含了網頁的文本內容,並沒有存儲相關圖片資源,而是將圖片資源鏈接到其他的服務器,這就是形成了盜鏈的行為。這種情況下,客戶端請求的圖片資源實際上是來自於其他服務器的。
要實現防盜鏈,需要了解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作防盜鏈設置