前端安全之CSRF

Posted 兴宇的日记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端安全之CSRF相关的知识,希望对你有一定的参考价值。

如果你使用过axios,想必你一定听说过XSRF吧。其实它还有一个名字,叫做CSRF。CSRF的全称是Cross Site Request Forgery,中文名是跨站请求伪造。


提出问题


如果目标网站上不存在XSS漏洞,那还有没有可能冒充用户进行一些操作呢?比如说攻击博客网站,冒充用户发布一篇文章。攻击邮箱网站,转发用户的邮件。攻击社交网站,强制让用户关注你。


攻击方法


不知道你有没有发现,进行这些操作,只需要调用目标网站的api就行了。调用api就是向目标网站发送一个HTTP请求,而这个请求是可以跨域发送的。这种跨站请求网站接口的方法,就是CSRF。


这种攻击方式有几个特点:跨域发送请求、可以没有javascript参与、请求时需要携带用户身份信息。


场景1


比如说,你写了一篇文章,放在网站A上,想让大家都给你点赞。你可以这样做,首先找到点赞的接口是:


http://aaa.com/like?postid=文章ID


于是你把自己的文章ID套进去,把链接发到知名网站B上。网站B上的用户点击这个链接,如果用户同时登录了网站A,那么就会点赞成功。



所以,在访问重要网站的时候不要随便打开或浏览别的网站,访问完之后记得退出登录。



场景2


假设攻击目标已经在网页上登录邮箱,攻击者想要悄悄删除对方的所有邮件,可以这样做。


首先,找出目标网站清空所有邮件的接口,发现是一个如下的POST请求:


http://mail.xxx.com/mails/rm-rf-all




所以,不要随便点开莫名其妙的链接。


关于Cookie


如果你足够细心,你会发现这些操作的前提是发送的请求能够携带用户登录信息,而登录信息往往保存在cookie中。在用ajax发送跨域请求时,默认是不会带有cookie的,那么这种攻击方式发送的请求会带有cookie吗?



另外,就算直接使用ajax发送跨域请求,也有可能成功。虽然JS脚本的执行结果告诉你请求失败,但浏览器的确向服务器发送了请求。这一点在之后讲跨域的时候会详细谈到。


关于防御


要对CSRF进行防御,主要有以下几种方式。


  1. 使用验证码

    验证码是防止CSRF的一个很有效的手段。在提交重要的表单时,增加一个验证码,后台校验验证码不正确,则判定此次请求失败。

    但是,使用验证码会降低用户体验,也不可能每次调用接口都让用户输入一个验证码。

  2. 使用token

    使用token是目前最常用的方式了。每次发送请求之前,服务器生成一个随机字符串(token字符串)发送给浏览器,浏览器请求的时候,把这个字符串一并发送回服务器。服务器如果检测到接收到的token值和之前生成的不一样,则判定本次提交失败。仔细想想,其实这种方式和验证码的方式原理是一样的。

    因为CSRF无法读取数据,只能发送固定的请求,所以不可能知道token。但如果token的生成方式太过简单,还是有可能被猜中的。

    token可能通过两个地方发送:一个是随请求数据发送,例如表单字段;另一个是随请求头发送。使用请求头发送是更安全的方式,因为跨域时是很难发送自定义的请求头的,所以即使token被猜到也影响不大。


声明:本文属于技术文章,仅供学习使用。请勿使用文中的方法进行真实的攻击,否则造成的后果与作者无关。


相关文章



以上是关于前端安全之CSRF的主要内容,如果未能解决你的问题,请参考以下文章

前端安全之同源策略CSRF 和 CORS

前端安全系列之二:如何防止CSRF攻击

前端安全之CSRF

前端安全之XSS和csrf攻击

Web前端安全策略之CSRF的攻击与防御

前端Web前端安全策略之CSRF的攻击与防御