HTTP协议报文结构

HTTP协议报文结构对于学习web安全的人来说是重中之重。

请求报文

大致结构

可以分为三大部分:
请求行,请求头,请求体(注意前面有个空白行)。
image.png

请求行

1,请求行中第一属性是方法(图中的POST)等决定了对请求对象进行的操作,也就是一种命令。

方法含义方法含义
GET请求获取一个Web页面HEAD与GET方法相似,区别在于只获取Web页面首部,不获取主体。
POST主要作用是执行操作,比如向服务器提交一个表单。PUT请求向服务器上传指定的资源。
DELETE请求删除一个Web页面TRACE用于测试,要求服务器返回收到的请求。
MOVE请求移动某个页面到指定位置OPTION请求服务器所支持哪些方法。

这几种方法其中POST,GET比较常用。
HEAD方法主要是用来猜测是否有某些文件,因为只接收头信息,也就是下面说的响应报文中的
image.png
注意get请求是没有请求体的。
2,提交方法后面一个空格跟着是网页路径
3,再一个空格后是传输协议及其版本。一般为HTTP/1.1

请求头

格式

请求头里面中就包含了大部分信息。有许多键值对
字段名: 值

请求消息头部常见字段说明:

字段名说明
Host消息头用于指定出现在被访问的完整URL中的主机名称
User-Agent这个消息头提供与浏览器或生成请求的其他客户端软件有关
的信息。
Accept这个消息头用于告诉服务器客户端愿意接受哪些内容,如图
像类型、办公文档格式等。
Accept-Language用于声明服务器浏览器可以支持什么语言。
Accept-Encoding这个消息头用于告诉服务器,客户端愿意接受哪些内容编码
Referer这个消息头用于指示提出当前请求是来自哪个URL。
Cookie提交此前服务器向客户端发送的其他参数(服务器使用Set-
Cookie消息头:来设置Cookie,一般用于身份验证)
Connection通知通信的另一方 ,是否在完成HTTP传输后关闭TCP连接。

1,其中对于网络安全比较重要的是Host,User-Agent,Referer,Cookie等。
伪造微信内部打开
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B176 MicroMessenger/4.3.2
2,还有一些消息头本来没有定义但广泛使用,也是比较重要常用的,例如:
X-Forwarded-For
X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。
X-Forwarded-For 请求头格式非常简单,就这样:
X-Forwarded-For: client, proxy1, proxy2
可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。
如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:
X-Forwarded-For: IP0, IP1, IP2
然后就可以通过修改这部分内容达到伪造自己的ip地址。
3,还有些消息头是小部分使用,服务器自己设定的以达到传递更多的信息。遇到时可以通过百度等了解其作用。

响应报文

大致结构:

image.png
image.png

响应行:

状态码

和请求报文相比,响应报文多了一个“响应状态码”,它以“清晰明确”的语言告诉客户端本次请求的处理结果。
HTTP的响应状态码由5段组成:

  • 1xx 信息,一般是告诉客户端,请求已经收到了,正在处理,别急…
  • 2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
  • 3xx 重定向到其它地方。为了完成任务,必须进一步执行的动作。它让客户端再发起一个请求以完成整个处理。
  • 4xx 客户端错误,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
  • 5xx 服务器错误,如服务端抛出异常,路由出错,HTTP版本不支持等。

以下是几个常见的状态码及其描述:
200 OK 存在文件
你最希望看到的,即处理成功!
3xx均可能存在
301:表示本网页永久性转移到另一个地址
302/307:临时重定向,指出请求的文档已被临时移动到别处, 浏览器自动跳转新链接。
303 :我把你redirect到其它的页面,目标的URL通过响应报文头的Location告诉你。
304 Not Modified
该资源在上次请求之后没有任何修改,还可以继续使用。这通常用于浏览器的缓存机制。
400:请求语法有错误,服务器不能解析。
401: 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。
403:存在文件夹
客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。
404:不存在文件或文件夹
500:服务器出错,看到这个错误,你就应该查查服务端的日志了!

响应头:

响应报文头,也是由多个属性组成;

字段名说明
Date响应返回的时间, GMT代表格林威治时间(北京市位于东8区,
算北京时间要加8小时)。
Server这个消息头提供所使用的Web服务器软件的相关信息。
Set-Cookie这个消息头用于向浏览器发布cookie ,浏览器会在随后的请
求中将其返回给服务器
Content- Type这个消息头用于规定消息主体的内容类型。例如, HTML文档
的内容类型为text/html。
Content-Length这个消息头用于规定消息主体的字节长度。
Connection通知通信的另一方,是否在完成HTTP传输后关闭TCP连接。
Cache-Control响应输出到客户端后,服务端通过该报文头属告诉客户端如何控制响应内容的缓存。

在网络安全中上面比较重要的信息是Sever,Set-Cookie

Cache-Control

常见的取值有private、public、no-cache、max-age,no-store等默认为private。

Cache-directive说明
public所有内容都将被缓存(客户端和代理服务器都可缓存)
private内容只缓存到私有缓存中(仅客户端可以缓存,代理服务器不可缓存)
no-cache需要使用对比缓存来验证缓存数据。
必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证令牌 (ETag),no-cache 会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载。
no-store所有内容都不会被缓存到缓存或 Internet 临时文件中
must-revalidation/proxy-revalidation如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证
max-age=xxx (xxx is numeric)缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高

ETag

一个代表响应服务端资源(如页面)版本的报文头属性,如果某个服务端资源发生变化了,这个ETag就会相应发生变化。它是Cache-Control的有益补充,可以让客户端“更智能”地处理什么时候要从服务端取资源,什么时候可以直接从缓存中返回响应

Set-Cookie

服务端可以设置客户端的Cookie,其原理就是通过这个响应报文头属性实现的:
Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
cookie机制:
1,Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。

如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。
如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。
如果maxAge为0,则表示删除该Cookie。
2,Cookie并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。
如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。

Cookie cookie = new Cookie(“username”,“helloweenvsfei”); // 新建Cookie
cookie.setMaxAge(0); // 设置生命周期为0,不能为负数
response.addCookie(cookie); // 必须执行这一句 输出到客户端

其他响应头属性

Location
我们在JSP中让页面Redirect到一个某个A页面中,其实是让客户端再发一个请求到A页面,这个需要Redirect到的A页面的URL,其实就是通过响应报文头的Location属性告知客户端的,如下的报文头属性,将使客户端redirect到iteye的首页中:
Location: http://www.iteye.com

响应体:

响应报文体,即我们真正要的“干货,就是网页源码,可以在页面按ctrl+U查看。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚无-缥缈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值