1.http和https的区别
1)概念
http适用于分布式,协作式和超媒体信息系统的应用层协议,是发布和接收HTML页面的方法,用在web浏览器和网站服务器之前传递信息,默认工作在TCP协议80端口,明文发送内容,不提供加密,不够安全,https是透过计算机网络进行安全通信的传输协议,用http通信,但用ssl/tls加密数据包,提供对网站服务器的神人真正,保护交换数据的隐私和完整,默认工作在TCP443端口
2)具体区别
HTTPA需要CA申请证书,需要一定费用(CA机构发行数字证书,包含机构,加密算法,Hash算法,公钥,证书到期时间),HTTP响应速度快,TCP三次握手建立连接,交换3个包,HTTPS还需要SSL握手的9个包,更耗费服务器资源
3)HTTPS工作流程
TCP三次握手-》客户端验证服务器数字证书(通过TLS完成)-》DH算法协商对称加密算法的密钥,hash的密钥-》SSL安全加密隧道协商完成-》网页加密传输,用协商的对称加密算法和密钥保证机密性,用协商的hash算法保证数据完整性
4)SSL/TLS协议加密过程
RSA握手
1.浏览器向服务器发送随机数 client_random,TLS 版本和供筛选的加密套件列表。
2.服务器接收到,立即返回 server_random,确认好双方都支持的加密套件 以及数字证书 (证书中附带公钥 Public key certificate)。
3.浏览器接收,先验证数字证书。若通过,接着使用加密套件的密钥协商算法 RSA 算法生成另一个随机数 pre_random,并且用证书里的公钥加密,传给服务器。
4.服务器用私钥解密这个被加密后的 pre_random,参考 “非对称加密”。
RSA/DH握手区别
1.浏览器向服务器发送随机数 client_random,TLS 版本和供筛选的加密套件列表。
// RSA
-2.服务器接收到,立即返回 server_random,确认好双方都支持的加密套件 -以及数字证书 (证书中附带公钥)。
// DH
+2.服务器接收到,立即返回 server_random,确认好双方都支持的加密套件
+以及数字证书 (证书中附带公钥)。
+同时服务器利用私钥将 client_random,server_random,server_params 签名,
+生成服务器签名。然后将签名和 server_params 也发送给客户端。
+这里的 server_params 为 DH 算法所需参数。
// RSA
-3.浏览器接收,先验证数字证书。
-若通过,接着使用加密套件的密钥协商算法 RSA 算法
-生成另一个随机数 pre_random,并且用证书里的公钥加密,传给服务器。
// DH
+3.浏览器接收,先验证数字证书和 _签名_。
+若通过,将 client_params 传递给服务器。
+这里的 client_params 为 DH 算法所需参数。
//RSA
-4.服务器用私钥解密这个被加密后的 pre_random,参考 “非对称加密”。
//DH
+4.现在客户端和服务器都有 client_params、server_params 两个参数,
+因 ECDHE 计算基于 “椭圆曲线离散对数”,通过这两个 DH 参数就能计算出 pre_random。
TLS1.3握手
CA发数字证书给服务端颁发数字证书-》客户端给出SSL/TLS协议版本号+随机数+支持的加密方法+浏览器参数-》服务端返回确认的加密方法+服务器参数+TLS版本+数字证书+新随机数-》客户端确认数字证书和签名-》双方都有服务器参数+浏览器参数,根据ECDHE计算出新的随机数-》完成握手(只需一次往返,TLS1.2即SH需要2次)
5)TLS握手过程
2.websocket和http的区别
http通信只能由客户端发起,不能服务器主动向客户端推送信息,websocket让服务端可以主动向客户端推送信息。
3.http各版本区别
1)http0.9
只支持get,服务器只回应HTML格式字符串,
2)1.0
支持post,head,每次通信都包含头信息,新增状态码,缓存cache,每次TCP连接只发送一个请求,响应后就关闭连接,所以用非标准的connection:keep-alive,不支持keep-alive。
3)1.1
引入持久连接,TCP默认不关闭,可以被多个请求复用,最后一个请求发送connection:close,要求关闭tcp连接。加入管道机制,将多条请求放入队列,允许多个请求同时并行发送,高延时网络环境可以降低网络的环回时间,但是响应必须串行返回,后一个响应在前一个响应之后,容易造成队头阻塞(前一个相应未及时返回,意外中断时需要把未收到响应的请求重发)。新增content-length声明回应的数据长度用来区分数据包属于哪一个回应,采用流模式取代缓存模式,新增put,patch等请求方式,请求头增加host指定服务器域名,支持文件断点续传。
4)2.0
是彻底的二进制协议,统称头信息和数据体为帧,复用TCP连接,客户端和浏览器都可以同时发多个请求或回应,并不用按顺序一一对应。发请求数量远大于HTTP1.1。对于HTTP1.1中管道化导致的请求/响应级别的队头阻塞,可以用HTTP的多路复用TCP连接解决。由于消息被拆分成帧进行传输,一个帧是一个数据流,一个连接上可以存在多个流,到达后再组装成消息,避免了请求/相应阻塞,但如果用的TCP,还是可能出现TCP队头阻塞(TCP数据包有序传输时丢包,会等该数据包重传,造成后面数据包阻塞)。引入头信息压缩机制,客户端和服务端维护一张头信息表,字段存入表中生成索引号,只发送索引号来压缩头信息。允许服务器未经请求主动发送资源给客户端,叫服务器推送,对支持的服务端请求数据时,服务端会顺便把客户端需要的资源一起推送给客户端,推送的资源其实在客户端的某处,客户端直接本地加载就行。
4.CSRF攻击
CSRF是跨站请求伪造,一般是受害人登录网站并保留了登录凭证cookie,然后又访问了恶意网站,恶意网站向登录的网站发送了请求,浏览器会默认携带原cookie,原网站验证后移位时受害人发送的请求,于是执行了请求,一般是跨域的。
1)防护策略
同源检测
禁止外域(或不受信任域名)发送请求,根据http中的origin header,referer header标记来源域名,是请求自带的不能自定义。
CSRF Token
为了区分用户自己的请求和恶意请求,可以让所有用户携带一个无法被攻击者获取的Token,用户打开页面时生成一个Token存在Session里,每次页面加载后对DOM中所有a,form标签加入Token可以解决大部分请求,但是页面加载后动态生成的HTML代码需要程序员手动添加Token。服务器从客户端获取Token后需要判断Token的有效性,大型网站中用Session会带来很多问题,所以要存储在Redis之类的公共存储空间,或者采用Encrypted Token Pattern,这个Token是计算得出,就不用读取存储的Token。只要页面没有XSS漏洞,CSRF攻击无法成功,但是该方法比较负载且工作量大验证码和密码也可以起到CSRF Token的作用
双重cookie验证
用户访问页面时向请求域名注入cookie,前端向后端发起请求取出cookie,添加到url参数,后端验证cookie中字段和url参数字段是否一致。因为CSRF无法获取用户Cookie,所以Ajax和表单请求携带Cookie值即可。但是安全性还是不够高,因为任何跨域都导致前端无法获取cookie中字段,就无法完成双重cookie认证,所以认证cookie必须在同域之中,所以每个子域才能访问,任何子域都能修改cookie,某个子域名存在漏洞被xss攻击,攻击者修改了cookie,就可以利用自己配置的cookie向xss中招的用户CSRF攻击。
Samesite Cookie属性
HTTP响应头中新增Samesite属性表明cookie时同站的,同站cookie只能作为第一方cookie,不能作为第三方cookie,严格模式(strict),任何跨域请求都不携带cookie,CSRF没有机会,但还是跳转子域名会需要重新登陆。宽松模式(Lax)下,通过页面跳转可以使用cookie,能保障登陆状态,但是按劝你星爷比较低。网站多个子域名,不能使用该属性在主域名存储登录信息,每个子域名都需要用户重新登录一次。
5.同源策略
同源策略是指域名,协议,端口相同,非同源不能读取cookie,无法获取dom,ajax请求不能发送。
6.xss攻击
跨站脚本攻击,利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码,使用户加载并执行攻击者恶意制造的网页程序,攻击成功后,攻击者可能得到一些高权限,获取私密网页内容,会话,cookie。
1)反射型xss
用户的输入或可控参数未经处理输出到页面上,就容易产生xss漏洞,比如把不可信数据($INPUT)插到HTML,SCRIPT,url,style里面。反射型一般出现在搜索功能中,需要用户点链接才能触发。
2)存储型xss
恶意代码被保存在服务器中,用户访问服务器资源的时候执行了恶意代码。一般发生在社区内容驱动的网站
3)DOM型xss
诱使用户访问自己构造的URL,构造的URL参数不发到服务器端。比如写一段JS代码修改页面的DOM节点,窃取/修改用户数据。
4)通用型xss
利用浏览器或浏览器扩展漏洞,比如在使用扩展程序时导致错误,使得代码可以执行。
5)突变型xss
用户提供的富文本内容通过js代码进入innerHTML,浏览器渲染引擎会把吴伟海的HTML代码渲染成XSS攻击代码,导致XSS的执行,导致XSS攻击。一般利用拼接的内容存在于innerHTML的漏洞
7.防范xss攻击
使用.innerHTML,document,write等要小心,不要插入不可信数据,可以换成.textContent,.setAttribute,把字符串作为代码运行的,不要拼接不可信数据。输入过滤在后端实现,前端渲染把代码和数据分开,拼接HTML采用合适的转义库
8.TCP滑动窗口协议
窗口内有已发送未收到ack的和待发送的数据包,当收到ack之后,就可以让窗口后移,纳入新的待发送的数据包。如果一直没等到窗口内第一个发送的包的Ack,超过时间就重新传数据包。ack必须按顺序,必须等前一个ack收到,才会把后面的ack发过去。
9.Token的生成过程
Token是计算机身份验证中的令牌(临时),用来证明身份。生成Token的解决方案是JWT