2.3 HTTP 协议
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数据包分析的必备知识。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论