接下来是一些URI所未能显现出来的(但是不多!)。HTTP是一种无状态的“请求-应答”协议。除了URI中的信息(在protocol://domain的右边),HTTP还传递用于请求中的方法(method)、协议首部(header),以及主体(body)部分中携带的数据。这些部分在URI中都不可见,但是对于理解Web应用非常重要。
HTTP方法是在目标资源上执行的操作类型。HTTP RFC定义了少数方法,Web分布式创作和版本管理(WebDAV)扩展定义了更多方法。但是大部分Web应用只使用两种方法:GET和POST。GET请求信息,GET和POST都能向服务器发送信息,但两者之间有一个重要的不同点:GET将所有数据保留在URI,而POST在请求的主体中放置数据(在URI中不可见)。POST一般用于向应用提交表单数据,例如要求姓名、发货地址以及付款方式的在线购物应用。常见的一种误解是,因为缺乏可见性,POST能够比GET更好地保护数据。在本书中我们将无数次地说明,这种假设通常是错误的(但是使用GET在查询串上发送敏感数据确实更可能在各种地方暴露该数据,包括客户端缓存和Web服务器日志)。
HTTP首部一般用于存储关于协议级事务的附加信息。HTTP首部中与安全相关的示例包括:
·Authorization: 定义请求是否使用某种类型的验证,在许多实例中兼做验证数据(例如使用基本(Basic)验证)。
·Cache-control: 定义是否将请求的一个副本缓存在中间代理服务器上。
·Referer (按照HTTP RFC,这种错误的拼写是有意的):列出浏览器到达当前链接的源URI。有时用于早期的容易攻破的验证方案。
·cookies: 常用于存储自定义应用验证/会话令牌。我们将在本书中谈到很多关于cookie的内容。
下面的示例是用流行的netcat工具揭示HTTP的“隐秘”之处。我们首先连接www.test.com服务器的TCP端口80(用于HTTP的标准端口;HTTPS使用TCP 443端口),然后请求/test.html资源。这个请求的URI将是http://www.test.foo/test.html。
www.test.foo [10.124.72.30] 80 (http) open GET /test.html HTTP/1.0 HTTP/1.1 200 OK Date: Mon, 04 Feb 2002 01:33:20 GMT Server: Apache/1.3.22 (Unix) Connection: close Content-Type: text/html <HTML><HEAD><TITLE>TEST.FOO</TITLE>etc.
在这个示例中,很容易看到请求中的方法(GET),响应首部(Server:等),以及响应主体数据(<HTML>等)。一般来说,黑客对HTTP不需要理解得这么细,只要使用现成的工具来自动完成所有的低级工作,暴露那些需要操纵的部分就可以了。我们将在下面的部分图解说明Web应用是“如何”受到攻击的。