Nginx 防盜鏈

Nginx 防盜鏈

環境:CentOS7、Nginx 1.16.0

在Nginx提供的靜態web資源服務中,其防盜鏈功能也是經常使用的。

什麼是防盜鏈呢,看一下百度百科做出的解釋:

哈哈哈, 開個玩笑?。

首先,我們需要知道什麼是盜鏈,

盜鏈是指服務提供商自己不提供服務的內容,通過技術手段繞過其它有利益的最終用戶界面(如廣告),直接在自己的網站上向最終用戶提供其它服務提供商的服務內容,騙取最終用戶的瀏覽和點擊率。

簡單解釋,當我們寫了一篇博客,裏面展示了許多的圖片,萬萬沒想到,這篇博客火了,於是有許多的人摘抄複製,但是裏面的圖片都是存在我們自己圖牀上,於是乎,我們被其他網站消耗了大量的流量,而我們自己的原創作品卻沒有得到這應有的瀏覽和點擊率,是不是十分可恨呢?

所以,我們需要一個防盜鏈的機制,使得其他網站無法盜用我們的資源。實現防盜鏈的方法有許多種,這裏介紹一下如何在Nginx中實現簡單的防盜鏈。


1.確定防盜鏈的設置思路

首要方式:區別哪些是正常的用戶請求,而哪些是非正常的。

要辨別出不正常的用戶請求並拒絕提供資源,不能誤殺正常的用戶請求。

2.基於http_refer防盜鏈配置模塊

HTTP來源地址(referer,或 HTTP referer)是HTTP表頭的一個字段,用來表示從哪兒鏈接到目前的網頁,採用的格式是URL。換句話說,藉着HTTP來源地址,目前的網頁可以檢查訪客從哪裏而來,這也常被用來對付僞造的跨網站請求。

Referer的正確英語拼法是referrer。由於早期HTTP規範的拼寫錯誤,爲保持向下兼容就將錯就錯了。例如DOM Level 2[1]、Referrer Policy[2]等其他網絡技術的規範曾試圖修正此問題,使用正確拼法,導致目前拼法並不統一。

當我們打開百度首頁並自動請求favicon.ico時,可以看到

這就是referer。


Nginx配置語法:

Syntax: valid_referers none|blocked|server_name|string ...;
Default: ——
Context: server, location

實際操作:

首先打開CentOS7,查看一下==/etc/nginx/nginx.conf==

由此可以得出,我們的日誌文件中是會記錄referer信息的。

這裏我編寫了一份index.html用於測試:

接下來當我訪問一次該服務器,並查看日誌

這裏可以看到,這兩條日誌中的referer是不一樣的,第一條是當我訪問index.html時產生的,也就是說它的源頭就是這臺服務器本身,所以是"-"。

而加載到index.html中的img時,再次發出了一個請求,這次請求是從index.html中發出的,於是這條請求的referer就如上圖所示變成了"http://127.0.0.1/index.html"了。

那麼接下來配置防盜鏈,編輯==/etc/nginx/conf.d/==下的配置文件:

valid_referers 後所接的,就是我們所允許的請求

  • none表示無referer信息的請求
  • blocked表示不標準的,無協議信息的請求
  • 127.0.0.1則表示本地的請求
  • 也可以在其中寫正則表達式來匹配

如果請求不屬於其中,則返回403狀態碼。

那麼我們發起的如referer信息爲"-"的請求,仍然是可以成功的,而不屬於上面三種的請求,比如:

這裏通過curl發起一個僞造referer來自www.baidu.com的請求,可以發現,收到的是403的狀態碼,即這次請求是被拒絕的。

img-5Jw9V7MW-1565450991514)]

這裏通過curl發起一個僞造referer來自www.baidu.com的請求,可以發現,收到的是403的狀態碼,即這次請求是被拒絕的。

這就是簡單的Nginx防盜鏈,這種設置方法還是十分侷限的,在後續將做出更多高級的有效的方法。

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