1、CSRF攻击
1.1、什么是CSRF攻击
CSRF即Cross-site request forgery(跨站请求伪造),简单来说,就是攻击者在用户不知情的情况下盗用了你的身份(比如说cookie),以你的名义发送请求,进行一些操作,比如说:发消息、转账等,而对服务器来说这些请求又是合法的,所以说可能会造成个人信息的泄露、财产的损失等。
1.2、CSRF攻击的过程
第一步,用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
第二步,在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
第三步, 用户未退出网站A之前,在同一浏览器中,打开一个新的tab页访问网站B;
第四步, 网站B接收到用户请求后,返回一些攻击性代码,通过这个代码,在用户不知情的情况下携带Cookie信息,向网站A发出请求,比如说这个请求是获取用户信息的。
第五步,网站A根据cookie,会认为是用户C发送的该请求,从而导致该请求被执行,进行给用户C造成个人信息或财产的损失。
原理:
在浏览器中,所有的cookie,可以在任意一个标签页中被访问(没有设置http-only为true的情况下)(不论是否跨域)
1.3、如何防御CSRF攻击
1.验证 HTTP Referer 字段:由于是从其它网站发送的请求,所以可以通过验证请求头的Origin、Referer来验证发送请求的站点。
2.设置http-only:true,禁止cookie被浏览器通过js访问到
3.验证Token:浏览器发送请求时,携带token,因为token存放在sessionStorage中,不会被其它网站所窃取到。
2、XSS攻击
2.1、XSS攻击是什么
XSS即Cross Site Scripting(跨站脚本攻击),攻击者通过各种方式将恶意代码注入到用户的页面中,这样就可以通过脚本进行一些操作。
例如:
在评论区植入JS代码,使得页面被植入广告
2.2、XSS攻击有哪些类型
1.存储型XSS攻击:也叫持久型XSS,主要将恶意代码提交存储在服务器端,当目标用户访问该页面获取数据时,恶意代码会从服务器返回到浏览器做正常的HTML和JS解析执行,这样XSS攻击就发生了。
存储型 XSS 一般出现在网站留言、评论等交互处。
2.反射型XSS攻击:一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当用户点击后,恶意代码会直接在用户的浏览器执行。
反射型XSS通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 。
3.DOM型XSS攻击:指通过恶意脚本修改页面的 DOM 结构,是纯粹发生在客户端的攻击。
DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞。
2.3、如何防御XSS攻击
1.针对存储型XSS攻击,对输入内容的特定字符进行编码
例如对表示 html标记的 < > 等符号进行编码
2.针对反射型XSS攻击,在 cookie中设置 httpOnly:
可以防止客户端通过document.cookie读取 cookie,此 HTTP头由服务端设置。
3.针对反射型XSS攻击,在输出 URL参数之前,要先对URL进行 URLEncode操作
4.开启白名单,阻止白名单以外的资源的加载和运行
5.后端接口也需要对关键字符进行过滤。
3、token为什么就比cookie安全
- cookie是什么
登陆后,后端生成一个sessionid放在cookie中返回给客户端,并且服务端一直记录着这个sessionid,客户端以后每次请求都会自动带上这个sessionid,服务端通过这个sessionid来验证身份之类的操作。所以别人拿到了cookie等于拿到了sessionid,就可以完全替代你。 - token是什么
登陆后,后端会返回一个token给客户端,客户端将这个token存储起来,然后每次客户端请求都需要开发者手动将token放在header中带过去,服务端每次只需要对这个token进行验证就能使用token中的信息来进行下一步操作了。 - 对于xss攻击来说,cookie和token没有什么区别。但是对于csrf来说就有区别
1、对于xss攻击,不管是token还是cookie,都能被拿到,没有什么区别。
2、对于csrf来说就有区别,例子如下:
cookie:在浏览器中,所有的cookie,可以在任意一个标签页中被访问(没有设置http-only为true的情况下)(不论是否跨域)
token:存放在sessionStorage中,仅在浏览器的当前窗口中可以被访问到