CORS 请求中 Referrer 检查到底安不安全?

采涵 Dev 阅读 21

我在做前端请求时,后端同事说他们加了 Referrer 检查来防止跨域攻击,但我听说这其实不靠谱?

比如我用 fetch('/api/data') 发请求,浏览器自动带上了 Referer 头,但这个值能被伪造吗?或者在某些环境下根本不会发送?

之前试过在本地开发时(http://localhost:3000)请求测试接口,结果后端因为 Referer 不是白名单域名直接拒绝了,搞得调试很麻烦。

这是不是说明依赖 Referer 做安全校验有隐患?有没有更靠谱的替代方案?

我来解答 赞 12 收藏
二维码
手机扫码查看
1 条解答
上官天朝
问题应该出在后端把 Referer 当成主要安全校验手段了,这确实不靠谱。

Referer 头是浏览器自动加的,但有几种情况它根本不会带,或者会被清掉:
比如从 HTTPS 页面发请求到 HTTP 接口(浏览器会自动砍掉 Referer),或者用了 fetch('/api', { referrerPolicy: 'no-referrer' }) 这类设置,甚至有些隐私插件或浏览器设置也会屏蔽。
另外,虽然 Referer 在大多数情况下是浏览器生成的、难以被前端 JS 直接伪造,但后端如果只靠它来防跨域,那攻击者完全可以换别的攻击方式,比如直接用 Node.js 写个脚本发请求——根本没浏览器,Referer 都没有,自然绕过。

更关键的是,Referer 是用户可控的上下文产物,不是请求来源的可靠证明。
比如用户点了个外部链接跳转到你页面,再发起请求,Referer 就是外部域名,可能你白名单里压根没这玩意,结果误伤。

真正要防 CSRF,应该用标准方案:
- 前端发请求时带上 credentials: 'include'(配合 Set-Cookie: SameSite=None; Secure
- 后端用 CSRF Token 校验,比如每次表单或关键请求带一个随机 Token,后端比对
- 或者用双重 Cookie 模式(比如把 Token 写进 Cookie,再让前端在 Header 里带一份,后端比对)

本地调试时被 Referer 拒绝,其实只是暴露了你后端逻辑太依赖 Referer 这个脆弱指标。
建议后端同学把 Referer 检查降级为“日志记录或风控参考”,别当硬性安全门槛,否则开发体验和线上稳定性都会被坑。
点赞
2026-02-26 10:02