mobile wallpaper 1
mobile wallpaper 2
mobile wallpaper 3
mobile wallpaper 4
mobile wallpaper 5
1421 字
4 分钟
防盗链(Hotlink Protection)· 初步了解

防盗链(Hotlink Protection)知识笔记#

一、什么是防盗链#

一句话定义:防盗链是服务器端的一种访问控制机制,通过检查请求来源(Referer 头),拒绝「本站资源被其他网站直接引用」的请求。

最典型场景:网站图片 https://img.example.com/pic.jpg 被别人的网站用 <img src="https://img.example.com/pic.jpg"> 直接引用——别人网站的访客浏览时,流量和带宽算自己的,功劳和展示是外站的。

二、威胁场景与原理#

1. 威胁场景#

  • 带宽盗用:图片、视频、下载文件被外部站点引用,消耗你的服务器带宽和流量费(CDN 按流量计费的话,直接烧钱)。
  • 品牌/内容滥用:他人站点展示你的资源,用户可能误以为内容属于对方。
  • 绕过付费墙:比如某图床限制免费用户外链,攻击者找到绕过方式。

2. 工作原理:HTTP Referer 头#

浏览器加载页面资源时,会自动带上 Referer 头,告诉服务器「这个请求是从哪个页面发起的」。

正常访问你的页面: GET /pic.jpg Referer: https://example.com/article.html ✅
被外站盗链引用: GET /pic.jpg Referer: https://evil-site.com/page.html ❌
直接输入地址访问: GET /pic.jpg (无 Referer 头)

服务器(如 Nginx)在返回资源前检查 Referer:

  • 来源是自己站 → 正常返回
  • 来源是外站 → 返回 403,或返回一张「禁止盗链」的占位图

三、实操:Nginx 配置#

1. 修改前(默认配置,无防盗链)#

server {
listen 80;
server_name img.example.com;
location / {
root /var/www/images;
}
}

此时任何站点都能直接引用你的图片。

2. 修改后(启用防盗链)#

server {
listen 80;
server_name img.example.com;
location / {
root /var/www/images;
# 合法的 Referer 列表:自己的域名 + 允许外链的白名单
valid_referers none blocked server_names
*.example.com
example.com
~\.google\.com$; # 正则写法:允许 google.com 及其子域
# $invalid_referer 是 nginx 内置变量:不匹配上面列表则为 1
if ($invalid_referer) {
# 方案A:直接拒绝
return 403;
# 方案B(二选一):返回占位图,提示盗链者
# rewrite ^.*$ /anti-hotlink.png break;
}
}
}

参数含义:

参数含义
none允许没有 Referer 的请求(如直接输入地址、curl、某些隐私模式浏览器)
blocked允许 Referer 存在但被防火墙/代理抹掉或伪造残缺的请求
server_names允许与当前 server 块同名的域名
*.example.com允许 example.com 的所有子域名
~正则以 ~ 开头表示后面是正则表达式
if ($invalid_referer)⚠️ nginx 官方文档说 if 有坑,尽量只用它做 return/rewrite,不要嵌复杂逻辑

3. 配置后重载生效#

nginx -t # 先测试语法,防止配置错误导致服务挂掉
systemctl reload nginx # 重载配置,不断开现有连接

4. 验证#

# 模拟正常访问(带合法 Referer)→ 应返回 200
curl -I -e "https://example.com/page" http://img.example.com/pic.jpg
# 模拟盗链(带外站 Referer)→ 应返回 403
curl -I -e "https://evil-site.com" http://img.example.com/pic.jpg
# 模拟无 Referer 的直接访问 → 根据 none 配置,应返回 200
curl -I http://img.example.com/pic.jpg

-e 是 curl 设置 Referer 头的简写,等价于 -H "Referer: ..."。

四、攻防视角#

攻击者如何绕过防盗链#

手法说明对策
伪造 Referercurl/程序请求随便填 RefererReferer 本身可伪造,它只是门槛不是锁
中转代理攻击者服务器拉取你的资源再转发监控异常 UA/IP 频率;重要资源用签名 URL
盗搜索引擎流量伪装成 Googlebot 等爬虫 UAUA+Referer 联合校验
抓真实浏览器流量重放用无头浏览器带真实 Referer 访问频率限制 + 资源指纹(水印)

防御者的检测手段#

# 查看图片类请求里 Referer 为外站的分布(Top 20)
awk '$7 ~ /\.(jpg|png|gif)/ {for(i=1;i<=NF;i++) if($i ~ /^Referer:/) print $i}' access.log \
| sort | uniq -c | sort -rn | head -20
# 统计消耗带宽最大的 Referer
awk '{ ... }' access.log # 思路:按 Referer 分组累加 $10(bytes 字段)

五、常见误区#

  1. 「Referer 可以为空,所以防盗链没意义」——不完全对。防盗链挡的是「无成本批量引用」,提高攻击者成本;但它不能防有目的的攻击者伪造 Referer。
  2. 「防盗链 = 安全机制」——它是成本控制和资源保护,不是认证授权。敏感资源该做签名 URL / 临时 Token(如 OSS 的 STS)。
  3. none blocked 不加会怎样——很多手机 App、微信内置浏览器、隐私模式下 Referer 为空或被裁剪,不加 none blocked 会误伤正常用户。
  4. CDN 场景:如果你套了 CDN,防盗链要在 CDN 控制台配置(Referer 白名单),源站配置可能不生效或被 CDN 缓存策略干扰。

六、关联知识#

  • HTTP 头安全:Referrer-Policy(注意浏览器端是 Referrer-Policy,服务器端检查是 Referer,历史拼写错误沿用至今)
  • CDN 资源保护:Referer 白名单、UA 黑白名单、URL 签名鉴权
  • 对象存储(OSS/S3)的防盗链与签名 URL
  • 日志分析:awk 日志统计

自检问题#

Q1:你的日志里发现某个陌生站点每天引用你 2GB 的图片流量,但你配置了 Referer 白名单,为什么它还能盗链成功?

答案

最大可能是它伪造了 Referer,把它请求头里的 Referer 设置成了你白名单里的域名(比如 example.com)。Referer 是客户端可控的字段,任何脚本都能伪造。应对:加频率限制、对高价值资源换签名 URL。

Q2:配置防盗链后,有用户反馈微信里打开你的页面图片全部裂了,可能是什么原因?

答案

微信内置浏览器对部分请求不发送 Referer(或 Referer 为空),你的 valid_referers 里没有加 none,导致这类合法请求被判为盗链返回 403。修复:加入 none blocked,或在 CDN 层单独配置白名单。


案例参考#

  • 图床大战:早期国内大量论坛用外链图床,图床运营方普遍上 Referer 防盗链 + 域名白名单,随后出现「图床代理站」做中转绕过,最终图床转向按流量收费或禁止外链。
  • 视频网站盗链:爱奇艺/优酷等早年视频盗链严重,后来演进为 URL 鉴权签名(时间戳 + 密钥 + 路径 MD5),不再依赖 Referer——这正是因为 Referer 可伪造。

演进路径:Referer 防盗链是 V1 方案,签名 URL 是 V2 方案。


后续可以深入去了解 URL 签名鉴权的底层原理(时间戳防重放、HMAC 算法)。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

防盗链(Hotlink Protection)· 初步了解
https://yuancnest.top/posts/防盗链hotlink-protection-初步了解/
作者
YuanChao
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录