目录
HTTP(HyperText Transfer Protocol,超文本传输协议)
基于请求(Request)/应答(Response)模型,web浏览器向web服务器发送一条请求,web服务器处理请求并返回响应;
一种无状态的协议,无状态是指Web浏览器与Web服务器之间不需要建立持久的连接,当一个客户端向服务器发出请求,然后web服务器返回响应,连接就被关闭了;
1. HTTP请求与响应
所有的HTTP消息(请求或者响应)包括三部分:
- 消息头(header)
- 一个强制空白行(代表消息头结束)
- 消息主体
1) HTTP请求
一个典型的HTTP请求如下所示:
GET /auth/488/YourDetails.ashx?uid=129 HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, */*
Referer: https://mdsec.net/auth/488/Home.ashx
Accept-Language: en-GB
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; InfoPath.3; .NET4.0E; FDM; ,NET CLR 1.1.4322)
Accept-Encoding: gzip, deflate
Host: mdsec.net
Connection: Keep-Alive
Cookie: SessionId=5B70C71F3FD4968935CDB6682E545476
1)每个HTTP请求的第一行都有三个以空格间隔的项目组成:
- 一个说明HTTP方法的动词,最常用的方法是GET,它的主要作用是从Web服务器获取一个资源,GET请求没有消息主体;
- 所请求的URL,该URL通常由所请求的资源名称,以及一个包含客户端向该资源提交的参数的可选查询字符串组成;
- 使用的HTTP版本,常用版本为1.0和1.1,多数浏览器默认使用1.1版本;
2)Referer消息头用于表示发出请求的原始URL;
3)User-Agent消息头提供与浏览器或其他生成请求的客户端软件有关的信息;
4)Host消息头用于指定现在被访问的完整URL中的主机名称;如果几个Web站点以相同的一台服务器作为主机,就需要使用Host消息头;
5)Cookie消息头用于提交服务器向客户端发布的其他参数;
2) HTTP响应
HTTP/1.1 200 OK
Date: Tue, 19 Apr 2011 09:23:32 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Set-Cookie: tracking=tI8rk7joMx44S2Uu85nSWc
X-AspNet-Version: 2.0.50727
Cache-Control: no-cache
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 1067
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>Your Details</title>
....
1)每个HTTP响应的第一行由3个以空格间隔的项目组成:
- 使用的HTTP版本;
- 表示请求结果的数字状态码,200是最常见的状态码,它表示成功提交了请求,正在返回所请求的资源;
- 一段文本形式的原因短语,进一步说明响应状态,这个短语可以包含任何值,当前浏览器不将其用于任何目的;
2)Server消息头指明所使用的Web服务器软件,有时还包括其他信息,如所安装的模块和服务器操作系统;
3)Set-Cookie消息头向浏览器发送另一个cookie,他将在随后向服务器发送的请求中由Cookie消息头返回;
4)Pragma消息头指示不要将响应保存在缓存中;
5)Content-Type消息头表示这个消息主体中包含一个HTML文档;
6)Content-Length消息头规定消息主体的字节长度;
2. HTTP方法
1)GET
用于获取资源;它能以URL查询字符串的形式向所请求的资源发送参数;
如果请求资源为动态脚本,那么返回文本是Web容器解析后的HTML源代码,不是源文件;
2)HEAD
服务器在响应消息中没有消息主体,其他与GET方法相同;
被用来测试超文本链接的有效性、可访问性,资源是否存在,编写扫描工具时就常用此方法;
3)POST
与GET方法近似,POST一般用来向服务器发送大量的数据(GET也可以发送数据,但有长度限制)
GET请求会将发送的数据显示在浏览器端,POST不会,所以POST的安全性更高;
4)PUT
用于请求服务器把请求中的实体存储在请求资源下,如果请求资源已经存在,用此请求中的资源替换原先的数据,如果请求的资源不存在,将会创建该资源,然后存储请求消息主体;
PUT /input.txt //将消息主体存储在主机根目录下的input文本中
HOST: www.xxser.com
Content-Length: 6
123456
5)DELETE
请求服务器删除请求的指定资源;服务器一般会关闭该方法;
6)TRACE(不常见)
7)CONNECT
动态切换到隧道的代理;
8)OPTIONS
请求获得该URL标识的资源在请求/响应的通信过程中可以使用的功能选项(就是可以使用哪些请求方法);
注:以上为标准方法,但HTTP中的请求方法不止这些,WebDAV是一种基于HTTP/1.1协议的通信协议,它在以上几个标准方法的基础上添加了一些新的方法,使应用程序可以直接对服务器进行读写,并支持文件锁定(Locking)和解锁(Unlock)、文件复制(Copy)、文件移动(Move);
3. URL(统一资源定位符)
URL(统一资源定位符)是标识Web资源的唯一标识符;
URL格式:
protocol:// hostname [:port] / [path/] file [?param=value]
4. HTTP消息头
HTTP支持许多不同的消息头,其中一些专用于特殊用途。一些消息头可用在请求与响应中,而其他一些消息头只能专门用在某个特定的消息中;
1)常用消息头
- Connection
这个消息头用于告诉通信的另一端,在完成HTTP传输后是关闭TCP连接还是保持连接开放以接收其他消息。
- Content-Encoding
这个消息头为消息主体中的内容指定编码形式(如gzip),一些应用程序使用它来压缩响应以加快传输速度;
- Content-Length
这个消息头用于规定消息主体的字节长度。
- Content-Type
这个消息头用于规定消息主体的内容类型。例如,HTML文档的内容类型为text/html;
- Transfer-Encoding
这个消息头指定为方便其通过HTTP传输而对消息主体使用的任何编码。如果使用这个消息头,通常用它指定块编码。
2) 请求消息头
- Accept
这个消息头用于告诉服务器客户端愿意接受哪些内容,如text/html。
- Accept-Encoding
这个消息头用于告诉服务器,客户端愿意接受哪些内容编码。
- Authorization
这个消息头用于为一种内置HTTP身份验证向服务器提交证书。
- Cookie
这个消息头用于向服务器提交它以前发布的cookie,表示请求者身份;
- Host
这个消息头用于指定被请求资源的Internet主机和端口号。
- If-Modified-Since
这个消息头用于说明浏览器最后一次收到所请求的资源的时间。如果从那以后资源没有发生变化,服务器就会发出一个带状态码304的响应,指示客户端使用资源的缓存副本。
- If-None-Match
这个消息头用于指定一个实体标签。实体标签是一个说明消息主体内容的标识符。当最后一次收到所请求的资源时,浏览器提交服务器发布的实体标签。服务器可以使用实体标签确定浏览器是否使用资源的缓存副本。
- Origin
这个消息头用在跨域Ajax请求中,用于指示提出请求的域;
- Referer
这个消息头包含一个URL,表示访问当前URL的上一个URL,表明用户从什么地方来;
- User-Agent
这个消息头允许将客户端的操作系统、浏览器或者其他属性告诉服务器。
3) 响应消息头
- Access-Control-Allow-Origin
这个消息头用于指示可否通过跨域Ajax请求获取资源。
- Cache-Control
这个消息头用于向浏览器传送缓存指令(如no-cache)
- ETag
这个消息头用于指定一个实体标签。客户端可在将来的请求中提交这个标识符,获得和If-None-Match消息头中相同的资源,通知服务器浏览器当前缓存中保存的是哪个版本的资源。
- Expires
这个消息头用于向浏览器说明消息主体内容的有效时间。在这个时间之前,浏览器可以使用这个资源的缓存副本。
- Location
这个消息头用于在重定向响应(那些状态码以3开头的响应)中说明重定向的目标。
- Pragma
这个消息头用于向浏览器传送缓存指令(如no-caChe );
- Server
这个消息头提供所使用的Web服务器软件的相关信息。
- Set-Cookie
这个消息头用于向浏览器发布cookie, 浏览器会在随后的请求中将其返回给服务器。
- www-Authenticate
这个消息头用在带401状态码的响应中,提供与服务器所支持的身份验证类型有关的信息。
- X-Frame-Options
这个消息头指示浏览器框架是否及如何加载当前响应(请参阅第13章了解相关内容);
5. cookie
1)什么是cookie
cookie实际上是一小段的文本信息(key-value格式),一般由一个名/值对构成,但也可包含任何不含空格的宇符串。可以在服务器响应中使用几个Set-Cookie消息头发布多个cookie, 并可在浏览器请求中在同一个Cookie消息头中用分号分隔不同的cookie, 将它们全部返回给服务器。
2)cookie作用
服务器使用cookie来确定客户端的身份。
服务器使用cookie机制向客户端发送数据,客户端保存cookie并将其返回给服务器;
与其他类型的请求参数(存在于URL査询字符串或消息主体中)不同,无须应用程序或用户采取任何特殊措施,随后的每一个请求都会继续重新向服务器提交cookie;
服务器使用Set-Cookie响应消息头发布cookie:如Set-Cookie: tracking=tI8rk7joMx44S2Uu85nSWc;
然后,用户的浏览器自动将上面的消息头添加到随后返回给同一服务器的请求中:Cookie:tracking=tI8rk7joMx44S2Uu85nSWc;
3)cookie属性
除cookie的实际值外,Set-Cookie消息头还可包含以下任何可选属性,用它们控制浏览器处理cookie的方式:
- expires
用于设定cookie的有效时间。这样会使浏览器将cookie保存在永久性的存储器中,在随后的浏览器会话中重复利用,直到到期时间为止。如果没有设定这个属性,那么cookie仅用在当前浏览器会话中。
有两种存储类型的Cookie:会话性与持久性。Expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效;
- domain
用于指定cookie的有效域。这个域必须和收到cookie的域相同,或者是它的父域。(不懂)
- path
用于指定cookie的有效URL路径。(不懂)
- secure
如果设置这个属性,则仅在HTTPS请求中提交cookie;
- HttpOnly
如果设置这个属性,将无法通过客户端JavaScript直接访问cookie;
上述每一个cookie属性都可能影响应用程序的安全,其造成的主要不利影响在于攻击者能够直接对应用程序的其他用户发动攻击;
6. 状态码
每条HTTP响应消息都必须在第一行中包含一个状态码,说明请求的结果。
根据代码的第一位数字,可将状态码分为以下5类:
- 1xx——信息提示,表示请求已成功被接收,继续处理。
- 2xx——服务器成功处理了请求。
- 3xx——重定向,告诉浏览器客户端访问的资源已被移动,并告诉客户端新的资源地址;。
- 4xx——请求包含某种错误。
- 5xx——服务器执行请求时遇到错误。
具体状态码:
- 100 Continue
当客户端提交一个包含主体的请求时,将发送这个响应。该响应表示已收到请求消息头,客户端应继续发送主体。请求完成后,再由服务器返回另一个响应。
- 200 Ok
本状态码表示已成功提交请求,且响应主体中包含请求结果。
- 201 Created
PUT请求的响应返回这个状态码,表示请求已成功提交。
- 301 Moved Permanently
本状态码将浏览器永久重定向到另外—个在Location消息头中指定的URL,以后客户端应使用新URL替换原始URL;
- 302 Found
本状态码将浏览器暂时重定向到另外一个在Location消息头中指定的URL,客户端应在随后的请求中恢复使用原始URL;
- 304 Not Modified
本状态码指示浏览器使用缓存中保存的所请求资源的副本。服务器使用If-Modified-Since与If-None-Match消息头确定客户端是否拥有最新版本的资源。
- 400 Bad Request
本状态码表示客户端提交了一个无效的HTTP请求。当以某种无效的方式修改请求时( 例如在URL中插人一个空格符),可能会遇到这个状态码。
- 401 Unauthorized
服务器在许可请求前要求HTTP进行身份验证。WWW-Authenticate消息头详细说明所支持的身份验证类型。
- 403 Forbidden
本状态码指出,不管是否通过身份验证,禁止任何人访问被请求的资源。
- 404 Not Found
本状态码表不所请求的资源并不存在。
- 405 Method Not Allowed
本状态码表示指定的URL不支持请求中使用的方法。例如,如果试图在不支持PUT方法的地方使用该方法,就会收到本状态码。
- 413 Request: Entity Too Large
如果在本地代码中探査缓冲器溢出漏洞并就此提交超长数据串,则本状态码表示请求主体过长,服务器无法处理。
- 414 Request URI Too Long
与前一个响应类似,本状态码表示请求中的URL过长,服务器无法处理。
- 500 Internal Server Error
本状态码表示服务器在执行请求时遇到错误。当提交无法预料的输人、在应用程序处理过程中造成无法处理的错误时,通常会收到本状态码。应该仔细检査服务器响应的所有内容,了解与错误性质有关的详情。
- 503 Service Unavailable
通常,本状态码表示尽管Web服务器运转正常,并且能够响应请求,但服务器访问的应用程序还是无法作出响应。应该进行核实,是否因为执行了某种行为而造成这个结果。