zergxixi 2015-03-25
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 数据包分析的必备知识。