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 跨站只发源信息。上线前要检查站点策略。
写段代码
jsconst url = new URL(req.get('referer') || ''); if (url.protocol !== 'https:' || !TRUSTED.has(url.hostname)) return res.sendStatus(403);