基于SpringBoot實現(xiàn)圖片防盜鏈的兩種方式
1. 實現(xiàn)目的
出于安全和性能的考慮,我們希望服務器返回的圖片資源僅在指定網(wǎng)站內(nèi)展示,防止爬蟲或其它站點直接引用圖片地址進行下載或展示,進而消耗服務器資源。簡單來說,即在請求圖片時通過檢查 HTTP 請求頭中的 Referer 來判斷請求來源是否合法。
2. 簡易實現(xiàn)方案
2.1 攔截器基本實現(xiàn)
在第一種方案中,代碼寫死了允許訪問的域名(例如 “baidudu.com”),主要步驟如下:
判斷 URL 后綴
當請求 URL 以 “.jpg”、“.png”、“.jpeg” 等圖片格式結尾時,再進行后續(xù)判斷。檢查 Referer
從請求頭中取出 Referer,若不為空且包含預設允許的域名,則放行;否則返回 403 錯誤碼,從而拒絕訪問。
例如:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestUrl = request.getRequestURL().toString();
if (requestUrl.endsWith(".jpg") || requestUrl.endsWith(".png") || requestUrl.endsWith(".jpeg")) {
String referer = request.getHeader("Referer");
if (referer != null && referer.contains("baidudu.com")) {
return true;
} else {
response.sendError(HttpServletResponse.SC_FORBIDDEN);
return false;
}
}
return true;
}
注冊攔截器時,采用 Spring Boot 的 WebMvcConfigurer 接口將該攔截器應用于所有請求路徑。
3. 靈活配置實現(xiàn)方案
為了使防盜鏈的配置更加靈活,可以將配置項(例如是否開啟防盜鏈、是否允許瀏覽器直接訪問、白名單域名等)寫在 application.yml 中,并利用配置類映射到 Java 對象中。
3.1 配置文件示例
在 application.yml 中定義如下配置:
img-protect: enabled: true allowBrowser: false allowReferer: baidudu.com
3.2 映射配置類
利用 @ConfigurationProperties 將配置項映射到 Java 類中,方便后續(xù)使用:
@Component
@ConfigurationProperties("img-protect")
public class ImgProtectConfig {
private boolean enabled;
private boolean allowBrowser;
private String allowReferer;
// getter/setter 略
}
3.3 攔截器實現(xiàn)細節(jié)
在新版攔截器中,通過注入上述配置類,實現(xiàn)如下邏輯:
- 若防盜鏈功能未開啟,則直接放行。
- 對圖片資源請求(通過 URL 后綴判斷):
- 如果 Referer 為空且允許瀏覽器直接訪問(allowBrowser 為 true),則放行;
- 如果 Referer 不為空,則調(diào)用輔助方法判斷 Referer 是否包含配置中允許的域名(允許多個域名,逗號分隔);
- 否則返回 403。
例如:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!imgProtectConfig.getEnabled()){
return true;
}
String requestUrl = request.getRequestURL().toString();
if (requestUrl.endsWith(".jpg") || requestUrl.endsWith(".png") || requestUrl.endsWith(".jpeg")) {
String referer = request.getHeader("Referer");
if (referer == null && imgProtectConfig.getAllowBrowser()){
return true;
} else if (referer != null && isAllowedDomain(referer)) {
return true;
} else {
response.sendError(HttpServletResponse.SC_FORBIDDEN);
return false;
}
}
return true;
}
其中 isAllowedDomain 方法遍歷配置中允許的多個域名進行比對。
4. 注意事項及局限性
雖然這種通過檢查 Referer 實現(xiàn)的防盜鏈功能在一般場景下能有效防止資源被盜用,但仍存在一些不足之處:
- Referer 偽造:惡意客戶端可以偽造 Referer 頭信息,繞過檢測。
- 漏報問題:攻擊者可能利用 data URI 或 Base64 編碼等方式繞過檢查。
- 誤報問題:部分合法用戶(例如使用隱私瀏覽器或代理服務器時)可能因 Referer 不匹配而被誤攔截。
- 反向代理問題:攻擊者可能利用反向代理手法,通過 URL 路徑中加入白名單域名繞過 contains 判斷。
因此,該方法只是基本防護手段,并不能保證絕對安全,實際應用中可結合更嚴格的安全措施(如 Token 驗證、Nginx 防盜鏈等)來共同提升防護效果。
5. 總結
本文展示了兩種基于 Spring Boot 實現(xiàn)圖片防盜鏈的方式:
- 簡單寫死配置的方式,直接在攔截器中判斷 Referer;
- 基于配置文件靈活配置的方式,通過
application.yml配置防盜鏈參數(shù),并在攔截器中使用。
雖然這種方法能對一般情況下的盜鏈行為起到一定防護作用,但考慮到 Referer 可偽造等問題,實際項目中還需根據(jù)具體場景綜合考慮更全面的安全策略。
到此這篇關于基于SpringBoot實現(xiàn)圖片防盜鏈的兩種方式的文章就介紹到這了,更多相關SpringBoot圖片防盜鏈內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot項目中@Test不出現(xiàn)可點擊運行的按鈕問題
這篇文章主要介紹了SpringBoot項目中@Test不出現(xiàn)可點擊運行的按鈕問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
詳解IDEA中類加載器調(diào)用getResourceAsStream()方法需注意的問題
這篇文章主要介紹了詳解IDEA中類加載器調(diào)用getResourceAsStream()方法需注意的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
elasticsearch集群cluster主要功能詳細分析
這篇文章主要為大家介紹了elasticsearch集群cluster主要功能詳細分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04
Windows10系統(tǒng)下JDK1.8環(huán)境變量的配置
今天帶大家學習在Windows10系統(tǒng)下怎么配置JDK1.8環(huán)境變量,文中有非常詳細的安裝及配置教程,對正在學習的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05

