前言:
以前在整理nginx資料的時候, 裏面談到過防盜鏈的配置. 當時以爲有些新鮮(仍是本身孤陋寡聞了), 畢竟不多接觸這個概念或者說是名詞. 大體的意思時, 防止他人的網站引用你的圖片, 進而消耗你網絡帶寬資源的一種措施.
本文將講述防盜鏈的原理, nginx如何配置防盜鏈, 以及如何反防盜鏈的一些思路. 筆者這是簡單談談, 權當拋磚引玉.html
科普:
他人網站未經你的容許, 引用你網站的資源連接(圖片/文檔). 不只消耗你服務器的網絡帶寬, 甚至侵害你的利益, 間接盜取你的網站流量, 因此危害很大.
微信公衆號, 新浪博客等圖片, 都開啓防盜鏈功能. 好比在他人站點引用了他們的圖片, 則圖片的展現效果以下所示:
防盜鏈的原理:
在http協議中, 通常的瀏覽器訪問頁面, 除了瀏覽器地址欄直接輸入, 其餘連接點擊/資源引用, 都會在後續的http請求頭中附帶Referer字段, 它表徵了來自哪一個具體的源網頁連接.
依據上述的事實, 不少服務器會根據Referer字段來簡單判斷源連接是不是本身的, 仍是他人的可疑盜鏈連接.
• 舉個簡單例子:
好比網站A(域名:www.a.com), 其下頁面內容引用網站B(域名:www.b.com)的圖片資源.
當用戶經過訪問A頁面(引用B的圖片), 瀏覽器會自動發起圖片請求(注入Referer: www.b.com/xxx Http頭信息). 則網站B服務器就收到圖片請求, 服務器能夠依據Referer字段, 發現該源連接爲www.a.com, 而不是自身的www.b.com, 所以可判斷爲盜鏈, 最後拒絕訪問.
微信公衆號貌似就是基於此來防盜圖的.
nginx配置防盜鏈:
nginx是借用ngx_http_referer_module來阻擋來源非法的域名請求的, 其配置規則以下:
valid_referers none | blocked | server_names | string ...;
none: 表示referer字段爲空
blocked: 表示不以http://或者https://開頭的源連接
server_names: 當前location配置的server域名
具體的一個案例配置以下所示:
location ~* \.(gif|jpg|png|bmp)$ { valid_referers none blocked *.your-website.com server_names ~\.google\. ~\.baidu\.; if ($invalid_referer) { return 403; #rewrite ^/ http://www.your-website.com/xxx/403.jpg; } } location = /xxx/403.jpg { // 防止循環重定向 }
注: 不少合法請求可能沒有設置referer, 本着寧肯放過一千, 不可錯殺一個的博愛精神, 仍是應該放開限制, 不過也留下了作手腳的空間.
具體參考文章: nginx圖片防盜鏈(referer指令).
反防盜鏈思路:
再知道了防盜鏈的原理後, 反防盜鏈的思路基本上也清晰不少.
一種簡單易行的方法就是, 就是修改http請求中的referer字段. 然而瀏覽器很正直, 它不會幫咱們欺騙. 所以這條路暫時擱置一下.
回到最初, 既然繞不過, 那就只能抓取原始圖片, 正真成爲盜圖者了(再也不盜連接, 直接複製圖).
• 同步圖片資源
同步下載圖片資源於本身的服務器中, 再替換本身的圖片連接. 這樣也是無奈之舉, 等於投降了^_^.
圖片資源的存儲也有兩種方式, 一種存於本地, 另外一種則存於雲存儲服務中.
可參見以前寫的博客文章: springmvc學習筆記--支持文件上傳.
• 代理模式
把本身的服務器當作代理服務器, 圖片請求先通過本身服務器, 修改referer頭, 再中轉到真正的服務器地址,進行流複製.
注: 基於字節流進行傳輸, 代理服務器作了修改referer, 欺騙後一級服務器.
本來的連接:
<img src="http://www.b.com/xxx/yyy.jpg" />
皆改成以下的格式: http://www.a.com/zzz?source_url=${source_url}
<img src="http://www.a.com/zzz?source_url="http://www.b.com/xxx/yyy.jpg" />
這樣他人服務器的防盜鏈限制就被繞過了, 同時本地服務器又不須要去存儲這些資源文件.
這種代理模式, 對圖片等小資源友好, 對特大資源(超過10M)並不推薦如此作.
總結:
互聯網的攻與防不少, 魔高一尺, 道高一丈, 但願這世界變得美好.
公衆號&遊戲站點:
我的微信公衆號: 木目的H5遊戲世界
我的遊戲做品集站點(尚在建設中...): www.mmxfgame.com, 也可直接ip訪問: http://120.26.221.54/.