5.1 通过客户端传送数据

应用程序通常以终端用户无法直接查看或修改的方式向客户端传送数据,希望客户端在随后的请求中将这些数据送回服务器。通常,应用程序的开发者简单地认为所采用的传输机制将确保通过客户端传送的数据在传送过程中不会遭到修改。

由于客户端向服务器传送的一切内容都完全处于用户的控制范围内,认为通过客户端传送的数据不会被修改,这种看法往往是错误的,并致使应用程序易于遭受一种或几种攻击。

你肯定想知道这其中的原因。如果一个特殊的数据已知,并由服务器指定,则应用程序需要向客户端提交这个值,然后读取回该值。实际上,对开发者而言,以这种方式编写应用程序往往更加简单,原因如下。

img002 这样做不必追踪用户会话中的各种数据。减少每次会话保存在服务器上的数据量,同时还能提高应用程序的性能。

img002 如果将应用程序部署到几台不同的服务器上,那么,在执行多级操作时,用户可能需要与多台服务器进行交互,这时在处理相同用户请求的主机之间共享服务器端数据就会遇到困难。那么,使用客户端传送数据就成为解决这个问题的一个颇具吸引力的方案。

img002 如果应用程序在服务器上采用任何第三方组件,如购物车,则可能很难或无法修改这些组件,因此,通过客户端传输数据就成为集成这些组件的最简单方式。

img002 在某些情况下,跟踪服务器上的新数据可能需要更新核心服务器端API,因而会触发正式的变更管理流程和回归测试。这时,实施包含客户端数据传输的更加细化的解决方案可以避免这种情况,从而满足紧凑的完工期限要求。

但是,以这种方式传送敏感数据通常并不安全,并且会在应用程序中造成大量漏洞。

5.1.1 隐藏表单字段

隐藏HTML表单字段是一种表面看似无法修改,通过客户端传送数据的常用机制。如果一个表单标记为隐藏,它就不会显示在屏幕上。但是,用户提交表单时,保存在表单中的字段名称和值仍被送交给应用程序。

在隐藏表单字段中保存产品价格的零售应用程序就是存在这种安全缺陷的典型示例。在Web应用程序发展的早期阶段,这种漏洞极其普遍,现在也绝没有消失。典型的表单如图5-1所示。

img107a

图5-1 典型的HTML表单

创建这个表单的代码如下:

img107b

注意,表单字段名为price,其被标记为隐藏。用户提交表单时,这个字段将被送交给服务器:

img107c