前端安全之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进行防御,主要有以下几种方式。
使用验证码
验证码是防止CSRF的一个很有效的手段。在提交重要的表单时,增加一个验证码,后台校验验证码不正确,则判定此次请求失败。
但是,使用验证码会降低用户体验,也不可能每次调用接口都让用户输入一个验证码。使用token
使用token是目前最常用的方式了。每次发送请求之前,服务器生成一个随机字符串(token字符串)发送给浏览器,浏览器请求的时候,把这个字符串一并发送回服务器。服务器如果检测到接收到的token值和之前生成的不一样,则判定本次提交失败。仔细想想,其实这种方式和验证码的方式原理是一样的。
因为CSRF无法读取数据,只能发送固定的请求,所以不可能知道token。但如果token的生成方式太过简单,还是有可能被猜中的。
token可能通过两个地方发送:一个是随请求数据发送,例如表单字段;另一个是随请求头发送。使用请求头发送是更安全的方式,因为跨域时是很难发送自定义的请求头的,所以即使token被猜到也影响不大。
声明:本文属于技术文章,仅供学习使用。请勿使用文中的方法进行真实的攻击,否则造成的后果与作者无关。
相关文章
以上是关于前端安全之CSRF的主要内容,如果未能解决你的问题,请参考以下文章