CSRF

简单来说,CSRF 就是网站 A 对用户建立信任关系后,在网站 B 上利用这种信任关系,跨站点向网站 A 发起一些伪造的用户操作请求,以达到攻击的目的。

例子

举个例子。网站 A 是一家银行的网站,一个转账接口是 “http://www.bankA.com/transfer?toID=12345678&cash=1000”。toID 表示转账的目标账户,cash 表示转账数目。当然这个接口没法随便调用,只有在已经验证的情况下才能够被调用。

此时,攻击者建立了一个 B 网站,里面放了一段隐藏的代码,用来调用转账的接口。当受害者先成功登录了 A 网站,短时间内不需要再次验证,这个时候又访问了网站 B,B 里面隐藏的恶意代码就能够成功执行。

预防

那怎么预防 CSRF 攻击呢?

OWASP 推荐了两种检查方式来作为防御手段。

检查标准头部

检查标准头部,确认请求是否同源。检查 source origin 和 target origin,然后比较两个值是否匹配

检查 CSRF Token

主要有四种推荐的方式

  • Synchronizer Tokens

在表单里隐藏一个随机变化的 token,每当用户提交表单时,将这个 token 提交到后台进行验证,如果验证通过则可以继续执行操作。这种情况有效的主要原因是网站 B 拿不到网站 A 表单里的 token;

  • Double Cookie Defense

当向服务器发出请求时,生成一个随机值,将这个随机值既放在 cookie 中,也放在请求的参数中,服务器同时验证这两个值是否匹配;

  • Encrypted Token Pattern

对 token 进行加密

  • Custom Header

使用自定义请求头部,这个方式依赖于同源策略。其中最适合的自定义头部便是: “X-Requested-With: XMLHttpRequest”

参考资料

防范CSRF跨站请求伪造