目录

  1. 什么是图片防盗链?
  2. 图片防盗链的原理分析
  3. 常见前端防盗链技术手段
  4. 基于HTTP Referer的防盗链
  5. Spring Boot中实现防盗链的方案
  6. 代码示例:Spring Boot实现Referer校验
  7. 其他进阶防盗链技术
  8. 总结与建议

1. 什么是图片防盗链?

  • 定义:防盗链指防止其他网站直接引用自己网站上的图片资源,避免因流量盗用导致带宽浪费和资源滥用。
  • 目的:保护服务器资源,保障自身带宽和内容安全。

2. 图片防盗链的原理分析

  • 利用HTTP请求中的Referer字段判断图片请求来源是否来自授权域名。
  • 合法站点请求则正常返回图片,非法请求则拒绝访问或返回默认图片。

3. 常见前端防盗链技术手段

技术方式说明优缺点
Referer 校验服务器检测请求的Referer字段简单易实现,但Referer可伪造
Token签名验证URL带动态签名参数,校验有效性安全性高,适合敏感资源保护
Cookie验证结合会话Cookie进行请求校验依赖用户登录状态,适用场景有限
CDN防盗链配置利用CDN提供的防盗链服务部署方便,但可能产生额外费用
图片加水印图像层面保护,防止被盗用后直接使用无法阻止盗链,只是降低盗用价值

4. 基于HTTP Referer的防盗链

  • 通过HTTP请求头中的Referer字段判断请求来源。
  • 允许Referer为空或来自白名单域名的请求。
  • 拒绝其他来源,返回错误或默认图片。

5. Spring Boot中实现防盗链的方案

  • 利用FilterInterceptor拦截图片请求。
  • 获取请求头中的Referer字段,判断是否合法。
  • 合法则继续放行,非法则返回错误响应或替换图片。

6. 代码示例:Spring Boot实现Referer校验

6.1 创建防盗链拦截器

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

@Component
public class RefererInterceptor implements HandlerInterceptor {

    private static final String[] ALLOWED_DOMAINS = {
        "https://www.yoursite.com",
        "https://yoursite.com"
    };

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String referer = request.getHeader("Referer");
        
        // 允许Referer为空(直接访问)或来自允许的域名
        if (referer == null || isAllowedReferer(referer)) {
            return true; // 允许访问
        } else {
            // 返回403禁止访问,或者返回默认图片
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            response.getWriter().write("Forbidden: Illegal image request");
            return false;
        }
    }

    private boolean isAllowedReferer(String referer) {
        for (String domain : ALLOWED_DOMAINS) {
            if (referer.startsWith(domain)) {
                return true;
            }
        }
        return false;
    }
}

6.2 注册拦截器

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private RefererInterceptor refererInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 只拦截图片资源路径,如 /images/**
        registry.addInterceptor(refererInterceptor).addPathPatterns("/images/**");
    }
}

7. 其他进阶防盗链技术

  • URL签名机制:图片URL带有时效性签名,防止伪造访问。
  • 动态水印:为图片添加动态水印,减少盗用价值。
  • CDN防盗链功能:如阿里云、腾讯云、Cloudflare等CDN提供高级防盗链配置。
  • 验证码和登录授权:敏感资源通过登录或验证码保护。

8. 总结与建议

  • Referer防盗链简单易用,但存在伪造风险,适合基础防护。
  • 结合URL签名和CDN防盗链方案,安全性更高。
  • 防盗链是综合防护的一部分,建议配合水印和访问权限控制。
  • 实现防盗链时需考虑合法用户体验,避免误杀。