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防盜鏈,這種設置方法還是十分侷限的,在後續將做出更多高級的有效的方法。