一、HTTP请求报文结构
二、起始行
①为请求方法,常见的有:GET、POST,此外还有DELETE、HEAD、OPTIONS、PUT、TRACE等,此处可能涉及到不安全的HTTP方法漏洞。
②为请求的URL地址,与报文头重的Host组成完整的URL。
③为HTTP协议及版本,目前主流版本是HTTP/1.1。
三、报文头
④为报文头,其中包含若干属性,其格式为“属性名:属性值”,服务器据此获取客户端信息。
与缓存相关的规则信息,均包含在header中。
请求报文头中的字段:
1.Host
给出了接收请求的服务器的主机名和端口号,可以是IP也可以是域名
在http1.1中不能缺少host字段,若确实服务器返回400 bad request,但host字段可为空值
而http1.0可以缺少host字段
2.Referer
表示这个请求是从哪个链接过来的
3.User-Agent
告诉网站服务器,访问者是通过什么工具来请求的
4.Accept
用于指定客户端可接受的内容类型。主要的目的就是告诉服务器,客户端能够接受的媒体类型,多个类型以逗号隔开,如果加权重的话以分号;隔开q=1,q的是指0-1最多三位小数的数字,默认是1。
*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type表示指定类型。
常见类型
文本类型 text/html, text/css
图片类型:image/png,image/jpg,image/gif
视频类型:video/mpeg,video/quitime
应用程序的二进制 : application/zip,applilcation/octet-stream
5.Cookie
HTTP最初是一个匿名、无状态的协议,Web 服务器几乎没有什么信息可以用来判定是哪个用户发送的请求,cookie 就是一些数据,用来存储会话信息,识别用户, 实现持久会话
Cookie 是由浏览器负责存储的,而不是操作系统。所以,它是“浏览器绑定”的,只能在本浏览器内生效。
Cookie字段有:[name] [value] [domain] [path] [expires/max-age] [size] [http] [secure] [sameSite]
name:存储在cookie中变量的名称。
value:存储在cookie中变量的值。
domain:域,cookie 对于哪个域是有效的。所有向该域发送的请求中都会包含这个 cookie 信息。
path:对于指定域中的那个路径,可以访问cookie;应该向服务器发送 cookie。如果同域不同路径,就不能访问该cookie。
expires:表示 cookie 何时应该被删除的时间戳。这个值是个 GMT 格式的日期,用于指定应该删除cookie 的准确时间。expires属性设置可能会出现误差,因为服务器时间与客户端时间可能不同。
max-age:默认单位是秒,用于规定n秒后Cookie过期。max-age的优先级比expires高,如果同时设置expires与max-age属性,那么max-age属性会生效。
size:此cookie的大小。
http:仅在HTTP层面上传输的cookie,设置了httpOnly后,客户端无法读写该cookie,能有效防御XSS攻击获取cookie。
secure:设置了secure标志的cookie仅在HTTPS层面上安全传输,如果请求的是HTTP,则不会发送这个cookie。设置了secure标志的cookie 客户端脚本是可以读写该cookie的。
sameSite:SameSite是Cookie最新增加属性,用于限制第三方Cookie,防止 CSRF 攻击和用户追踪。属性值有Strict,禁用任何第三方请求Cookie;Lax,对于第三方异步请求,则禁止第三方Cookie,对于第三方同步且是GET请求,则不禁止第三方Cookie;None,对于第三方请求的Cookie不做任何限制。
注:域、路径、失效时间和 secure 标志都是服务器给浏览器的指示,以指定何时应该发送 cookie。这些参数并不会作为发送到服务器的 cookie 信息的一部分,只有 name 和 value 才会被发送。
6.Content-Length
Content-Length是HTTP消息长度,用十进制数字表示的八位字节的数字。Content-Length字段指出报文中实体主体的字节大小。这个大小是包含了所有内容编码的。比如, 对文本文件进行了gzip压缩的话,Content-Length首部指的就是压缩后的大小而不是原始大小。( HTTP1.0中这个字段可有可无)
7.Content-Type
Content-Type:type/subtype ;parameter
type:主类型,任意的字符串,如text,如果是号代表所有;
subtype:子类型,任意的字符串,如html,如果是号代表所有,用“/”与主类型隔开;
parameter:可选参数,如charset,boundary等。
例:
Content-Type: text/html;
Content-Type: application/json;charset:utf-8;
(1)常见类型
①application/json
用来告诉服务端消息主体是序列化后的 JSON 字符串
②application/x-www-form-urlencoded
HTTP会将请求参数用key1=val1&key2=val2的方式进行组织,并放到请求实体里面,注意如果是中文或特殊字符如"/"、","、“:" 等会自动进行URL转码。不支持文件,一般用于表单提交。
③multipart/form-data
与application/x-www-form-urlencoded不同,这是一个多部分多媒体类型。首先生成了一个 boundary 用于分割不同的字段,在请求实体里每个参数以------boundary开始,然后是附加信息和参数名,然后是空行,最后是参数内容。多个参数将会有多个boundary块。如果参数是文件会有特别的文件域。最后以------boundary–为结束标识。multipart/form-data支持文件上传的格式,一般需要上传文件的表单则用该类型。
(2)其他常见类型
text/html : HTML格式
text/plain :纯文本格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
application/xhtml+xml :XHTML格式
application/xml: XML数据格式
application/atom+xml :Atom XML聚合格式
application/pdf:pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
8.Accept-Language
用来告知服务器用户代理能够处理的自然语言集(指中文或者英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集。
例:
Accept-Language: zh-cn, zh; q=0.7, en-us,en; q=0.3
采用权重q表示相对优先级,在上述例子中,客户端在服务器有中文版资源的情况下,会请求其返回中文版对象的响应,没有中文版时,则请求返回英文版响应。
9.Origin
指示了请求来自于哪个站点。该字段仅指示服务器名称,并不包含任何路径信息。除了不包含路径信息,该字段与 Referer 字段相似。
10.Connection
这个字段只在HTTP1.1协议中存在。它决定了客户端和服务器进行了一次会话后,服务器是否立即关闭网络连接。在客户端最直接的表现是使用read方法(readLine方法也是一样)读完客户端请求的Web资源后,是否立即返回-1(readLine返回null)。
Connection有两个值:Close和Keep-Alive
当使用Connection:Close时,和HTTP1.0协议是一样的,当read方法读完数据时立即返回;而使用Connection:Keep-Alive时,read方法在读完数据后还要被阻塞一段时间。直接读取数据超时时间过后,还继续往下执行。
11.Cache-Control
Cache-Control的默认取值:private
指令 | 作用 |
public | 表示响应可以被客户端和代理服务器缓存 |
private | 表示响应只可以被客户端缓存 |
max-age=30 | 缓存30秒后就过期,需要重新请求 |
s-maxage=30 | 覆盖max-age,作用一样,只在代理服务器中生效 |
no-store | 不缓存任何响应 |
no-cache | 资源被缓存,但是立即失效,下次会发起请求验证资源是否过期 |
max-stable | 30秒内,即使缓存过期,也使用该缓存 |
min-fresh | 希望在30秒内获取最新的相应 |
例:当Cache-Control:max-age=300时,则代表在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。
no-store
永远都不要在客户端存储资源,永远都去原始服务器去获取资源。
用来防止缓存和重新使用敏感信息,比如一个需要登录的网站,在浏览器缓存页面时,将会存储用户的登录信息,可能会导致用户之后访问时自动登录,因此登录页面可以使用No-Store 响应头来防止浏览器缓存,以保证安全性。
no-cache
可以在客户端存储资源,每次都必须去服务端做新鲜度校验,来决定从服务端获取新的资源(200)还是使用客户端缓存(304)。也就是所谓的协商缓存。
一般情况下对于 index.html 或者现代构建环境下不加 hash 的静态资源都需要设置 Cache-Control: no-cache,用来强制每次在服务器端的新鲜度校验,用来强制客户端每次访问都到服务端检查资源是否发生变化,比如一个拥有实时更新的新闻页面,可以使用 No-Cache 响应头来保证每次访问都可以获取到最新的新闻。相当于设置缓存头。
12.Accept-Encoding
用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。
例:Accept-Encoding: gzip, deflate
下面列举一些内容编码:
- gzip
由文件压缩程序 gzip
(GUN zip)生成的编码格式(RFC1952),采用 Lempel-Ziv 算法(LZ77)及32位循环冗余校验(Cyclic Redundancy Check,通称 CRC)
- compress
由 UNIX 文件压缩程序 compress 生成的编码格式,采用 Lempel-Ziv-Welch 算法(LZW)。
- deflate
组合使用 zlib 格式(RFC1950)及由 deflate 压缩算法(RFC1951)生成的编码格式。
- identity
不执行压缩或不会变化的默认编码格式。
13.X-Forwarded-For
代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项。