概念

跨站请求伪造(Cross-site request forgery,CSRF),是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行。

XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户浏览器的信任。

攻击原理

跨站请求伪造CSRF - 图1

  • 用户登录 A 网站
  • A 网站确认身份
  • B 网站页面向 A 网站发起请求(带 A 网站身份)
    • B 网站向 A 网站请求,带 A 网站 Cookies
    • 不访问 A 网站前端
    • referer 为 B 网站

危害

  • 利用用户登录态
  • 用户不知情
  • 完成业务请求

防御

带 A 网站 Cookies

利用 Cookie 中新增属性 same-site,禁止第三方网站带 Cookies。但是这样适配性比较差,目前只有 Chrome 支持。

不访问 A 网站前端

在前端页面加入验证消息,有 2 种方式:

  • 验证码
    因为 CSRF 攻击是在用户无意识的情况下发生的,所以要求用户输入验证码可以让用户知道自己正在做的操作。
  • token
    例如服务器生成随机数并附加在表单中,并要求客户端传回这个随机数。

referer 为 B 网站

验证 referer。判断请求的来源是否合法。