目录
- 什么是图片防盗链?
- 图片防盗链的原理分析
- 常见前端防盗链技术手段
- 基于HTTP Referer的防盗链
- Spring Boot中实现防盗链的方案
- 代码示例:Spring Boot实现Referer校验
- 其他进阶防盗链技术
- 总结与建议
1. 什么是图片防盗链?
- 定义:防盗链指防止其他网站直接引用自己网站上的图片资源,避免因流量盗用导致带宽浪费和资源滥用。
- 目的:保护服务器资源,保障自身带宽和内容安全。
2. 图片防盗链的原理分析
- 利用HTTP请求中的
Referer
字段判断图片请求来源是否来自授权域名。
- 合法站点请求则正常返回图片,非法请求则拒绝访问或返回默认图片。
3. 常见前端防盗链技术手段
技术方式 | 说明 | 优缺点 |
---|
Referer 校验 | 服务器检测请求的Referer字段 | 简单易实现,但Referer可伪造 |
Token签名验证 | URL带动态签名参数,校验有效性 | 安全性高,适合敏感资源保护 |
Cookie验证 | 结合会话Cookie进行请求校验 | 依赖用户登录状态,适用场景有限 |
CDN防盗链配置 | 利用CDN提供的防盗链服务 | 部署方便,但可能产生额外费用 |
图片加水印 | 图像层面保护,防止被盗用后直接使用 | 无法阻止盗链,只是降低盗用价值 |
4. 基于HTTP Referer的防盗链
- 通过HTTP请求头中的Referer字段判断请求来源。
- 允许Referer为空或来自白名单域名的请求。
- 拒绝其他来源,返回错误或默认图片。
5. Spring Boot中实现防盗链的方案
- 利用
Filter
或Interceptor
拦截图片请求。
- 获取请求头中的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防盗链方案,安全性更高。
- 防盗链是综合防护的一部分,建议配合水印和访问权限控制。
- 实现防盗链时需考虑合法用户体验,避免误杀。
发表回复