惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
S
Secure Thoughts
月光博客
月光博客
美团技术团队
雷峰网
雷峰网
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
News and Events Feed by Topic
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Forbes - Security
Forbes - Security
W
WeLiveSecurity
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿
G
GRAHAM CLULEY
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
AI
AI
Last Week in AI
Last Week in AI
Google Online Security Blog
Google Online Security Blog
Schneier on Security
Schneier on Security
云风的 BLOG
云风的 BLOG
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Recent Announcements
Recent Announcements
Webroot Blog
Webroot Blog
T
Tor Project blog
Cisco Talos Blog
Cisco Talos Blog
N
News and Events Feed by Topic
罗磊的独立博客
The Register - Security
The Register - Security
Blog — PlanetScale
Blog — PlanetScale
T
Threat Research - Cisco Blogs
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
T
The Exploit Database - CXSecurity.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com
B
Blog
腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Engineering at Meta
Engineering at Meta
Latest news
Latest news
IT之家
IT之家
D
DataBreaches.Net
博客园 - 司徒正美
N
Netflix TechBlog - Medium
V
V2EX
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

静水深流's blog

探索 SSE:服务器推送技术的魅力与应用 | 静水深流 图解DIFF算法介绍 | 静水深流 如何使用javascript实现复制出的文案带链接? | 静水深流 基于vuepress2搭建专属自己的博客,并集成各种常用功能 | 静水深流 听说你至今不晓得缓存淘汰算法?实现LRU、LFU和FIFO? | 静水深流 最长递增子序列及vue3.0中diff算法 | 静水深流 二进制之入门到应用实践 | 静水深流 常见算法学习 | 静水深流 CSS 形状的实现 | 静水深流 ajax取消接口请求 | 静水深流 前端常见的安全问题 | 静水深流 前端面试题总结 | 静水深流 javascript原生代码实现及代码总结 | 静水深流 LeetCode算法学习总结-简单 | 静水深流 LeetCode算法学习总结-困难 | 静水深流 LeetCode算法学习总结- 中等 | 静水深流 排序算法总结 | 静水深流 扫码登录的实现原理 | 静水深流 Javascript之常见类型判断汇总 | 静水深流 JavaScript各种继承方式和优缺点 | 静水深流 webpack开发、使用及优化总结 | 静水深流 从JavaScript中的拷贝开始思考 | 静水深流 vue原理、使用及面试方面的总结 | 静水深流 前端发展及选择 | 静水深流 css面试总结 | 静水深流 JavaScript 数组展开(扁平化)和underscore的 flatten | 静水深流 首页 | 静水深流 学习网站收藏 | 静水深流 文章列表 | 静水深流
关于http服务端的学习&总结 | 静水深流
shaolibao · 2022-03-21 · via 静水深流's blog

async和defer的区别

区别

  1. defer(延迟执行)属性却一定会按它们在页面上的顺序依次执行。载入 JavaScript 文件时不阻塞 HTML 的解析,执行阶段被放到 HTML 标签解析完成之后
  2. async(异步下载)属性的Script会在下载完成后即可执行,在 DOMContentLoaded 触发之前或之后执行,但一定在 load 触发之前执行

Prefetch和Preload和preconnet的区别

  • Preload:告诉浏览器预先请求当前页需要的资源,从而提高这些资源的请求优先级
    对于跨域资源需要加上crossorigin,否则会出现加载两次的问题
    <link rel="preload" href="/path/to/style.css" as="style">
    
  • preconnet 先建立一个链接(包括:DNS查找,TCP三次握手和TLS协商)减少真正连接是的消耗
    <link rel="preconnect" href="//test.com">
    <link rel="preconnect" href="//cdn.test.com" crossorigin>
    
  • Prefetch:告诉浏览器用户将来可能在其他页面(非本页面)可能使用到的资源,那么浏览器会在空闲时,就去预先加载这些资源放在http缓存内,还会解执行页面,进行预渲染,最常见的dns-prefetch
    <link rel="dns-prefetch" href="//test.com">
    <link rel="prerender" href="//example.com/next-page.html">
    

