
CSRF攻击利用用户已登录的会话状态,通过诱导用户点击恶意链接或表单,绕过服务器验证,执行非授权的敏感操作(如修改密码、转账)。
用户登录网站后,浏览器会保存一个session cookie(用于标识用户身份)。攻击者构造一个包含恶意操作(如修改密码、转账)的页面(如HTML链接或表单),当用户点击时,浏览器会自动带上网站A的cookie,向目标网站发送请求。由于请求来自已登录的用户,服务器验证cookie有效后,执行操作。
类比:就像你拿着有效银行卡(登录状态),攻击者给你一个“转账”按钮,你点击后,银行系统会认为是你操作,因为你的卡还在有效期内——攻击者没偷卡,只是让你按了按钮。关键点是攻击者无法窃取cookie,但能诱导用户点击,利用用户已登录的信任。
| 攻击类型 | 攻击目标 | 攻击方式 | 依赖条件 | 防护重点 |
|---|---|---|---|---|
| CSRF | 服务器端 | 诱导用户点击恶意链接/表单 | 用户已登录目标网站 | 验证请求来源(Referer、SameSite、CSRF token) |
| XSS | 客户端 | 注入恶意脚本到页面 | 用户访问包含恶意脚本的页面 | 输入验证、输出编码、内容安全策略 |
| 请求方法 | ||||
| GET | 查询操作(如查询账户信息) | 无请求体,仅URL参数 | 用户点击链接 | 无需特殊防护(但敏感操作禁用GET) |
| POST | 修改操作(如修改密码、转账) | 有请求体,数据在body中 | 用户点击表单 | 必须验证请求来源(如token、Referer) |
用户登录银行网站后,攻击者构造一个恶意POST表单(用于修改密码):
<form action="https://bank.com/api/change-password" method="POST">
<input type="hidden" name="new_password" value="hacked123">
<input type="hidden" name="csrf_token" value="invalid_token"> <!-- 攻击者未获取有效token -->
<button type="submit">点击修改密码</button>
</form>
用户点击按钮后,浏览器发送POST请求,携带用户登录的session cookie,服务器验证cookie有效后,执行密码更新操作(因服务器未验证csrf_token,导致漏洞)。
CSRF攻击的核心是利用用户已登录的会话状态,诱导用户在目标网站执行非授权操作。原理上,用户登录后,浏览器会保存session cookie,攻击者构造恶意页面(如链接或表单),用户点击后,浏览器自动带上cookie发送请求,服务器验证通过后执行操作。比如,用户登录银行后,攻击者发送一个修改密码的链接,用户点击后,银行系统会认为是你操作,从而修改密码。防护方面,360浏览器通过SameSite cookie(如设置Strict,仅同源请求携带cookie)、Referer检查(验证请求来源)、以及对于敏感操作添加验证码(如转账时弹出验证码),降低风险。具体来说,SameSite=Strict时,跨站请求不会携带cookie;Referer检查确保请求来自合法来源;敏感操作增加验证码,需要用户二次确认,防止CSRF。