在学HTTP的时候看到这句话,脑子比较笨想了很久才想明白,在这里记录下
咱也不知道对不对,如果有问题欢迎指出
1. 什么是CRSF攻击
就是Cross-site request forgery 跨站请求伪造
简单来说就是你访问了一个奇怪的坏网站,被坏网站诱导向另一个网站攻击
- 看到个很形象的例子,
当你登录一个网站A后,在没有登出的情况下,你又跑到一个其他的论坛上闲逛,然后你看到一个美女的图片,你出于好奇心,点击了美女图片,这个时候,可能就被攻击了;原因是美女图片的的超链接(link)可能是不法分子弄的,指向的可能是A网站,由于你在A网站还是登陆态,那么你点击的这个link就是以你登录态的进行的,比如可以用你的登录态发布评论;严重的可能进行转账。而你却浑然不知
上面例子中图片的HTML代码可以是
<a href="http://www.a.com/addcomments?comment='XX是XX'"><img src='http://xx.com/beauty.jpg'/></a>
2. 为什么Token可以防止CSRF而Cookie不行
2.1 Cookie为什么会造成CSRF
首先说下Cookie为什么可以被坏人拿来进行CSRF
我们都知道,浏览器发送请求时会带上Cookie来向服务端Session发送一些用户偏好等信息,来解决HTTP无状态的缺陷。
有一些请求是form 发起的不受到浏览器同源策略的限制都,比如 POST ,因此可以任意地使用其他域的 Cookie 向其他域发送请求,形成 CSRF 攻击。
2.2 为什么Token不会呢?
这涉及到Token与Cookie的一个区别:
- 请求时,Token由前端【手动】添加
- Cookie由浏览器无脑【自动】添加
比如:
我们在A网站登录后,创建对应的session,浏览器也保存了对应的Cookie,并且没有关闭这个Session;
然后跳到不正经的网站B瞅几眼,不小心点到不正经的图片,马上要被利用进行CRSF攻击了!
这时候Token与Cookie的差别就出现了:
- Cookie会在B网站被浏览器【自动】装进请求头一起发出去,CRSF攻击就达成了
- Token不是浏览器自动装的,需要A网站前端【手动】装进请求,所以在B网站就不会被盗用
因此, Token可以抵抗CSRF攻击。
但是如果把Token放在Cookie里就另说了....
3. Token就一定安全了吗
当然不是,只是说他能防CSRF。
如果用的是HTTP协议,那Token也有被抓包解析重用的风险,当然也有对应的应对方法,这里先不说了
4. 其他应对CSRF的方法
可以参考美团这个文档(我还没看完):