前端安全,常见的攻击类型以及如何防御

文章目录

  • 1、CSRF攻击
        • 1.1、什么是CSRF攻击
        • 1.2、CSRF攻击的过程
        • 1.3、如何防御CSRF攻击
  • 2、XSS攻击
        • 2.1、XSS攻击是什么
        • 2.2、XSS攻击有哪些类型
        • 2.3、XSS攻击可以进行以下操作
        • 2.4、如何防御XSS攻击
  • 3、token为什么就比cookie安全
  • 4、cookie 、token是什么
  • 5、有哪些可能引起前端安全的问题?
  • 6、网络劫持有哪几种,如何防范?
  • 7、浏览器渲染进程的线程有哪些
      • 1、GUI 渲染线程
      • 2、JS 引擎线程(JS 内核)
      • 3、事件触发线程
      • 4、定时器触发线程
      • 5、异步 http 请求线程
  • 8、僵尸进程和孤儿进程是什么?
  • 9、如何实现浏览器内多个标签页之间的通信?
  • 10、浏览器的缓存过程,强缓存、协商缓存过程
  • 11、点击刷新按钮或者按 F5、按 Ctrl+F5 (强制刷新)、地址栏回车有什么区别?

1、CSRF攻击

1.1、什么是CSRF攻击

CSRFCross-site request forgery(跨站请求伪造),简单来说,攻击者诱导用户进入一个第三方网站,然后该网站向被攻击网站发送跨站请求。如果用户在被攻击网站中保存了登录状态,那么攻击者就可以利用这个登录状态,绕过后台的用户验证,冒充用户向服务器执行一些操作。
比如说:发消息、转账等,而对服务器来说这些请求又是合法的,所以说可能会造成个人信息的泄露、财产的损失等。

1.2、CSRF攻击的过程

第一步,用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A

第二步,在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

第三步, 用户未退出网站A之前,在同一浏览器中,打开一个新的tab页访问网站B

第四步, 网站B接收到用户请求后,返回一些攻击性代码,通过这个代码,在用户不知情的情况下携带Cookie信息,向网站A发出请求,比如说这个请求是获取用户信息的。

第五步网站A根据cookie,会认为是用户C发送的该请求,从而导致该请求被执行,进行给用户C造成个人信息或财产的损失。

原理:
在浏览器中,所有的cookie,可以在任意一个标签页中被访问(没有设置http-only为true的情况下)(不论是否跨域)

CSRF 攻击的本质是利用 cookie 会在同源请求中主动携带发送给服务器的特点,以此来实现用户的冒充。

1.3、如何防御CSRF攻击
  1. 服务器进行同源检测,验证 HTTP的 origin、Referer 字段:服务器根据 http 请求头中 origin 或者 referer信息来判断请求是否为允许访问的站点发送的。当origin 或者 referer 信息都不存在的时候,直接阻止请求。
  2. 设置http-only:true,禁止cookie被浏览器通过js访问到
  3. 验证Token:浏览器发送请求时,携带token,因为token存放在sessionStorage中,不会被其它网站所窃取到。

参考链接:https://www.cnblogs.com/lsj-info/p/9479755.html

2、XSS攻击

2.1、XSS攻击是什么

XSS即Cross Site Scripting跨站脚本攻击),攻击者通过各种方式将恶意代码注入到用户的页面中,这样就可以通过脚本进行一些操作

例如:

  • 在评论区植入JS代码,使得页面被植入广告
2.2、XSS攻击有哪些类型
  1. 存储型XSS攻击:也叫持久型XSS,主要将恶意代码提交存储在服务器端,当目标用户访问该页面获取数据时,恶意代码会从服务器返回到浏览器做正常的HTML和JS解析执行,这样XSS攻击就发生了。

    存储型 XSS 一般出现在网站留言、评论等交互处。

攻击步骤:
1.攻击者将恶意代码提交到⽬标⽹站的数据库中。
2.⽤户打开⽬标⽹站时,⽹站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
3.⽤户浏览器接收到响应后解析执⾏,混在其中的恶意代码也被执⾏。
4.恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏为,调⽤⽬标⽹站接⼝执⾏攻击者指定的操作。
这种攻击常⻅于带有⽤户保存数据的⽹站功能,如论坛发帖、商品评论、⽤户私信等。

  1. 反射型XSS攻击:一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当用户点击后,恶意代码会直接在用户的浏览器执行。

    反射型XSS通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 。

