SpringBoot如何實現(xiàn)防盜鏈
一、什么是盜鏈
盜鏈?zhǔn)莻€什么操作,看一下百度給出的解釋:盜鏈?zhǔn)侵阜?wù)提供商自己不提供服務(wù)的內(nèi)容,通過技術(shù)手段繞過其它有利益的最終用戶界面(如廣告),直接在自己的網(wǎng)站上向最終用戶提供其它服務(wù)提供商的服務(wù)內(nèi)容,騙取最終用戶的瀏覽和點擊率。受益者不提供資源或提供很少的資源,而真正的服務(wù)提供商卻得不到任何的收益。

術(shù)語聽得有點迷糊?那我們簡單的舉個栗子:平時我們在TX網(wǎng)看新聞,里邊有很多勁爆的圖片、視頻資源,每天吸引上億的用戶活躍瀏覽,賺著大把的廣告費。

有一天一個窮比的程序員也想建一個自己的網(wǎng)站吸引用戶賺廣告費,但苦于自己沒有資源,他靈光一閃盯上了TX網(wǎng),心想:要是把它的資源為我所用,這樣就能借助TX的資源為自己賺錢。于是他通過爬蟲等一些列技術(shù)手段,把TX網(wǎng)資源拉取到自己的網(wǎng)站上,繞過了TX網(wǎng)的展示頁面直接呈現(xiàn)給用戶,達(dá)到了自己不提供資源又能賺錢的目的。
而如此做法卻嚴(yán)重的損害了TX網(wǎng)的利益,不僅分流了大量用戶,而且由于小富網(wǎng)的大量間接資源請求,大大增加TX網(wǎng)服務(wù)器及帶寬的壓力。TX網(wǎng)的網(wǎng)安部門在知曉這一事情后決定封殺這類空手套白狼的站點,終于祭出防盜鏈系統(tǒng)。

上邊我們簡單的舉例說了什么是網(wǎng)站的盜鏈,再總結(jié)的簡單點就是小站點盜取大站點資源以此來獲利的一種行為。既然有人盜就會有人防盜,接下來在看看怎么防止盜鏈。
二、如何防盜鏈
防盜鏈在google,新浪,網(wǎng)易,天涯等,內(nèi)容為主的網(wǎng)站應(yīng)用的比較多,畢竟主要靠資源內(nèi)容賺錢的嘛。

提到防盜鏈的實現(xiàn)原理得從HTTP協(xié)議說起,上邊我們說過設(shè)置防盜鏈以后,會對 “除了在TX網(wǎng)本站以外發(fā)起的資源請求全部封殺”,那么問題來了,如何識別一個請求URL是從哪個站點發(fā)出的呢?
熟悉HTTP協(xié)議的小伙伴應(yīng)該知道,在HTTP協(xié)議頭里有一個叫referer的字段,通過referer 告訴服務(wù)器該網(wǎng)頁是從哪個頁面鏈接過來的,知道這個就好辦了,只要獲取 referer 字段,一旦檢測到來源不是本站即進行阻止或者返回指定的頁面。

防盜鏈的核心理念:盡量做到不讓外站獲取到我的資源,即便能通過一些手段獲取到資源,也讓你的獲取過程異常繁瑣復(fù)雜,無法實現(xiàn)自動化處理,或者干脆就給你有問題的資源惡心死你。做防盜鏈的方法比較多,基于HTTP協(xié)議頭的referer屬性也只是其中一種,下邊我們來分析幾種實現(xiàn)防盜鏈的方法。
2.1 基于HTTP協(xié)議的referer
基于HTTP協(xié)議中的 referer做防盜鏈,可以從網(wǎng)關(guān)層或者利用AOP、Filter攔截器實現(xiàn)。
使用Nginx在網(wǎng)關(guān)層做防盜鏈,目前是最簡單的方式之一。通過攔截來訪問資源的請求,valid_referers 關(guān)鍵字定義了白名單,校驗請求頭中referer地址是否為本站,如不是本站請求,rewrite 轉(zhuǎn)發(fā)請求到指定的警告頁面。在 server 或者 location 配置模塊中加入:valid_referers none blocked,其中 none : 允許沒有http_refer的請求訪問資源(比如:直接在瀏覽器輸入圖片網(wǎng)址);blocked : 允許不是http://開頭的,不帶協(xié)議的請求訪問資源。
[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這種實現(xiàn)可以限制大多數(shù)普通的非法請求,但不能限制有目的的請求,因為可以通過偽造referer信息來繞過。另一種是使用Filter攔截器方式。
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);
}
}
}可以看到,F(xiàn)ilter攔截器的實現(xiàn)方式更加簡單,攔截指定請求URL,拿到HttpServletRequest 中 referer值比對是否為本站。
2.2 登錄驗證,禁止游客訪問
登錄驗證這種就屬于一刀切的方式,一般在論壇、社區(qū)類網(wǎng)站使用比較多,不管你發(fā)起請求的站點是什么,到我這先登錄,沒登錄請求直接拒絕,簡單又粗暴。
2.3 圖形驗證碼
圖形驗證碼是一種比較常規(guī)的限制辦法,比如:下載資源時,必須手動操作驗證碼,使爬蟲工具無法繞過校驗,起到保護資源的目的。

當(dāng)然,實現(xiàn)防盜鏈的方式還有很多,這里就不一一列舉了。
到此這篇關(guān)于SpringBoot如何實現(xiàn)防盜鏈的文章就介紹到這了,更多相關(guān)SpringBoot防盜鏈內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
最全JVM調(diào)優(yōu)步驟和參數(shù)及配置
這篇文章主要給大家介紹了關(guān)于JVM調(diào)優(yōu)的相關(guān)資料,JVM調(diào)優(yōu)是指對Java虛擬機(JVM)進行優(yōu)化,以提高Java程序的性能和運行效率,文中介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
解決Mybatis一對多/多對多查詢時只查出了一條數(shù)據(jù)問題
在使用MyBatis進行一對多查詢時,若兩張表的ID字段名稱相同,則會導(dǎo)致多的一方數(shù)據(jù)只查詢出來一條,解決方法是修改ID字段名稱,保持不一致,此經(jīng)驗供參考,希望對大家有所幫助2026-05-05
詳解最簡單易懂的Spring Security 身份認(rèn)證流程講解
這篇文章主要介紹了詳解最簡單易懂的Spring Security 身份認(rèn)證流程講解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03
Java實現(xiàn)赫夫曼樹(哈夫曼樹)的創(chuàng)建
給定N個權(quán)值作為N個葉子結(jié)點,構(gòu)造一棵二叉樹,若該樹的帶權(quán)路徑長度(WPL)達(dá)到最小,稱這樣的二叉樹為最優(yōu)二叉樹,也稱為哈夫曼樹(Huffman Tree)。這篇文章主要就是為大家介紹如何通過Java實現(xiàn)赫夫曼樹,需要的朋友可以參考一下2021-12-12
java實現(xiàn)隨機森林RandomForest的示例代碼
本篇文章主要介紹了java實現(xiàn)隨機森林RandomForest的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
ZooKeeper入門教程二在單機和集群環(huán)境下的安裝搭建及使用
本文是ZooKeeper入門系列教程,涵蓋ZooKeeper的安裝使及單機集群環(huán)境搭建,通過實例和大量圖表,結(jié)合實戰(zhàn),幫助學(xué)習(xí)者理解和運用,有需要的朋友可以借鑒參考下2022-01-01

