单纯靠 referer 校验无法防住恶意爬虫,因该字段可被客户端随意伪造;需叠加 token 签名(含时间戳与 hmac-sha256)、origin/referer 双校验、ip 限流及行为分析,并规避 if 伪指令等配置陷阱。

单纯靠 Referer 校验无法防住恶意爬虫伪造,因为 Referer 是客户端可随意修改的 HTTP 头。要真正提升防护强度,必须叠加其他不可轻易伪造或需服务端协同验证的机制。
用 Token 签名强制校验请求合法性
让每个资源链接携带动态参数(如 t=1755708000&sign=abc123...),Nginx 在 location 中校验时间戳是否过期、签名是否匹配预设密钥和规则。攻击者即使知道算法,没有服务端密钥也无法生成有效 sign。
- 时间戳(
t)限制有效期,比如只允许 300 秒内请求 - 签名(
sign)建议用 HMAC-SHA256,拼接路径 + 时间戳 + 密钥后计算 - Nginx 本身不支持复杂哈希,需配合 Lua 模块(如 lua-resty-hmac)或用 OpenResty,或把校验逻辑下沉到后端(Nginx 仅做基础路由和缓存)
结合 Origin 头与 Referer 双重比对
部分现代浏览器在跨域请求中会同时发送 Referer 和 Origin。虽然 Origin 也能被 curl 等工具伪造,但多数自动化爬虫仍习惯只设 Referer。可在配置中同时检查两者:
- 用
map指令提取$http_origin,判断是否在白名单内 - 对非 CORS 请求(如直接 img 标签),仍依赖 Referer;对 AJAX 类请求,则优先信任 Origin
- 若两者冲突(如 Origin 合法但 Referer 非法),可记录日志并临时限流,不直接放行
引入 IP 行为分析与限流兜底
盗链往往伴随高频、无规律、UA 单一、无 Cookie 的特征。单靠头信息不够时,用限流+行为识别补位:
- 对静态资源目录(如
/images/)启用limit_req,按 IP 限制每秒请求数(如 2r/s) - 对短时间内大量 403 的 IP,用
geo+map动态标记,再在后续请求中拦截 - 配合日志分析(如用 GoAccess 或自定义脚本),定期拉取异常 Referer 和 UA 组合,加入黑名单
关键细节:避免“假安全”陷阱
很多配置看似严密,实则存在逻辑漏洞:
-
if ($invalid_referer)不能嵌套在rewrite或return后面——Nginx 的 if 是伪指令,易引发意外执行顺序 - 空 Referer(
none)必须谨慎放开,尤其对敏感资源,可考虑仅对首页或公开页允许 - CDN 回源时,真实 Referer 可能被覆盖为 CDN 域名,需提前与 CDN 厂商确认头传递策略(如启用
Referer-Pass或改用X-Real-Referer)