攻击步骤:
1.攻击者构造出特殊的 URL,其中包含恶意代码。
2.⽤户打开带有恶意代码的 URL 时,⽹站服务端将恶意代码从 URL中取出,拼接在 HTML 中返回给浏览器。
3.⽤户浏览器接收到响应后解析执⾏,混在其中的恶意代码也被执⾏。
4.恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏为,调⽤⽬标⽹站接⼝执⾏攻击者指定的操作

反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库⾥,反射型 XSS 的恶意代码存在 URL ⾥。

  1. DOM型XSS攻击:指通过恶意脚本修改页面的 DOM 结构,是纯粹发生在客户端的攻击。
    DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞。⽽其他两种 XSS 都属于服务端的安全漏洞。

攻击步骤:
1.攻击者构造出特殊的 URL,其中包含恶意代码。
2.⽤户打开带有恶意代码的 URL 时
3.⽤户浏览器接收到响应后解析执⾏,前端 JavaScript 取出 URL中的恶意代码并执⾏。
4.恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏为,调⽤⽬标⽹站接⼝执⾏攻击者指定的操作。

2.3、XSS攻击可以进行以下操作
  • 获取页面的数据,如 DOM、cookie、localStorage;
  • 破坏页面结构;
  • DOS 攻击,发送合理请求,占用服务器资源,从而使用户无法访问服务器;
  • 流量劫持(将链接指向某网站)
2.4、如何防御XSS攻击
  1. 针对存储型XSS攻击,对需要插入到HTML 中的代码做好充分的转义
    例如对表示 html标记的 < > 等符号进行编码
  2. 针对反射型XSS攻击,在 cookie中设置 http-only,防止客户端通过脚本(document.cookie)读取 cookie
  3. 针对反射型XSS攻击,在输出 URL参数之前,要先对URL进行 URLEncode操作
  4. 开启白名单,阻止白名单以外的资源的加载和运行,主要有两种方式:
    • 一种是在HTTP 的header中设置Content-Security-Policy
    • 一种是设置 meta 标签的方式
  5. 后端接口也需要对关键字符进行过滤。

3、token为什么就比cookie安全

不论是cookie,还是token,都是提供给服务端进行用户身份的认证的。

  • 发送请求时,是否会自动携带
    • 在同源请求中,浏览器会自动携带cookie,
    • 而token则需要开发者手动放入到header中
  • 是否可以在其它窗口中被访问到
    • cookie,在没有设置http-only为true的情况下,可以在任意一个标签页中被访问(不论是否跨域)
    • token,存放在sessionStorage中,仅在浏览器的当前窗口中可以被访问到

4、cookie 、token是什么

  • 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中,仅在浏览器的当前窗口中可以被访问到

5、有哪些可能引起前端安全的问题?

  • 跨站脚本 (XSS)
    ⼀种代码注⼊⽅式, 为了与 CSS 区分所以被称作 XSS。由于⽹站没有对⽤户的输⼊进⾏严格的限制, 使得攻击者可以将脚本上传到服务端,再让其他⼈浏览到有恶意脚本的⻚⾯。
  • 跨站点请求伪造(CSRF)
    攻击者诱导用户进入一个第三方网站,然后该网站向被攻击网站发送跨站请求。如果用户在被攻击网站中保存了登录状态,那么攻击者就可以利用这个登录状态,绕过后台的用户验证,冒充用户向服务器执行一些操作。
  • iframe 的滥⽤
    iframe 中的内容是由第三⽅来提供的,页面不受控制,他们可以在 iframe 中运JavaScirpt 脚本、Flash插件、弹出对话框等等,这可能会破坏前端⽤户体验;
  • 恶意第三⽅库
    ⽆论是后端还是前端应⽤开发,绝⼤多数时候都是在借助开发框架和各种类库进⾏快速开发,⼀旦第三⽅库被植⼊恶意代码很容易引起安全问题。

6、网络劫持有哪几种,如何防范?

  • DNS 劫持 (输⼊京东被强制跳转到淘宝这就属于 DNS 劫持)
    由于涉嫌违法,已经被监管起来,现在很少会有 DNS劫持
  • HTTP 劫持: (访问⾕歌但是⼀直有贪玩蓝⽉的⼴告),由于 http明⽂传输,运营商会修改你的 http 响应内容(即加⼴告)
    http 劫持依然⾮常盛⾏,最有效的办法就是全站 HTTPS,将HTTP 加密,这使得运营商⽆法获取明⽂,就⽆法劫持你的响应内容。

7、浏览器渲染进程的线程有哪些

浏览器的渲染进程的线程总共有五种:
前端安全,常见的攻击类型以及如何防御_第1张图片

1、GUI 渲染线程

