CSRF跨站请求伪造攻击与防护
字数 1121 2025-11-02 17:10:18
CSRF跨站请求伪造攻击与防护
描述
CSRF(Cross-Site Request Forgery)是一种恶意攻击方式,攻击者诱骗用户在已登录目标网站的情况下,执行非预期的操作(如修改密码、转账等)。其核心在于利用用户身份验证凭证的自动携带机制(如Cookie),通过伪造请求实施恶意行为。
攻击原理
- 用户登录信任网站(如银行网站):服务器返回身份验证Cookie,浏览器自动保存并在后续请求中携带。
- 用户访问恶意页面:攻击者通过邮件/论坛诱导用户访问包含恶意代码的页面。
- 伪造请求自动触发:恶意页面隐藏了伪造的请求(如
<img src="http://bank.com/transfer?to=attacker&amount=1000">),浏览器自动发送请求并携带Cookie。 - 服务器误认为用户合法操作:因请求包含有效Cookie,服务器执行操作(如转账)。
防护措施
-
同源策略(SOP)限制:浏览器默认禁止跨域读取响应,但跨域请求仍可发送(如
<img>、<form>标签),因此SOP无法完全阻止CSRF。 -
CSRF Token验证
- 原理:在关键请求(如POST)中携带随机Token(存在Session或Cookie中),服务端验证Token合法性。
- 实现步骤:
- 用户访问页面时,服务端生成随机Token并存入Session,同时传递给前端(如隐藏表单字段)。
- 前端提交请求时携带Token(如表单字段或请求头)。
- 服务端比对请求中的Token与Session中的是否一致。
- 关键点:Token需随机且保密,攻击者无法预测或窃取(因同源策略限制)。
-
SameSite Cookie属性
- 原理:设置Cookie的
SameSite属性,限制跨域请求携带Cookie。Strict:完全禁止跨域携带Cookie(可能导致用户体验问题)。Lax(默认):允许部分安全请求(如GET)携带Cookie,阻止非安全请求(如POST)。
- 示例:
Set-Cookie: sessionId=abc; SameSite=Lax;
- 原理:设置Cookie的
-
验证Referer/Origin头
- 检查请求头中的
Referer或Origin字段是否来源于可信域名。 - 局限性:某些场景下Referer可能被隐私设置过滤或伪造。
- 检查请求头中的
-
二次验证
- 对敏感操作(如转账)要求用户重新输入密码或短信验证码。
总结
CSRF防护需结合多种措施:优先使用CSRF Token(适用于关键操作)和SameSite Cookie(减少依赖Token的场景),辅以其他验证手段。理解浏览器自动携带Cookie的机制是防御的关键。