HTTP协议
0x00-引言
哦,GG BOY ,童话里做英雄
0x01-什么是http协议
Web使用一种名为HTTP(HyperText Transfer Protocol,超文本传输协议)的协议作为规范,完成从客户端到服务器等一系列运作流程。而协议是指规则的约定。可以说,Web是建立在HTTP协议上通信的。HTTP协议属于TCP/IP协议簇的一种,在OSI七层模型中处于应用层。
http是无状态协议。每个请求都是完全独立的,数据包包含一次请求的全部信息。
http协议通过网管可以改变协议
URI:统一资源定位符。URL:统一资源标识符。URL是URI的一种,是它的子集
版本 | 产生时间 | 内容 | 发展现状 |
---|---|---|---|
HTTP/0.9 | 1991年 | 不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求 | 没有作为正式的标准 |
HTTP/1.0 | 1996年 | 传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令 | 正式作为标准 |
HTTP/1.1 | 1997年 | 持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码 | 2015年前使用最广泛 |
HTTP/2 | 2015年 | 多路复用、服务器推送、头信息压缩、二进制协议等 | 逐渐覆盖市场 |
0x02-http工作流程
服务器程序监听TCP80端口,浏览器访问网址与服务器建立TCP连接,然后浏览器发送http请求报文,服务器发送HTTP响应报文,释放TCP连接。一次事务结束。
网站结构拓扑图:
外网访问web服务器经过网关,网关可以转换协议,如把http转换为ftp
0x03-http报文
http报文分为三部分
- 报文首部
- 空行(CR+LF)
- 报文主体
01-http请求报文结构
-
请求行
-
请求首部字段
-
请求主体信息
请求头和请求主体信息之间用空行隔开
GET /sds HTTP/1.1
Host: hackr.jp
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*; q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
If-Modified-Since: Fri, 31 Aug 2007 02:02:20 GMT
If-None-Match: "45bae1-16a-46d776ac"
Cache-Control: max-age=0
i am handsome
请求行包括:方法,路径,http协议版本号,如GET /sds HTTP/1.1
,GET为方法,/sds是路径,HTTP/1.1为协议版本号
02-常见首部字段
以下来自狼组公开知识库
01-请求首部字段
字段名 | 解释 |
---|---|
Host | 请求资源所在服务器和端口号 |
Accept | 可处理的媒体类型 |
Accept-Charset | 可接收的字符集 |
Accept-Encoding | 可接受的内容编码 |
Accept-Language | 可接受的自然语言 |
Cookie | 存储用户的信息,有一定安全作用 |
If-Modified-Since | 用于说明最后一次收到所请求资源的时间 |
If-None-Match | 用于指定一个实体标签 |
Origin | 用在Ajax跨域请求中,用于指示提出请求的域 |
Referer | 指示发出当前域名 |
User-Agent | 提供生成请求客户端软件的有关信息 |
02-响应首部字段
字段名 | 解释 |
---|---|
Allow | 资源可支持的HTTP方法 |
Location | 在重定向响应中,说明重定向的目标 |
Server | 提供所使用的Web服务器软件的信息 |
Accept-Ranges | 可接受的字节范围 |
03-通用首部字段
请求报文和响应报文中都会出现的字段
字段名 | 解释 |
---|---|
Date | 报文创建时间 |
Connection | 连接状态(关闭和保持TCP连接) |
Cache-Control | 缓存的控制 |
Transfer-Encoding | 报文主体的传输编码方式 |
04-实体首部字段
请求报文与响应报文的消息主体部分使用的首部字段
字段名 | 解释 |
---|---|
Content-Type | 规定消息主体的类型 |
Content-Encoding | 实体主体适用的编码方式,一些应用程序用它压缩响应加快传输 |
Content-Language | 实体主体的自然语言 |
Content-Length | 规定消息主体的字节长度 (HEAD方法例外) |
Content-Range | 实体主体的位置范围,一般用于发出部分请求时使用 |
Transfer-Encoding | 分块传输;常用它指定块编码,它是指定HTTP传输对消息主体使用的任何编码的 |
Access-Control-Allow-Origin | 指示可否通过跨域Ajax请求获取资源 |
ETag | 用于指定一个实体标签。客户端可在将来的请求中提交这个标识符,获取和If-None-Match消息头中相同的资源通知服务器浏览器当前缓存中保存的是哪个版本的资源 |
Expirses | 用于向浏览器说明消息主体内容的有效时间,在这个时间内浏览器可以使用这个资源的缓存副本 |
Pragma | 指示浏览器不要将响应保存在缓存中(no-cache) |
Set-Cookie | 用于向浏览器发布Cookie,浏览器会在随后的请求中将其返回给服务器 |
WWW-Authenticate | 在带401状态码的响应中,提供与服务器所支持的身份验证类型的有关信息 (如基础认证) |
X-Frame-Options | 指示浏览器框架是否加载以及如何加载当前响应 |
03-http安全方法
方法 | 描述 |
---|---|
GET | 发送请求来获得服务器上的资源,请求体中不会包含请求数据,请求数据放在协议头中。另外get支持快取、缓存、可保留书签等。幂等 |
POST | 和get一样很常见,向服务器提交资源让服务器处理,比如提交表单、上传文件等,可能导致建立新的资源或者对原有资源的修改。提交的资源放在请求体中。不支持快取。非幂等 |
HEAD | 本质和get一样,但是响应中没有呈现数据,而是http的头信息,主要用来检查资源或超链接的有效性或是否可以可达、检查网页是否被串改或更新,获取头信息等,特别适用在有限的速度和带宽下。 |
PUT | 和post类似,html表单不支持,发送资源与服务器,并存储在服务器指定位置,要求客户端事先知道该位置;比如post是在一个集合上(/province),而put是具体某一个资源上(/province/123)。所以put是安全的,无论请求多少次,都是在123上更改,而post可能请求几次创建了几次资源。幂等 |
DELETE | 请求服务器删除某资源。和put都具有破坏性,可能被防火墙拦截。如果是https协议,则无需担心。幂等 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。就是把服务器作为跳板,去访问其他网页然后把数据返回回来,连接成功后,就可以正常的get、post了。 |
OPTIONS | 获取http服务器支持的http请求方法,允许客户端查看服务器的性能,比如ajax跨域时的预检等。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。一般禁用,防止被恶意攻击或盗取信息。 |
扩展方法:
方法 | 描述 |
---|---|
LOCK | 允许用户锁定资源,比如,可以在编辑某个资源时将其锁定,以防止别人进行修改 |
MKCOL | 允许用户创建资源 |
COPY | 便于在服务器上复制资源 |
MOVE | 在服务器上移动资源 |
若是扩展方法不被使用,响应包会以501 Not Implemented(无法实现)响应。
04-http状态码
状态码是用来反应服务器响应情况的
01-1xx-信息性状态码
表示临时响应并需要请求者继续执行操作
Status code | 原因短语 | 短语含义 | 说明 |
---|---|---|---|
100 | Continue | 请继续 | 说明收到了请求的初始部分,让客户端继续,发送了这个状态码之后,服务器在收到请求之后,服务器器必须响应 |
101 | Switch Protocols | 建议切换协议 | 说明服务器根据客户端的指定,将协议切换成Update首部所列的协议 |
02-2xx-成功
表示成功处理了请求
Status code | 原因短语 | 短语含义 | 说明 |
---|---|---|---|
200 | OK | 成功 | 服务器已成功处理了请求,通常,这表示服务器提供了请求的网页 |
201 | Created | 已创建 | 请求成功并且服务器创建了新的资源 |
202 | Accepted | 已接受 | 服务器已接受请求,但尚未处理 |
203 | Non-Authoritative Innformation | 非授权信息 | 服务器已成功处理了请求,但返回的信息可能来自另一来源 |
204 | No Content | 无内容 | 服务器成功处理了请求,但没有返回任何内容 |
205 | Reset Content | 重置内容 | m服务器成功处理了请求,但没有返回任何内容 |
206 | Partial Content | 部分内容 | 服务器成功处理了部分GET请求 |
03-3xx-重定向
表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向
Status code | 原因短语 | 短语含义 | 说明 |
---|---|---|---|
300 | Multiple Choices | 多种选择 | 针对请求,服务器可执行多种操作.服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择 |
301 | Moved Permanently | 永久移动 | 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置 |
302 | Found | 临时移动 | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求 |
303 | See Other | 查看其他位置 | 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码 |
304 | Not Modified | 未修改 | 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容 |
305 | Use Proxy | 使用代理 | 请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理 |
306 | 未使用 | ||
307 | Temporary Redirect | 临时重定向 | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求 |
04-4xx-请求错误
表示请求可能出错,妨碍了服务器的处理
Status code | 原因短语 | 短语含义 | 说明 |
---|---|---|---|
400 | Bad Request | 错误请求 | 服务器不理解请求的语法 |
401 | Unauthorized | 未授权 | 请求要求身份验证。对于需要登录的网页,服务器可能返回此响应 |
402 | Payment Required | 未被使用,保留以后使用 | |
403 | Forbidden | 禁止 | 服务器拒绝请求 |
404 | Not Found | 未找到 | 服务器找不到请求的网页 |
405 | Method Not Allowed | 方法禁用 | 禁用请求中指定的方法 |
406 | Not Acceptable | 不接受 | 无法使用请求的内容特性响应请求的网页 |
407 | Proxy Authentication Required | 需要代理授权 | 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理 |
408 | Request Timeout | 请求超时 | 服务器等候请求时发生超时 |
409 | Conflict | 冲突 | 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息 |
410 | Gone | 已删除 | 如果请求的资源已永久删除,服务器就会返回此响应 |
411 | Length Required | 需要有效长度 | 服务器不接受不含有效内容长度标头字段的请求 |
412 | Precondition Failed | 未满足前提条件 | 服务器未满足请求者在请求中设置的其中一个前提条件 |
413 | Request Entity Too Large | 请求实体过大 | 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力 |
414 | Request URI Too Long | 请求的 URI 过长 | 请求的 URI(通常为网址)过长,服务器无法处理 |
415 | Unsupported Media Type | 不支持的媒体类型 | 请求的格式不受请求页面的支持 |
416 | Requested Range Not Satisfiable | 请求范围不符合要求 | 如果页面无法提供请求的范围,则服务器会返回此状态代码 |
417 | Expecttation Failed | 未满足期望值 | 服务器未满足"期望"请求标头字段的要求 |
05-5xx-服务器错误
Status code | 原因短语 | 短语含义 | 说明 |
---|---|---|---|
500 | Internal Server Error | 服务器内部错误 | 服务器遇到错误,无法完成请求 |
501 | Not Implemented | 尚未实施 | 服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码 |
502 | Bad Gateway | 错误网关 | 服务器作为网关或代理,从上游服务器收到无效响应 |
503 | Service Unavailable | 服务不可用 | 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态 |
504 | Gateway Timeout | 网关超时 | 服务器作为网关或代理,但是没有及时从上游服务器收到请求 |
505 | HTTP Version Not Supported | HTTP 版本不受支持 | 服务器不支持请求中所用的 HTTP 协议版本 |
0x04-Cookie安全
01-什么是Cookie
Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
Cookie是当前识别用户,实现持久会话的最好方式。
Cookie分为两大类:会话Cookie和持久Cookie。会话Cookie是临时Cookie,它记录了用户访问站点时的设置和偏好。用户退出浏览器时也就被删除了。持久Cookie的生存时间更长一些,他们存储在硬盘上面,计算机重启它们仍然存在。
会话Cookie和持久Cookie唯一区别就是过期时间不一样。
02-Cookie的作用
Cookie可以跟踪会话,弥补HTTP无状态协议的不足。
Session机制采用的是在服务端保持状态的方案,而Cookie机制则是在客户端保持状态的方案,Cookie又叫会话跟踪机制。
Cookie记录用户的登录信息,个性化设置。
03-Cookie的格式
js设置Cookie:向客户端发送一个Cookie
document.cookie="name,value,expire,path,domain,secure";
PHP设置Cookie:向客户端发送一个Cookie
setcookie(name,value,expire,path,domain,secure);
参数 | 描述 |
---|---|
name | 必需。规定 cookie 的名称。 |
value | 必需。规定 cookie 的值。 |
expire | 可选。规定 cookie 的有效期。 |
path | 可选。规定 cookie 的有效服务器路径。这个参数是下一个参数domain基础上的有效路径,如果path设置为”/”,那就是在整个domain都有效,如果path设置为”/test”,那么只在domain下的/test目录及子目录才有效。 |
domain | 可选。规定 cookie 的域名。默认为当前域名。设置为“/”时也代表当前域名。 |
secure | 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。值为0或1,如果值为1,则cookie只能在https连接上有效,默认值为0,表示cookie在http和https连接上都有效。 |
04-Cookie的安全性问题
01-Cookie与CSRF
CSRF:跨站请求伪造
用户登录a网站(信任),浏览器记录a的Cookie。此时浏览器未关闭,a的Cookie存在,用户访问b网站(恶意),存在恶意连接使用户由b网站跳转到a网站。在此过程b网站利用之前用户访问a的Cookie在a网站上面胡作非为。在a看来b网站访问它就是用户访问的,因为b网站用的是用户访问a的Cookie。
防御措施:
- 放弃Cookie,使用Token(令牌),具有一定的唯一性
- SameSite Cookies Cookie新属性SateSite。能够解决CSRF攻击的问题
- Referer验证
02-Cookie与XSS
XSS:跨站脚本攻击
通过XSS攻击使用document.cookie可以弹出Cookie信息,进而可以做一些恶意的事情
防御措施:
- 使用http-only,表示只能被http请求携带,XSS也就获取不到Cookie
- 把XSS攻击过滤掉,涉及XSS防御
0x05-http认证方式
01-BASIC认证
BASIC 认证(基本认证)是从 HTTP/1.0 就定义的认证方式。即便是现在仍有一部分的网站会使用这种认证方式。是 Web 服务器与通信客户端之间进行的认证方式。
BASIC 认证虽然采用 Base64 编码方式,但这不是加密处理。不需要任何附加信息即可对其解码。换言之,由于明文解码后就是用户 ID和密码,在 HTTP 等非加密通信的线路上进行BASIC 认证的过程中,如果被人窃听,被盗的可能性极高。BASIC 认证使用上不够便捷灵活,且达不到多数 Web 网站期望的安全性等级,因此它并不常用
02-DIGEST认证
为弥补 BASIC 认证存在的弱点,从 HTTP/1.1 起就有了 DIGEST 认证。 DIGEST 认证同样使用质询 / 响应的方式(challenge/response),但不会像 BASIC 认证那样直接发送明文密
码。所谓质询响应方式是指,一开始一方会先发送认证要求给另一方,接着使用从另一方那接收到的质询码计算生成响应码。最后将响应码返回给对方进行认证的方式
DIGEST 认证提供了高于 BASIC 认证的安全等级,但是和 HTTPS 的客户端认证相比仍旧很弱。DIGEST 认证提供防止密码被窃听的保护机制,但并不存在防止用户伪装的保护机制。DIGEST 认证和 BASIC 认证一样,使用上不那么便捷灵活,且仍达不到多数 Web 网站对高度安全等级的追求标准。因此它的适用范围也有所受限
03-SSL客户端认证
从使用用户 ID 和密码的认证方式方面来讲,只要二者的内容正确,即可认证是本人的行为。但如果用户 ID 和密码被盗,就很有可能被第三者冒充。利用 SSL 客户端认证则可以避免该情况的发生。SSL 客户端认证是借由 HTTPS 的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问是否来自已登录的客户端。
客户端需要安装证书,安装需要费用。
04-基于表单的认证
基于表单的认证方法并不是在 HTTP 协议中定义的。客户端会向服务器上的 Web 应用程序发送登录信息(Credential),按登录信息的验证结果认证。根据 Web 应用程序的实际安装,提供的用户界面及认证方式也各不相同。
多数情况下,输入已事先登录的用户 ID(通常是任意字符串或邮件地址)和密码等登录信息后,发送给 Web 应用程序,基于认证结果来决定认证是否成功。
登录框
0x06-http与https
https:安全套接字层超文本传输协议,ssl依靠证书验证服务器身份
http是明文传输,https是加密的,s为安全套接字
https作用:
- 建立一个安全通道,来保证数据传输的安全
- 确认网站的真实性
http与https的区别:
- https要使用证书,一般要一些费用
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
- http端口为80,https端口为443
- https建立握手速度比http慢50%
0x07-参考
《图解HTTP》
《HTTP权威指南》