负责渲染浏览器页面,解析 HTML、CSS,构建 DOM 树、渲染树、绘制页面;
当界面重绘、回流时,该线程就会执行。

注意:GUI 渲染线程和 JS 引擎线程是互斥的,当 JS 引擎执行时 GUI 线程会被挂起,GUI 更新会被保存在一个队列中等到 JS 引擎空闲时立即被执行。

2、JS 引擎线程(JS 内核)

JS 引擎线程也称为 JS 内核,负责处理 Javascript 脚本程序,运行代码;
JS 引擎线程一直等待着任务队列中任务的到来,然后加以处理,一个标签页(一个页面)中无论什么时候都只有一个JS 引擎线程在运行JS程序

注意:GUI 渲染线程与 JS 引擎线程的互斥关系,所以如果 JS 执行的时间过长,会造成页面的渲染不连贯,导致页面渲染卡顿阻塞。

3、事件触发线程

事件触发线程属于浏览器而不是 JS 引擎,用来控制事件循环

当 JS 引擎执行代码块如 setTimeOut 时(也可能是:鼠标点击、AJAX 异步请求等),会将对应任务添加到事件触发线程中

当对应的事件符合触发条件被触发时,该线程会把事件添加到任务队列中,等待 JS 引擎的处理;

注意:由于 JS 的单线程关系,所以这些待处理队列中的事件都得排队等待 JS 引擎处理(当 JS 引擎空闲时才会去执行)

4、定时器触发线程

定时器触发进程即 setInterval 与 setTimeout 所在线程;

通过定时器触发线程来计时,并触发定时器,计时完毕后,添加到任务队列中,等待 JS 引擎空闲后执行;

所以定时器中的任务在设定的时间点不一定能够准时执行,它只是在指定时间点将任务添加到事件队列中;

注意:根据W3C 标准的规定,定时器的定时时间不能小于 4ms,如果是小于 4ms,则默认为 4ms

5、异步 http 请求线程

异步请求建立连接后,即浏览器新开一个线程请求

检测到连接状态变更时,如果设置有回调函数,将回调函数放入事件队列中,等待 JS 引擎空闲后执行

8、僵尸进程和孤儿进程是什么?

  • 僵尸进程:
    子进程结束了,而父进程又没有释放子进程占用的资源,这种进程称之为僵尸进程。
  • 孤儿进程:
    父进程退出了,而它的一个或多个子进程还在运行,那这些子进程都会成为孤儿进程。

9、如何实现浏览器内多个标签页之间的通信?

  • 1、使用websocket,由服务端作转发
    通过websocket ,由服务器做这个中介者。标签页通过向服务器发送数据,然后由服务器向其他标签页推送转发。

  • 2、使用localStorage ,通过监听事件来获取数据
    使用localStorage 的方式,我们可以在一个标签页对 localStorage的变化事件进行监听,然后当另一个标签页修改数据的时候,我们就可以通过这个监听事件来获取到数据。

    这个时候 localStorage 对象就是充当的中介者的角色。

  • 3、iframe中通过使用 postMessage 方法通信
    使用 postMessage 方法,如果我们能够获得对应标签页的引用,就可以使用 postMessage 方法,进行通信。

  • 4、使用 ShareWorker,由共享线程作转发
    使用 ShareWorker 的方式,shareWorker 会在页面存在的生命周期内创建一个唯一的线程,并且开启多个页面也只会使用同一个线程

    这个时候共享线程就可以充当中介者的角色。标签页间通过共享一个线程,来实现数据的交换。

10、浏览器的缓存过程,强缓存、协商缓存过程

参考地址:https://blog.csdn.net/yiyueqinghui/article/details/109166703

11、点击刷新按钮或者按 F5、按 Ctrl+F5 (强制刷新)、地址栏回车有什么区别?

  • 点击刷新按钮或者按 F5
    浏览器直接认为本地的缓存文件过期,但是请求时会带上 If-Modifed-Since,If-None-Match,这就意味着服务器会对文件检查新鲜度,返回结果可能是 304,也有可能是 200。
  • 用户按 Ctrl+F5(强制刷新)
    浏览器不仅会对本地文件过期,而且不会带上 If-Modifed-Since,If-None-Match,相当于之前从来没有请求过,返回结果是 200
  • 地址栏回车
    浏览器发起请求,按照正常流程,本地检查是否过期,然后服务器检查新鲜度,最后返回内容

1

参考链接:http://www.atguigu.com/mst/html/gp/17649.html
参考链接:https://zhuanlan.zhihu.com/p/98938342

你可能感兴趣的:(javascript,前端安全)