CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种Web安全漏洞,攻击者诱骗已认证的用户在不知情的情况下执行非预期的操作。这种攻击利用了Web应用对用户浏览器的信任机制。
01CSRF攻击的特点:
- - 攻击者诱导用户访问恶意网站或点击恶意链接
- - 用户在已登录目标网站的情况下发起非预期请求
- - 请求看起来像是用户自愿发起的
- - 攻击通常针对状态变更操作(如转账、改密码、发消息等)
02CSRF攻击原理
- 用户登录可信网站A,获得认证Cookie
- 用户在不登出网站A的情况下访问恶意网站B
- 网站B包含一个自动向网站A发起请求的代码
- 由于用户的浏览器会自动携带网站A的Cookie,请求被当作合法请求执行
Tip
HTTPS 本身无法阻止 CSRF
03防护方式
- 同步器令牌模式(Synchronizer Token Pattern)
1.服务端在渲染包含敏感操作的表单页面时,生成一个与当前用户会话绑定的随机、不可预测的令牌,并将其作为隐藏字段嵌入表单(或通过响应头下发)。
2.当表单提交时,服务端校验请求中的令牌是否与会话中存储的令牌一致。
3.攻击者因同源策略限制,无法读取目标站点页面中的令牌值,因此无法构造出通过校验的请求。
- 设置SameSite Cookie属性
通过Cookie的SameSite属性限制第三方使用Cookie:
- Strict:完全禁止第三方使用Cookie
- Lax:宽松模式,允许部分安全请求携带Cookie
- 关键操作二次验证
对于极高风险的操作(如大额转账、修改密码、删除账户),可在提交前要求用户重新输入密码或完成 CAPTCHA 验证。
- 避免在 GET 请求中改变状态
遵循 HTTP 语义规范,GET 请求应仅用于读取数据,所有状态变更操作均通过 POST、PUT、PATCH 或 DELETE 完成。这可以消除通过 <img> 标签等简单方式触发 CSRF 的风险,迫使攻击者必须使用更复杂的表单或 AJAX 方式,从而提高攻击门槛。
总结
结论先行CSRF 的本质是利用浏览器对身份凭证的自动携带机制,将攻击者的指令伪装成用户的合法操作。防御的关键不在于隐藏接口或加密传输,而在于让服务端能够区分“用户主动发起的请求”与“第三方页面诱导的请求”。同步器令牌模式通过引入攻击者无法读取的随机值,从根本上解决了这一鉴别问题,应作为核心防御手段。SameSite Cookie 和二次验证可作为有效的纵深补充,但不应单独依赖。开发者在设计接口时,同时应遵循“GET 不改变状态”的原则,从源头上减少可被简单利用的攻击面。