前言:
之前在整理nginx資料的時候, 里面談到過防盜鏈的配置. 當時覺得有些新鮮(還是自己孤陋寡聞了), 畢竟很少接觸這個概念或者說是名詞. 大致的意思時, 防止他人的網站引用你的圖片, 進而消耗你網絡帶寬資源的一種措施.
本文將講述防盜鏈的原理, nginx如何配置防盜鏈, 以及如何反防盜鏈的一些思路. 筆者這是簡單談談, 權當拋磚引玉.
科普:
他人網站未經你的允許, 引用你網站的資源鏈接(圖片/文檔). 不僅消耗你服務器的網絡帶寬, 甚至侵害你的利益, 間接盜取你的網站流量, 所以危害很大.
微信公眾號, 新浪博客等圖片, 都開啟防盜鏈功能. 比如在他人站點引用了他們的圖片, 則圖片的展示效果如下所示:
防盜鏈的原理:
在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/.