跳到主要内容

跨站请求伪造(CSRF)

概要

CSRF攻击是一种利用用户登录状态(浏览器会自动附带的Cookie等凭证)在用户不知情的情况下执行恶意请求的攻击方式。攻击者诱导已登录的用户访问事先构造好的页面或链接,让用户的浏览器向目标网站发出伪造的请求,从而以用户的身份执行不期望的操作,如不正当的转账、商品购买、退会等。构建安全的网站必须注意防范CSRF攻击的威胁,并采取相应的措施来保护用户。

根本对策

  • 使用秘密的Token(自动生成的hidden参数,即CSRF Token)

服务端在生成表单页面时,用密码学安全的随机数生成器生成一个第三方无法预测的秘密Token,与用户会话绑定后以hidden参数的形式嵌入表单。客户端提交表单时会将该Token一起提交到服务端,服务端校验Token与会话中保存的值是否一致,只有校验通过时才执行操作。关键在于Token必须不可预测:攻击者虽然能让用户的浏览器发出请求,但无法得知该用户对应的Token值,因此伪造的请求无法通过校验。

  • 再次输入密码进行认证

在执行重要操作之前,让用户再次输入密码进行认证。这样可以确保是用户本人在操作,攻击者伪造的请求因无法提供密码而失败。但是,这种方法会增加用户的操作复杂度,且不适用于所有情况。

  • 确认Referer

在执行操作的页面中,检查Referer头以确认请求来源是否是本站的正规页面,否则不执行请求。需要注意:用户的浏览器设置、隐私插件或代理可能不发送Referer,这部分用户将无法使用相应功能;因此这种方法有局限性,不适用于所有情况。

保险对策

  • 自动发送邮件通知用户

在用户执行重要操作后,向用户发送一封邮件通知,告知用户操作已经完成。这无法阻止攻击本身,但如果有人在用户不知情的情况下执行了操作,用户就能及时发现并止损。

现代浏览器支持给Cookie设置 SameSite 属性(LaxStrict),限制跨站请求时是否携带Cookie,能有效缓解CSRF。主流浏览器目前对未指定该属性的Cookie默认按 Lax 处理。它是很好的纵深防御手段,但由于存在例外场景(如旧浏览器),一般仍建议与CSRF Token配合使用,而不是单独依赖。