请求报文的常用字段

URL 的请求协议几乎都是HTTP,它是一种无状态的请求响应,即每次的请求响应之

后,连接会立即断开或延时断开(保持一定的连接有效期),断开后,下一次请求再重新

建立。这里举一个简单的例子,对http://www.foo.com/发起一个GET 请求:

GET http://www.foo.com/ HTTP/1.1

Host: www.foo.com

Connection: keep-alive

Cache-Control: max-age=0

User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.19 (KHTML, like

Gecko) Chrome/18.0.1025.3 Safari/535.19

Referer: http://www.baidu.com/

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Encoding: gzip,deflate,sdch

Accept-Language: zh-CN,zh;q=0.8

Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3

Cookie: SESSIONID=58AB420B1D8B800526ACCCAA83A827A3:FG=1

响应如下:

HTTP/1.1 200 OK

Date: Sun, 04 Mar 2012 22:48:31 GMT

Server: Apache/2.2.8 (Win32) PHP/5.2.6

Set-Cookie: PTOKEN=; expires=Mon, 01 Jan 1970 00:00:00 GMT; path=/;

domain=.foo.com; HttpOnly

Set-Cookie: USERID=c7888882e039b32fd7b4d3; expires=Tue, 01 Jan 2030

00:00:00 GMT; path=/; domain=.foo.com

X-Powered-By: PHP/5.2.6

Content-Length: 3635

Keep-Alive: timeout=5, max=100

Connection: Keep-Alive

Content-Type: text/html;charset=gbk

<html>

...

</html>

请求与响应一般都分为头部与体部(它们之间以空行分隔)。对于请求体来说,一般

出现在POST 方法中,比如表单的键值对。响应体就是在浏览器中看到的内容,比如,

HTML/JSON/JavaScript/XML 等。这里的重点在这个头部,头部的每一行都有自己的含义,

key 与value 之间以冒号分隔,下面看看几个关键点。

请求头中的几个关键点如下。

GET http://www.foo.com/ HTTP/1.1

这一行必不可少,常见的请求方法有GET/POST,最后的“HTTP/1.1”表示1.1 版本

的HTTP 协议,更早的版本有1.0、0.9。

Host: www.foo.com

这一行也必不可少,表明请求的主机是什么。

User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.19 (KHTML, like

Gecko) Chrome/18.0.1025.3 Safari/535.19

User-Agent 很重要,用于表明身份(我是谁)。从这里可以看到操作系统、浏览器、

浏览器内核及对应的版本号等信息。

Referer: http://www.baidu.com/

Referer 很重要,表明从哪里来,比如从http://www.baidu.com/页面点击过来。

Cookie: SESSIONID=58AB420B1D8B800526ACCCAA83A827A3:FG=1

前面说HTTP 是无状态的,那么每次在连接时,服务端如何知道你是上一次的那个?

这里通过Cookies 进行会话跟踪,第一次响应时设置的Cookies 在随后的每次请求中都会发

送出去。Cookies 还可以包括登录认证后的身份信息。

响应头中的几个关键点如下。

HTTP/1.1 200 OK

这一行肯定有,200 是状态码,OK 是状态描述。

Server: Apache/2.2.8 (Win32) PHP/5.2.6

上述语句透露了服务端的一些信息:Web 容器、操作系统、服务端语言及对应的版本。

X-Powered-By: PHP/5.2.6

这里也透露了服务端语言的信息。

Content-Length: 3635

响应体的长度。

Content-Type: text/html;charset=gbk

响应资源的类型与字符集。针对不同的资源类型会有不同的解析方式,这个会影响浏

览器对响应体里的资源解析方式,可能因此带来安全问题。字符集也会影响浏览器的解码

方式,同样可能带来安全问题。

Set-Cookie: PTOKEN=; expires=Mon, 01 Jan 1970 00:00:00 GMT; path=/;

domain=.foo.com; HttpOnly; Secure

Set-Cookie: USERID=c7888882e039b32fd7b4d3; expires=Tue, 01 Jan 2030

00:00:00 GMT; path=/; domain=.foo.com

每个 Set-Cookie 都设置一个Cookie(key=value 这样),随后是如下内容。

expires:过期时间,如果过期时间是过去,那就表明这个Cookie 要被删。

path:相对路径,只有这个路径下的资源可以访问这个Cookie。

domain:域名,有权限设置为更高一级的域名。

HttpOnly:标志(默认无,如果有的话,表明Cookie 存在于HTTP 层面,不能被客户

端脚本读取)。

Secure:标志(默认无,如果有的话,表明Cookie 仅通过HTTPS 协议进行安全传输)。

请求响应头部常见的一些字段都有必要了解,这是我们在研究Web 安全时对各种HTTP 数据包分析的必备知识。

相关推荐