靠referer日志封禁盗链效果有限,需结合日志分析异常模式(如无关/仿冒referer、高频ip请求、异常ua)、分层拦截(cdn黑名单、waf限速、条件重写)并保留空referer白名单,辅以定期复核与签名url增强防护。

直接靠 Referer 日志封禁盗链效果有限,但结合日志分析 + 合理规则,能有效识别并拦截大部分低门槛盗链行为。关键不是“一刀切封”,而是“找异常模式、建白名单、放行合理空 Referer”。
从日志里抓出可疑 Referer 的特征
盗链请求在访问日志中通常有明显痕迹,重点看 资源路径、Referer 值、User-Agent、请求频次、IP 分布 这几项:
- Referer 是完全无关的域名,比如请求你站的
/images/logo.png,Referer 却是http://xxx-qqq123.com/或拼凑型地址(如https://evil.com/your-site.com/photo.jpg) - Referer 域名含大量数字、随机字符串、或明显仿冒词(如
yourdoomain.com、your-site.net) - 同一 IP 在短时间内高频请求图片、视频、PDF 等静态资源(如 1 分钟内 50+ 次 .jpg 请求),且 Referer 不固定或为空
- User-Agent 是空、极简(如
-)、或明显非浏览器(如curl/7.68.0、python-requests),同时 Referer 却写着你的域名(伪造痕迹) - Referer 是 HTTPS,但请求的是你站的 HTTP 资源(可能因 Referrer Policy 被截断,需结合上下文判断是否真恶意)
用日志工具快速筛选和导出异常样本
别手动翻日志。用标准工具做初步过滤:
- 用
awk或grep提取含图片后缀且 Referer 非空、非本站的行:awk '$9 ~ /.(jpg|jpeg|png|gif|webp)$/ && $11 !~ /^https?://(www.)?your-domain.com// {print $1,$11,$9}' access.log | head -50 - 统计 Referer 域名出现频次,排前 20:
awk '$11 ~ /^https?:/// {gsub(/https?://([^/]+).*/, "\1", domain); print domain}' access.log | sort | uniq -c | sort -nr | head -20 - 查空 Referer 中高频请求静态资源的 IP:
awk '$11 == "-" && $9 ~ /.(jpg|png)$/ {print $1}' access.log | sort | uniq -c | sort -nr | head -10
封禁不能只靠 Referer 字符串匹配
单纯在 Web 服务器或 CDN 上加一条 deny from evil.com 很容易误伤或被绕过。更稳妥的做法是分层处理:
- 对确认为盗链的域名,在 CDN(如阿里云 DCDN、腾讯云 CDN)后台加入 Referer 黑名单,支持通配符(如
*xxx-qqq123.com) - 对高频爬虫类 IP,不依赖 Referer,直接在 WAF 或安全组层面限速或封禁(例如单 IP 每分钟超过 30 次图片请求即临时拉黑 1 小时)
- 对 User-Agent 明显异常 + Referer 伪造的组合请求,可加 Apache/Nginx 的条件重写规则,返回 403 或跳转到提示页
- 避免封死空 Referer —— 微信内嵌页、PWA、书签直连、HTTPS→HTTP 场景下都可能为空,必须保留放行逻辑
后续要持续做的三件事
盗链策略不是设一次就完事。需要形成闭环:
- 每周跑一次 Referer 频次 Top 50 报表,人工复核新增高频域名是否属于合作方或误判
- 把已知合规平台(如微信、微博、钉钉)的典型 Referer 和 UA 加入白名单,哪怕它们经常为空或不可靠
- 对核心资源(如会员头像、付费文档)启用签名 URL 或 Token 验证,Referer 只作为辅助校验,不作唯一依据










