網站防盜鏈系統,打破了我的“發財夢”

下午摸魚的時候遇到了一件有意思的事,在網上找到一個資源站,將資源站的 url 放到自己的博客裏,想白嫖一波,結果在我自己的博客裏鏈接失效了,折騰半天忽然想起來,這個網站應該是做了防盜鏈處理。

什麼是盜鏈

盜鏈是個什麼操作,看一下百度給出的解釋:盜鏈是指服務提供商自己不提供服務的內容,通過技術手段繞過其它有利益的最終用戶界面(如廣告),直接在自己的網站上向最終用戶提供其它服務提供商的服務內容,騙取最終用戶的瀏覽和點擊率。受益者不提供資源或提供很少的資源,而真正的服務提供商卻得不到任何的收益。
在這裏插入圖片描述
術語聽得有點迷糊?那我們簡單的舉個栗子:

平時我們在TX網看新聞,裏邊有很多勁爆的圖片、視頻資源,每天吸引上億的用戶活躍瀏覽,賺着大把的廣告費。
在這裏插入圖片描述
有一天一個窮比程序員小富突發奇想,也想建一個自己的網站吸引用戶賺廣告費,但苦於自己沒有資源,他靈光一閃盯上了TX網,心想:要是把它的資源爲我所用,這樣就能借助TX的資源爲自己賺錢。

於是他通過爬蟲等一些列技術手段,把TX網資源拉取到自己的小富網,繞過了TX網的展示頁面直接呈現給用戶,達到了自己不提供資源又能賺錢的目的。

而如此做法卻嚴重的損害了TX網的利益,不僅分流了大量用戶,而且由於小富網的大量間接資源請求,大大增加TX網服務器及帶寬的壓力。

TX網蛋糕被動,忍無可忍決定封殺小富網這類空手套白狼的站點,終於祭出防盜鏈系統,對除了在TX網本站以外發起的資源請求全部封殺,小富網沒法再拉取資源,小富一下子又成了窮比,嚶嚶嚶~
在這裏插入圖片描述
上邊我們簡單的舉例說了什麼是網站的盜鏈,再總結的簡單點就是小站點盜取大站點資源以此來獲利的一種行爲。

既然有人盜就會有人防盜,接下來在看看怎麼防止盜鏈。

如何防盜鏈

防盜鏈在google新浪網易天涯等,內容爲主的網站應用的比較多,畢竟主要靠資源內容賺錢的嘛。

在這裏插入圖片描述

提到防盜鏈的實現原理得從HTTP協議說起,上邊我們說過設置防盜鏈以後,會對 “除了在TX網本站以外發起的資源請求全部封殺”,那麼問題來了,如何識別一個請求URL是從哪個站點發出的呢?

熟悉HTTP協議的小夥伴應該知道,在HTTP協議頭裏有一個叫referer的字段,通過referer 告訴服務器該網頁是從哪個頁面鏈接過來的,知道這個就好辦了,只要獲取 referer 字段,一旦檢測到來源不是本站即進行阻止或者返回指定的頁面。

在這裏插入圖片描述
防盜鏈的核心理念:儘量做到不讓外站獲取到我的資源,即便能通過一些手段獲取到資源,也讓你的獲取過程異常繁瑣複雜,無法實現自動化處理,或者乾脆就給你有問題的資源噁心死你。

防盜鏈的方法比較多,基於HTTP協議頭的referer屬性也只是其中一種,下邊我們來分析幾種實現防盜鏈的方法,如果你有更好的實現方法歡迎留言哦。

基於 HTTP 協議的 referer

基於HTTP協議中的 referer做防盜鏈,可以從網關層或者利用AOPFilter攔截器實現。

使用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,拿到HttpServletRequestreferer值比對是否爲本站。

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 在開發中要提高安全意識。其實盜鏈與防盜鏈就是像是矛與盾一樣,說不好是矛更鋒利還是盾更堅固,做不到絕對的防盜。道高一尺魔高一丈,盜鏈的手段越高,相應的防盜技術也會越成熟。

小福利:

整理了幾百本各類技術電子書相送 ,噓~,免費
送給小夥伴們。關注公衆號【程序員內點事】回覆【666】自行領取。和一些小夥伴們建了一個技術交流羣,一起探討技術、分享技術資料,旨在共同學習進步,如果感興趣就掃碼加入我們吧!

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