5月30日 21:29

Referer 头能防护 CSRF 吗?验证时有哪些局限?

Referer 校验能作为 CSRF 防护的一层辅助判断,但不适合当唯一防线。它的做法是对会改变状态的请求,服务端读取 Referer 请求头,确认发起页面来自可信站点;如果来自陌生域名、格式非法或缺失,就拒绝或进入更严格校验流程。它能挡住不少粗糙的跨站表单攻击,但受浏览器隐私策略、Referrer-Policy、HTTPS/HTTP 跳转、代理和客户端实现影响。

追问

Referer 和 Origin 有什么区别?

Origin 只包含协议、域名和端口,不包含完整路径,隐私暴露更少,也更适合安全校验。Referer 信息更完整,但更容易被策略裁剪。

没有 Referer 的请求要不要拒绝?

管理后台、转账、改密等敏感操作建议拒绝。普通业务可以要求 CSRF Token 通过,并记录日志观察误杀比例。

验证 Referer 最常见绕过点是什么?

includes('example.com') 当安全判断,可能被 example.com.evil.com 绕过。应解析 URL 后比较 hostname。

Referrer-Policy 会影响吗?

会。no-referrer 可能完全不发 Referer,strict-origin-when-cross-origin 跨站只发源信息。上线前要检查站点策略。

写段代码

js
const url = new URL(req.get('referer') || ''); if (url.protocol !== 'https:' || !TRUSTED.has(url.hostname)) return res.sendStatus(403);
标签:CSRF