本文共 3030 字,大约阅读时间需要 10 分钟。
接着上一篇文章,本篇文章我们继续来讲解前端如何处理网站的安全问题,本文主要讲解跨站请求伪造(CSRF)
。
没看过之前的文章的小伙伴,可以先看一下,这里放一个链接——
- 公众号:前端印象
- 不定时有送书活动,记得关注~
- 关注后回复对应文字领取:【面试题】、【前端必看电子书】、【数据结构与算法完整代码】、【前端技术交流群】
跨站请求伪造,英文全称为Cross Site Request Forgery , 缩写CSRF,这种攻击模式用通俗易懂的话来讲就是:攻击者借用你的用户身份,来完成一些需要依靠用户信息来完成的事情,例如转账 、发送邮件……
我们来以转账为例,假设下面是一个转账支付页面:
这一段转账的流程很重要,一定要看懂:
target_user
和 money
两个参数发送给服务器。我们了解完正常的转账流程,我们再来看看攻击者是如何进行跨站域请求伪造的:
<!--该网页网址为: http://www.blackPerson.com/transfer --><!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><form action="/payfor" method="post"> <input type="text" id="target_user" value="blackPerson"> <input type="number" id="money" value="1000"></form><script src="https://code.jquery.com/jquery-3.5.1.min.js"></script><script> $(function() { //加载该页面,延迟一秒钟,自动提交设置好的表单 setTimeout(function() { $('form').submit() }, 1000) }) </script></body></html>
iframe
标签,并且该标签设置为不可见,让别的用户无法察觉,该标签里面加载的是步骤1中设置的网页,代码如下:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body> <!-- 此处省略无数诱人的图片!!!!!!!!!!! --><!-- 这里iframe加载了攻击者自己的自动提交表单页面,并且该 标签宽高都设置为0,就是为了不让别的用户察觉 --><iframe src="http://www.blackPerson.com/transfer" width="0" height="0"></iframe></body></html>
target_user=blackPerson&money=1000
,该表单请求正常发送给服务器。防御跨站请求伪造的方式一共有三种:
该方法好处就是可以防御跨站请求伪造,因为攻击者设计的自动表单提交无法自动判断验证码是多少;坏处就是用户体验感会差,因为每次提交转账都要输入验证码。
这里推荐一个 node.js 的一个自动生成验证码的库svg-captcha,具体使用方式可以自己去github上查看,使用十分简单,下面放上一个链接——
什么是referer呢? referer表示该请求来自哪个网页
那么,我们用户正常转账,发送请求时, referer 肯定就是那个转账网页的网址了; 那么如果是攻击者制造的自动提交表单发送的请求, referer 肯定就是攻击者自己的网页。 所以我们可以在服务端写一个判断,即如果 referer 不是正常的转账网页,那么就不完成转账操作, 这样就可以防御住跨站请求伪造。
但是,这种防御方式还是不太可靠,因为我们知道像请求头, 随随便便就可以伪造一个, 所以很容易就能攻破这个防御,接下来我们来将一个很可靠的,并且被广泛运用的防御方式。
我们都知道CSRF攻击是因为攻击者可以借助别的用户来伪造一次请求,那我们想要防御他,只需要在请求时发送一个攻击者无法伪造的参数就可以了,这就是我们要说的token,接下来我们来说说他是怎么实现的。
不知道大家还记得我上面给大家举的攻击者借助用户的 cookie 并用自己设定好的请求参数伪造了一次转账请求吗? 其实原理很简单, cookie 由用户提供, 攻击者只需要将提交表单中的参数全部写好即可通过全部的转账信息验证。那么我们就可以在这个表单提交中, 添加一个无法让攻击者轻易获得的参数,这个参数是在用户登录时,由服务器发送过来存放在浏览器中的, 表单提交时将这个参数也一起提交过去,然后在服务端进行验证这个参数信息是否正确, 就可以做到一定程度上防御CSRF。
这三种方式都有各自的优点和缺点, 我们需要自己在安全方面与用户体验方面进行权衡来考虑使用哪种方法或者使用多种方法进行防御(例如既判断referer,又判断token信息)。
好了, CSRF的讲解就到这里,希望可以帮助到大家了解安全的一些安全知识。
转载地址:http://xnpwz.baihongyu.com/