http状态码及分类

  • 1xx:初始化(http2.0已经么有1xx了{websocket例外}
  • 2xx:客户端成功(200:**成功;202:接受;204:没有返回信息,页面不需要更改)
  • 3xx:重定向缓存(301:永久重定向;302临时转移; (303:永久重定向;)307:**临时重定向;304:缓存)
  • 4xx:客户端失败(400:参数错误;401:未认证登陆,无权限访问;403:服务器已经得到请求,但禁止访问;404:未找到;417:发送资源过大)
  • 5xx:服务器端失败(500:**服务器内部错误;503:连接数过多,服务器超负载;504:网关超时)

从浏览器地址栏输入url到显示页面的步骤

超详细讲解open in new window参考2open in new window参考3open in new window参考4open in new window

  1. 对url进行解析,确定web服务器及文件路径,然后根据这些信息生成http请求
  2. 浏览器网络进程查看是否有本地缓存,并且缓存是否新鲜
  3. DNS 查询
    • 去浏览器端拿dns缓存,操作系统自身的DNS缓存,去hosts文件中拿该域名对应的IP地址,去路由器中拿映射,如果还没有就去dns服务器拿ip(域名解析的过程)。
    • 拿到ip就去服务器拿资源,服务器中如果有重定向,那就去重定向的网址再次重复前面的步骤。
  4. 客户端发送数据前会先进行TCP连接(三次握手)三次的目的:为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误,所以服务器需要确认客户端是否收到了第二次握手;防止服务器等待造成资源浪费
    • 第一次由客户端发起,告诉浏览器即将发送请求
    • 第二次请求由服务端发起,告诉浏览器准备好接受数据,请发送数据
    • 第三次由客户端发起,告诉浏览器这就发送数据
      握手
  5. 发送http请求,服务器处理完成后返回数据,浏览器接收文件(HTML、JS、CSS、图象等);
  6. 拿到html文件后解析解析加载资源,html里面的东西从上到下依次解析,生成dom树状数据结构。
  7. 遇到css就添加为树状结构添加css属性,遇到js就执行JavaScript代码。
  8. 断开链接,进行四次TCP回收;四次的目的是:服务队没收到关闭请求可能还有需要处理的没法立马关闭,所以只能先发送ack报文进行确定,等处理完了再发送FIN进行关闭
    • 第一次由浏览器发起的,告诉服务端请求报文发送完了,可以关闭
    • 第二次由服务器发起的,告诉浏览器,请求报文接受完了,并表示同意关闭请求
    • 第三次由服务器发起的,告诉浏览器,响应报文发送完了,你准备关闭吧
    • 第四次由浏览器发起的,告诉服务器,我响应报文接受完了,你直接关闭吧
      挥手

cdn原理

  • 用户在浏览器中输入要访问的域名;
  • 向本地DNS服务器请求对该域名的解析
  • 浏览器向域名解析服务器发出解析请求,由于CDN 对域名解析过程进行了调整,所以用户端一般得到的是该域名对应的 CNAME 记录,此时浏览器需要再次对获得的 CNAME 域名进行解析才能得到缓存服务器实际的IP 地址。 注:在此过程中,全局负载均衡DNS 解析服务器会根据用户端的源IP 地址,如地理位置(北京还是上海)、接入网类型(电信还是网通)将用户的访问请求定位到离用户路由最短、位置最近、负载最轻的Cache 节点(缓存服务器)上,实现就近定位。定位优先原则可按位置、可按路由、也可按负载等。
  • 再次解析后浏览器得到该域名CDN 缓存服务器的实际IP 地址,向缓存服务器发出访问请求;
  • 缓存服务器根据浏览器提供的域名,通过Cache 内部专用DNS 解析得到此域名源服务器的真实IP 地址,再由缓存服务器向此真实IP 地址提交访问请求;
  • 缓存服务器从真实IP 地址得到内容后,一方面在本地进行保存,以备以后使用,同时把得到的数据发送到客户端浏览器,完成访问的响应过程;
  • 用户端得到由缓存服务器传回的数据后显示出来,至此完成整个域名访问过程。
    参考open in new window

跨域方式

  1. JSONP(代码实现
  2. CORS(通过更改Access-Control-Allow-Origin)
  3. document.domain + iframe
  4. location.hash
  5. window.name + iframe
  6. postMessage
  7. nginx代理跨
  8. WebSocket
    参考1open in new window参考2open in new window

为什么form表单提交没有跨域问题,但ajax提交有跨域问题

  • ajax跨域是浏览器处于对用户安全和隐私的一种保护措施,可以防止其它网站拿到用户的cookie,🔔:ajax提交跨域请求时候, 请求一样会发到服务器, 只是服务器的响应被浏览器拦截
  • form表单提交后会刷新页面不会将结果返回给js所以相对安全;同时form也没发主动携带cookie

浏览器缓存技术

浏览器中缓存可分为强缓存协商缓存,第一次浏览器请求资源时会,将资源连同response header一起缓存下来,再次去请求资源时,首先从缓存中拿出资源的response header,判断是否命中强缓存,如果命中则直接从缓存中读取资源,不会发送请求到服务器,如果没有命中,则发送请求到服务器判断是否命中协商缓存,如果命中则将请求返回,但是不会返回这个资源的数据,而是告诉浏览器从缓存中加载资源;区别: 强缓存不会发送请求到服务器

  • 强缓存: 利用Expires或者Cache-Control这两个http response header实现
    • Expires:表示资源过期时间的header,是一个服务器返回的绝对时间,但是当服务器时间与客户端时间相差较大时,缓存管理容易出现问题
    • Cache-Control:是一个相对时间,用数值表示,以秒为单位;如:Cache-Control:max-age=311230000;还可以为 Cache-Control 指定 public(允许所有服务器缓存该资源)或 private(禁止中间服务器如代理服务器缓存资源) 标记
    • 当两种缓存同时启动是Cache-Control优先级高于Expires
  • 协商缓存: 利用的是Last-Modified,If-Modified-SinceETag、If-None-Match这两对Header来管理的,命中协商缓存是返回状态码304 Not Modified

http介绍

HTTP:超文本传输协议;是网络协议一个标准;特性:无状态,默认端口是80

http 各版本协议区别

  • 1.0 协议缺陷:
    • 无法复用链接,完成即断开,重新慢启动和 TCP 3次握手
    • head of line blocking: 线头阻塞,导致请求之间互相影响
  • 1.1 改进
    • 长连接(默认 keep-alive),复用
    • 新增功能:断点续传身份认证状态管理cache 缓存
  • 2.0优化
    • 多路复用,就是在一个 TCP 连接中可以存在多条流。换句话说,也就是可以发送多个请求,它解决了http1.X的每次请求都需要建立http连接;http1.X开启了"keep-alive"也会有串行文本传输最多连接数限制有问题;
    • http2采用二进制格式进行传输比http1.X的文本传输更高效;
    • header压缩;解决了http1.X无状态特性--带来的巨大HTTP头部
    • 服务端推送 参考open in new window

https如何保证密钥传输的安全性\TLS握手过程?

  • 客户端像服务器端发送客户端生成的随机数random1以及支持的加密方式
  • 服务端接收到客户端发起的请求,会将网站信息(企业、网站等各种信息和公钥)+一串生成的随机数加密后,通过第三方机构的私钥再次加密,生成数字签名
  • 客户端通过第三方机构的公钥进行解密(本地已内置)并验证;然后得到服务器的公钥,随后客户端生成新的随机数(random3),利用解密的公钥加密后传输给服务器
  • 服务器用自己的私钥解密这个信息得到第三个随机数
  • 至此双方通过约定的加密方式,使用前面生成的三个随机数(random1+random2+random3) 生成对话密钥 用来加密接下来的对话内容 参考1open in new window参考2open in new window

HTTPS如何保证证书的可信任和安全?

https为什么比http更安全?

简单来说,https是http的安全版,是在http基础上加上了SSL加密层(由SSL和TCP进行通信),并对传输数据进行加密;是非对称加密与对称加密双剑合璧,使用非对称加密算法传递用于对称加密算法的密钥,然后使用对称加密算法进行信息传递

HTTP 与 HTTPS 的区别

  • HTTP 是明文传输,HTTPS 通过 SSL\TLS 进行了加密所以更安全
  • HTTP 的端口号是 80,HTTPS 是 443
  • HTTPS 需要到 CA 申请证书,一般免费证书很少,需要交费
  • HTTP 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。

http2.0与WebSocket的关系是怎么样的?

WebSocket是基于HTTP1.1的协议,可以简单理解为创建了一条TCP连接;而HTTP2.0则是对HTML、CSS等JS资源的传输方式进行了优化

TCP协议和UDP协议的区别

TCP:是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 一个TCP连接必须要经过三次“对话”才能建立起来
UDP:是一个非连接的协议,传输数据之前源端和终端不建立连接, 当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。 在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、 计算机的能力和传输带宽的限制; 在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段

1、基于连接与无连接;
2、对系统资源的要求(TCP较多,UDP少);
3、UDP程序结构较简单;
4、流模式与数据报模式 ;
5、TCP保证数据正确性,UDP可能丢包(基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输);
6、TCP保证数据顺序,UDP不保证。
应用场景: TCP适用于文本传输,收发邮件等 UDP适用于即时通信、在线视频、网络电话等,也适用于服务系统内部数据传输,因为内部数据交互丢包率低,及时丢包最多也就是操作无效

TCP&UDP区别

XSS和CSRF攻击

XSS:跨站脚本攻击,是一种代码注入攻击,攻击者通过在目标网站上注入恶意脚本,使之在用户浏览器上运行;根据攻击来源,分为存储型,反射型,DOM型

  • 存储型是将恶意代码提交到目标网站的数据库中,例如:发帖、评论、私信等;这种方式更隐蔽,因为不需要用户手动触发
  • 反射型是通过构造特殊的URL,并将其拼接到html中,其中包含恶意代码,如网站搜索、跳转等;因为需要用户打开URL才有效,所以一半都用多种手段诱导用户点击
  • DOM型同样是通过特殊URL,前端通过JavaScript取出恶意代码并执行,恶意代码会获取用户数据并发送到指定网站或冒充用户行为
    DOM型是取出恶意代码并交由浏览器完成,属于前端JavaScript的安全漏洞,其它两种属于服务器端漏洞 通用XSS攻击防御:
    • 禁止加载外域代码
    • 禁止外域提交
    • 禁止未授权的脚本执行
    • 对于不受信任的输入,限制合理的长度,可以增加攻击的难度
    • 设置http-only禁止js读取敏感cookie
    • 输入过滤
    • 纯前端,通过ajax获取并渲染数据

CSRF跨站点请求伪造,是攻击者盗用了用户的身份,以用户的名义发送恶意请求是一种挟制用户在当前已登录的 Web 应用程序上执行非本意的操作的攻击方法;如诱导用户进入第三方网站并在第三方网站向用户发送跨站请求;利用用户的注册凭证,绕过后台用户验证;

  • GET类型攻击;如<img src="http://bank.example/withdraw?amount=10000&for=hacker" > JSONP
  • POST类型攻击:如自动提交表单
  • 连接类的攻击:如诱导用户点击a连接
    通用CRSRF攻击防御:
  • 可以设置Get 请求不对数据进行修改和存储
  • 不让第三方网站访问到用户 Cookie,或者不讲用户验证的token或sesstion放在cookie,而是放在localStorage
  • 请求时附带验证信息,比如验证码
  • post表单请求,可在每个表单中包含一个 CSRF Token 或者通过将token放在cookie中
  // 方法一
  <form method="POST" action="/upload?_csrf={{由服务端生成}}" enctype="multipart/form-data">
    用户名: <input name="name" />
    选择头像: <input name="file" type="file" />
    <button type="submit">提交</button>
  </form>
  // 方法二 axios也是这么防御的
  let csrfToken = Cookies.get('csrfToken');

  function csrfSafeMethod(method) {
    // 以下HTTP方法不需要进行CSRF防护
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
  }

  $.ajaxSetup({
    beforeSend: function(xhr, settings) {
      if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
        xhr.setRequestHeader('x-csrf-token', csrfToken);
      }
    },
  });
  • 使用Referer Header确定来源域名

界面操作劫持攻击 通过在页面可见控件上覆盖一个不可见的框(iframe),使得用户误以为自己在操作正确的页面,从而在用户不知情的情况下篡改数据、窃取信息等。
参考1open in new window参考2open in new window

中间人(MITM)攻击

MITM攻击就是通过拦截正常的网络通信数据,并进行数据篡改和嗅探来达到攻击的目的,而通信的双方却毫不知情。
防御:

  • 确保访问的是https的网站
  • 不应在公共WI-FI上发送敏感数据
  • 禁用了不安全的SSL/TLS协议
  • 不要点击恶意链接或电子邮件

为什么埋点发送数据一般用1*1的GIF图片

  • 能够完成整个 HTTP 请求+响应(尽管不需要响应内容)
  • 客户端不需要接受返回数据,服务器也不需要返回数据
  • 没有跨域问题
  • 执行过程无阻塞,不影响用户操作
  • 相比 XMLHttpRequest 对象发送 GET 请求,性能上更好
  • GIF相对于其它格式的图片体积最小

GET&POST区别

区别

为什么会有options请求

options是浏览器基于跨域安全的考虑发起的预检请求;浏览器将CORS请求分为两类:简单请求(simple request)非简单请求(not-simple-request);而只有在非简单请求的情况下才会发起预检;非简单请求的条件:

  • 请求方式不是是:GET、POST、HEAD
  • 请求设置了自定义的 header 字段
  • Content-Type 并非 application/x-www-form-urlencoded, multipart/form-data, 或 text/plain