网络学习-关于HTTP与HTTPS的知识点
HTTP协议是构建于TCP/IP协议之上,是一个应用层协议,默认端口上是80
HTTP是无连接无状态的
HTTP 报文
请求报文
URL全称是资源描述符,用于描述一个网络上的资源。规范把http请求分为method、headers、body
http定义了与服务器交互的不同方法,最基本的有四种,get\pust\put\delete
GET:用于信息获取,是安全的(不会对数据库进行修改) 幂等(同一个url的请求返回同样的结果)
Tip:get可提交的数据量受到url长度的限制,http对其不进行限制,是服务器和浏览器对其进行限制
POST:表示可能修改服务器上的资源请求
Tip:post是没有大小限制的,服务器软件对其进行限制
POST 提交数据的方式
服务器端用python、php等语言框架会自动解析请求头中的content-type,默认为
-
application/x-www-form-urlencoded
还有另外一种格式:
-
multipart/form-data
响应报文
http响应也有三个部分组成:
状态行、响应头、响应正文
状态行包含协议版本、状态码及相应的状态描述
200:客户端请求成功
304:文件未更新,使用本地缓存(如果客户端第一次访问某网站,根据 If-Modified-Since 关键字查看响应文件有没有更新,如果没有更新则返回304)
-
301 Moved Permanently 请求永久重定向
-
302 Moved Temporarily 请求临时重定向
400:客户端请求语法有问题
401:请求未经授权
404:请求的资源不存在
500:服务器端发汗恶搞不可预期的错误
503:服务器当前不能处理,过一会会恢复正常
持久连接
HTTP采用的是“请求-应答”模式,每一次都要建立一个连接,结束之后立即断开连接
当使用“keep-alive”功能是客户端对服务器端的连接持续有效,避免了建立或者重新建立连接
HTTP keep-alive 简单来说就是保持了当前的tcp连接,避免了重新建立连接
Keep-Alive:timeout:5,max=100 TCP通道可以保持5秒,表示场连接最多接受100次请求就断开
无状态协议,以为每一个请求都是独立的。唯一能保证的是当连接被关闭时你能得到一个通知,所以不应该让程序依赖于Kepp-alive的保持连接特性。不能保证这种连接一定是活跃的。
使用长连接之后,怎么知道本次传输结束呢?content-length /动态生成的文件没有conteng-length,它是分块传输的,这时候就要根据chunked编码来判断。最后有一个是空的chunked块,表明传输结束。
Transfer-Encoding
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
25
This is the data in the first chunk
1A
and this is the second one
0
HTTP之规范了一种transfer-Encoding,每一个非空的块都以该块包含的数据的字节数开始,跟随回车换行,再跟随数据本身。最后一块是单行,由块大小0结束
采用chunk是提前不知道什么时候结束的,看不到下载进度
他的优势在于 服务器端可以边生成内容边发送
HTTP Pipelining(HTTP 管线化)
管线话是将多个HTTP请求整批提交的技术,在传送过程中不需要等待服务器的回应。
管线化机制是通过持久连接完成。
只有GET/HEAD请求可以使用管线化,而post则有所限制
初次创建连接时不应该使用,应为不知道服务器是否支持
管线化不会影响相应到来的顺序
会话跟踪
客户端打开与服务器的连接发出请求到服务器响应客户端的请求的全过程称之为会话。
会话跟踪就是对一个用户对服务器的连接的请求和接受相应的监视
http协议是无连接状态,请求一次就结束一次,它不能保存用户的信息,即一次相应完成之后连接就断开了,需要判断是否为同一个用户,所以才会有会话跟踪来实现这种技术
常用的方法:
1.url重写 把会话id加到url后面,以便服务器进行识别不同的用户
2.将会话id添加到表单中,并不在客户端显示
3.cookie是web服务器发给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进行用户的识别。客户端可以保存session,以便下次使用。(1)保存在客户端的内存中,临时的,刘拉姆齐关闭之后cookie对象消失(2)保存在客户端的磁盘上,是永久的,在有限期内。cookie是可以被客户端禁用的
4.session 每一个用户都有一个不同的session,各个用户之间是不能共享的,在session可以存放信息
在服务器端创建一个session对象,产生一个sessionid来表示这个session对象,然后将这个session ID放在cookie中发送到客户端,下一次访问时,sessionid会发送到服务器,在服务器端进行识别不同的用户
session依赖于cookie
跨站攻击
CSRF:Cross-site request forgery 跨站请求伪造
冒充用户在站内的正常操作
1.关键操作只接受post请求
2.验证码
3.检测referer,常见的互联网页面和页面之间是有联系的。一般用于监控CSRF攻击的发生
4.token,主流方法
Csrf攻击成功的条件在于攻击者能够预测所有的参数从而构造成一个合法的请求,所以根据不可预测性,(1)我们可以对参数进行加密
(2)在原有基础上添加一个token(保持随机、一次性的,每次请求成功之后要更新token,注意保密)
Xss:Cross site scripting 跨站脚本攻击,是注入攻击的一种。写一些脚本语言,如果服务器没有对其进行转译,就会执行这个脚本语言。主要通过过滤掉用户的输入
HTTPS 基本过程
https即http over TLS,即是一种在加密信道进行http内容传输的协议
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。其中**交互算法是 ECDHE_RSA,对称加密算法是 AES_128_GCM,消息认证(MAC)算法为 SHA256。
TLS证书机制
https过程中很重要的一部分就是服务器要有CA颁发的证书,客户端根据受信的CA列表验证服务器的身份。现代浏览器中,证书验证的过程依赖于证书信任链,即一个证书要依靠上一个证书来证明自己可靠,最顶层的证书称为根证书。根证书一般是OS自带的。对于浏览器来说,chrome是跟着os走的,firefox有自带的一套证书信任机制。
中间人攻击
MITM (man in the middle attack)
中间攻击者可以和两端都进行会话,并在里面插入新的内容
SSL剥离:
阻止用户使用https访问网站,用户第一次访问使用http,明文。通过攻击dns响应,攻击者可以将自己变成中间人。
HSTS(解决ssl剥离):强制浏览器在一段时间内使用https访问,但需要第一次返回的响应中加一个特殊的头部。所以第一次被攻击了也没有办法。加一些网站的域名,在这个list里的网站,直接强制使用https
伪造证书攻击:1.攻击dns服务器2.攻击者自己的证书需要被用于信任。
HPKP:HPKP 直接在返回头中存储服务器的公钥指纹信息,一旦发现指纹和实际接受到的公钥有差异,浏览器就可以认为正在被攻击