本文收錄在我的博客: www.chengxy-nds.top,同進步
下午摸魚的時候遇到了一件有意思的事,在網上找到一個資源站,將資源站的 url 放到本身的博客裏,想白嫖一波,結果在我本身的博客裏連接失效了,折騰半天突然想起來,這個網站應該是作了防盜鏈處理。html
盜鏈
是個什麼操做,看一下百度給出的解釋:盜鏈
是指服務提供商本身不提供服務的內容,經過技術手段繞過其它有利益的最終用戶界面(如廣告),直接在本身的網站上向最終用戶提供其它服務提供商的服務內容,騙取最終用戶的瀏覽和點擊率。受益者不提供資源或提供不多的資源,而真正的服務提供商卻得不到任何的收益。
術語聽得有點迷糊?那咱們簡單的舉個栗子:java
平時咱們在TX網
看新聞,裏邊有不少勁爆的圖片、視頻資源,天天吸引上億的用戶活躍瀏覽,賺着大把的廣告費。
有一天一個窮比程序員小富突發奇想,也想建一個本身的網站吸引用戶賺廣告費,但苦於本身沒有資源,他靈光一閃盯上了TX網
,心想:要是把它的資源爲我所用,這樣就能借助TX的資源爲本身賺錢。nginx
因而他經過爬蟲等一些列技術手段,把TX網
資源拉取到本身的小富網,繞過了TX網
的展現頁面直接呈現給用戶,達到了本身不提供資源又能賺錢的目的。程序員
而如此作法卻嚴重的損害了TX網
的利益,不只分流了大量用戶,並且因爲小富網的大量間接資源請求,大大增長TX網服務器及帶寬的壓力。web
TX網
蛋糕被動,忍無可忍決定封殺小富網這類空手套白狼的站點,終於祭出防盜鏈系統,對除了在TX網
本站之外發起的資源請求所有封殺,小富網無法再拉取資源,小富一會兒又成了窮比,嚶嚶嚶~
上邊咱們簡單的舉例說了什麼是網站的盜鏈,再總結的簡單點就是小站點盜取大站點資源以此來獲利的一種行爲。vim
既然有人盜就會有人防盜,接下來在看看怎麼防止盜鏈。瀏覽器
防盜鏈在google
,新浪
,網易
,天涯
等,內容爲主的網站應用的比較多,畢竟主要靠資源內容賺錢的嘛。安全
提到防盜鏈的實現原理得從HTTP
協議提及,上邊咱們說過設置防盜鏈之後,會對 「除了在TX網
本站之外發起的資源請求所有封殺」,那麼問題來了,如何識別一個請求URL
是從哪一個站點發出的呢?服務器
熟悉HTTP
協議的小夥伴應該知道,在HTTP
協議頭裏有一個叫referer
的字段,經過referer
告訴服務器該網頁是從哪一個頁面連接過來的,知道這個就好辦了,只要獲取 referer
字段,一旦檢測到來源不是本站即進行阻止或者返回指定的頁面。ide
防盜鏈
的核心理念:儘可能作到不讓外站獲取到個人資源,即使能經過一些手段獲取到資源,也讓你的獲取過程異常繁瑣複雜,沒法實現自動化處理,或者乾脆就給你有問題的資源噁心死你。
作防盜鏈
的方法比較多,基於HTTP
協議頭的referer
屬性也只是其中一種,下邊咱們來分析幾種實現防盜鏈的方法,若是你有更好的實現方法歡迎留言哦。
基於HTTP
協議中的 referer
作防盜鏈,能夠從網關層或者利用AOP
、Filter
攔截器實現。
使用Nginx
在網關層作防盜鏈,目前是最簡單的方式之一。經過攔截訪問資源的請求,valid_referers
關鍵字定義了白名單,校驗請求頭中referer
地址是否爲本站,如不是本站請求,rewrite
轉發請求到指定的警告頁面。
在 server
或者 location
配置模塊中加入:valid_referers none blocked
,其中 none
: 容許沒有http_refer
的請求訪問資源(好比:直接在瀏覽器輸入圖片網址);blocked
: 容許不是http://
開頭的,不帶協議的請求訪問資源。
注意:這種實現能夠限制大多數普通的非法請求,但不能限制有目的的請求,由於能夠經過僞造referer
信息來繞過。
[root@server1 nginx]# vim conf/nginx.conf location / { root /web; index index.html; } location ~* \.(gif|jpg|png|jpeg)$ { root /web; valid_referers none blocked www.chengxy-nds.top; if ($invalid_referer){ #return 403; rewrite ^/ https://img-blog.csdnimg.cn/20200429152123372.png; } } server { listen 80; server_name www.chengxy-nds.top; location / { root /bbs; index index.html; } } [root@server1 nginx]# systemctl restart nginx
Filter
攔截器的實現方式更加簡單,攔截指定請求URL
,拿到HttpServletRequest
中 referer
值比對是否爲本站。
public class MyFilter implements Filter { @Override public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; String referer = req.getHeader("referer"); if (referer == null || !referer.contains(req.getServerName())) { req.getRequestDispatcher("XXX.jpg").forward(req, res); } else { chain.doFilter(request, response); } } }
登陸驗證這種就屬於一刀切的方式,通常在論壇、社區類網站使用比較多,無論你發起請求的站點是什麼,到我這先登陸,沒登陸請求直接拒絕,簡單又粗暴。
圖形驗證碼是一種比較常規的限制辦法,好比:下載資源時,必須手動操做驗證碼,使爬蟲工具沒法繞過校驗,起到保護資源的目的。
實現防盜鏈的方式還有不少,這裏就不一一列舉了(別問,問就是還有不少)。
原本沒想寫這篇文章,下午搭建本身的博客整理資料,白嫖別人資源沒成功有感而發,哈哈哈~ 正好藉此機會簡單的介紹一下防盜鏈的概念,提醒 everyone 在開發中要提升安全意識。其實盜鏈與防盜鏈就是像是矛與盾同樣,說很差是矛更鋒利仍是盾更堅固,作不到絕對的防盜。道高一尺魔高一丈,盜鏈的手段越高,相應的防盜技術也會越成熟。
原創不易,燃燒秀髮輸出內容
習慣在VX看技術文章,想要獲取更多Java資源的同窗,能夠關注個人公衆號: 程序員內點事,暗號:[ 666]