3.2 Web功能

除了在客户端与服务器之间发送消息时使用的核心通信协议外,Web应用程序还使用许多不同的技术来实现其功能。任何具有一定功能的应用程序都会在其服务器与客户端组件中采用若干种技术。在向Web应用程序发动猛烈攻击前,渗透测试员必须对应用程序如何实现其功能、所使用技术的运作方式及其可能存在的弱点有一个基本的了解。

3.2.1 服务器端功能

早期的万维网仅包含静态内容。Web站点由各种静态资源组成,如HTML页面与图片;当用户提交请求时,只需将它们加载到Web服务器,再传送给用户即可。每次用户请求某个特殊的资源时,服务器都会返回相同的内容。

如今的Web应用程序仍然使用相当数量的静态资源。但它们主要向用户提供动态生成的内容。当用户请求一个动态资源时,服务器会动态建立响应,每个用户都会收到满足其特定需求的内容。

动态内容由在服务器上执行的脚本或其他代码生成。在形式上,这些脚本类似于计算机程序:它们收到各种输入,并处理输入,然后向用户返回输出结果。

当用户的浏览器提出访问动态资源的请求时,它并不仅仅是要求访问该资源的副本。通常,它还会随请求提交各种参数。正是这些参数保证了服务器端应用程序能够生成适合各种用户需求的内容。HTTP请求使用3种主要方式向应用程序传送参数:

img002 通过URL查询字符串;

img002 通过REST风格的URL的文件路径;

img002 通过 HTTP cookie;

img002 通过在请求主体中使用POST方法。

除了这些主要的输入源以外,理论上,服务器端应用程序还可以使用HTTP请求的任何一个部分作为输入。例如,应用程序可能通过User-Agent消息头生成根据所使用的浏览器类型而优化的内容。

像常见的计算机软件一样,Web应用程序也在服务器端使用大量技术实现其功能。这些技术包括:

img002 脚本语言,如PHP、VBScript和Perl;

img002 Web应用程序平台,如ASP.NET和Java;

img002 Web服务器,如Apache、IIS和Netscape Enterprise

img002 数据库,如MS-SQL、Oracle和MySQL;

img002 其他后端组件,如文件系统、基于SOAP的Web服务和目录服务。

本书将详细介绍这些技术及其相关漏洞。下面将介绍一些可能遇到的最常见的Web应用程序平台和语言。

img003  错误观点  “我们的应用程序只需要粗略的安全检查,因为它们采用了非常实用的框架。”

在开发Web应用程序时,使用实用框架往往是人们放松警惕的主要原因,因为人们认为这样做就可以自动避免SQL注入等常见的漏洞。但由于以下两方面的原因,这种看法并不正确。

首先,大量Web应用程序漏洞在应用程序的设计,而不是实施阶段发生,而且,这些漏洞与所采用的开发框架或语言无关。

其次,上述实用框架通常采用最新的插件或程序包,而这些程序包很可能并未经过安全检查。有趣的是,如果之后在应用程序中发现漏洞,支持使用框架的开发者马上会改变立场,转而批评他们使用的框架或第三方程序包。

1.Java平台

近几年来,Java平台企业版(原J2EE)事实上已经成为大型企业所使用的标准应用程序。该平台由Sun公司开发(现在则属于Oracle公司)。它应用多层与负载平衡架构,非常适于模块化开发与代码重复利用。由于其历史悠久、应用广泛,因此,开发者在开发过程中可以利用许多高质量的开发工具、应用程序服务器与框架。Java平台可在几种基础型操作系统上运行,包括Windows、 Linux与Solaris。

描述基于Java的Web应用程序时,往往会使用许多易于混淆的术语,读者应该对它们有所警觉。

img002 Enterprise Java Bean (EJB)是一个相对重量级的软件组件,它将一个特殊业务功能的逻辑组合到应用程序中。EJB旨在处理应用程序开发者必须解决的各种技术挑战,如交易完整性。

img002 简单传统Java对象 (Plain Old Java Object,POJO)是一个普通的Java对象,以区别如EJB之类的特殊对象。POJO常用于表示那些用户定义的、比EJB更加简单且更加轻量级的对象以及用在其他框架中的对象。

img002 Java Servle 提应用程序服务器中的一个对象,它接收客户端的HTTP请求并返回HTTP响应。Servlet可使用大量接口来促进应用程序开发。

img002 Java Web容器 是一个为基于Java的Web应用程序提供运行时环境的平台或引擎。Apache Tomcat、BEA WebLogic和JBoss都属于Java Web容器。

许多Java Web应用程序在定制代码中使用第三方与开源组件。这种做法非常具有吸引力,因为它能够减轻开发工作,而且Java非常适于使用这种模块式的方法。关键应用程序功能常用的组件包括:

img002 身份验证 ——JAAS、ACEGI;

img002 表示层 ——SiteMesh、Tapestry;

img002 数据库对象关系映射 ——Hibernate;

img002 日志 ——Log4J。

如果能够确定受攻击的应用程序所使用的开源软件包,渗透测试员就可以下载这些软件包进行代码审查,或者安装它们开始攻击实验。这些组件中的任何一个漏洞都可能被攻击者利用。

2.ASP.NET

ASP.NET是Microsoft开发的一种Web应用程序框架,也是Java平台的主要竞争对手。ASP.NET比Java平台晚几年推出,但它已经占领了Java平台的部分市场。

ASP.NET使用Microsoft的.NET Framework,提供一个虚拟机[CLR(Common Language Runtime,通用语言运行时)]与一组强大的API。因此,ASP.NET应用程序可使用任何.NET语言(如C#或VB.NET)来编写。

ASP.NET采用传统桌面软件常用的事件驱动编程范型,而非许多早期Web应用程序框架所使用的基于脚本的方法。基于这种特点,再结合Visual Studio提供的强大开发工具,任何人即使并不具备熟练的编程技能,也能迅速开发出功能强大的Web应用程序。

不需要开发者做任何工作,ASP.NET框架就能防御一些常见的Web应用程序漏洞,如跨站点脚本。但这种明显简化的特点也造成一个现实问题,即许多小型的ASP.NET应用程序实际上由初学者开发,他们对于Web应用程序面临的核心安全问题缺乏了解。

3.PHP

PHP语言源于一个业余项目[最初该缩写词代表个人主页(Personal Home Page)]。之后,该项目迅速发展成为一个功能强大、应用丰富的Web应用程序开发框架。PHP常常与其他免费技术整合,如所谓的LAMP组合(包括操作系统Linux、Web服务器Apache、数据库服务器MySQL和Web应用程序编程语言PHP)。

人们使用PHP开发出大量的开源应用程序与组件,它们为常用的应用程序功能提供了现成的解决方案,并将其整合到应用更加广泛的定制应用程序中,例如:

img002 公告牌 ——PHPBB、PHP-Nuke;

img002 管理前端 ——PHPMyAdmin;

img002 Web邮件 ——SquirrelMail、IlohaMail;

img002 相册 ——Gallery;

img002 购物车 ——osCommerce、ECW-Shop;

img002 维客 ——MediaWiki、WakkaWikki。

由于PHP完全免费,简单易用,因此许多编写Web应用程序的初学者往往使用它作为首选语言。但是,由于历史原因,PHP框架的设计方法与默认配置导致程序员很容易不经意间在代码中引入安全漏洞,因此使用PHP编写的应用程序中可能包含大量安全漏洞。除此之外,PHP平台本身也存在若干缺陷,在平台上运行应用程序就可对其加以利用。请参阅第19章了解有关PHP应用程序常见漏洞的详情。

4.Ruby On Rails

Rails 1.0于2005年发布,主要侧重于模型-视图-控制器体系架构。Rails的主要优势在于,使用它能够以极快的速度创建成熟的数据驱动应用程序。如果开发者遵循Rails编码风格和命名约定,则可以使用Rails自动生成数据库内容的模型、修改该模型的控制器操作以及供应用程序用户使用的默认视图。与其他功能强大的新技术一样,人们已在Ruby On Rails中发现了一些漏洞,包括能够避开“安全模式”,这与在PHP中发现的漏洞类似。

有关最近发现的漏洞的详细信息,请参阅www.ruby-lang.org/en/security/。

5.SQL

结构化查询语言(SQL)用于访问Oracle、MS-SQL服务器和MySQL等关系数据库中的数据。目前,绝大多数的Web应用程序都将基于SQL的数据库作为它们的后端数据仓库,而且,几乎所有应用程序的功能都需要以某种方式与这些数据仓库进行交互。

关系数据库将数据存储在表中,每个表又由许多行和列构成。每一列代表一个数据字段,如“名称”或“电子邮件地址”,每一行则代表为这些字段中的一些或全部字段分配值的项。

SQL使用查询来执行常用的任务,如读取、添加、更新和删除数据。例如,要检索用户的具有指定名称的电子邮件地址,应用程序可以执行以下查询:

img62a

要实现它们所需的功能,Web应用程序可能会将用户提交的输入组合到由后端数据库执行的SQL查询中。如果以危险的方式进行组合,攻击者就可以提交恶意输入来干扰数据库的行为,从而读取和写入敏感数据。我们将在第9章中介绍这些攻击,并详细说明SQL语言及其用法。

6.XML

可扩展标记语言(XML)是一种机器可读格式的数据编码规范。与其他标记语言一样,XML格式将文档划分为内容(数据)和标记(给数据作注解)。

标记主要用标签表示,它们包括起始标签、结束标签和空元素标签:

img62b

起始和结束标签成对出现,其中可以包括文档内容或子元素:

img62c

标签可以包含以名/值对出现的属性:

img62d

XML之所以可扩展,是因为它可以使用任意数量的标签和属性名。XML文档通常包含文档类型定义(DTD),DTD定义文档中使用的标签、属性及其组合方式。

服务器端和客户端Web应用程序广泛采用XML及由XML派生的技术,我们将在本章后面部分介绍这些内容。

7.Web服务

虽然本书主要介绍Web应用程序攻击,但本书介绍的许多漏洞同样适用于Web服务。实际上,许多应用程序本质上就是一组后端Web服务的GUI前端。

Web服务使用简单对象访问协议(SOAP)来交换数据。通常,SOAP使用HTTP协议来传送消息,并使用XML格式表示数据。

典型的SOAP请求如下所示:

img63

在使用浏览器访问Web应用程序时很可能会遇到SOAP,服务器端应用程序使用它与各种后端系统进行通信。如果将用户提交的数据直接组合到后端SOAP消息中,就可能产生与SQL注入类似的漏洞。我们将在第10章详细介绍这些问题。

如果Web应用程序还直接公开Web服务,那么,我们还需要检查这些Web服务。即使前端应用程序是基于Web服务编写的,但它们在输入处理以及服务本身所披露的功能方面仍存在区别。正常情况下,服务器会以Web服务描述语言(WSDL)格式公布可用的服务和参数。攻击者可以使用soapUI之类的工具、基于已公布的WSDL文件创建示例请求,以调用身份验证Web服务,获得身份验证令牌,并随后提出任何Web服务请求。

3.2.2 客户端功能

服务器端应用程序要接收用户输入与操作,并向用户返回其结果,它必须提供一个客户端用户界面。由于所有Web应用程序都通过Web浏览器进行访问,因此这些界面共享一个技术核心。 然而,建立这些界面的方法各不相同。而且,近些年来,应用程序利用客户端技术的方式也一直在发生急剧变化。

1.HTML

HTML是建立Web界面所需的核心技术。这是一种用于描述浏览器所显示的文档结构的基于标签的语言。最初,HTML只能对文本文档进行简单的格式化处理。如今,它已经发展成为一种应用丰富、功能强大的语言,可用于创建非常复杂、功能强大的用户界面。

XHTML是HTML的进化版本,它基于XML,并采用比旧版HTML更严格的规范。之所以推出XHTML,部分是因为需要转而采用一种更加严格的HTML标记标准,以避免由于浏览器必须接受不太严格的HTML格式而导致的各种攻击和安全问题。

有关HTML及相关技术的详情,请参阅下面的几节。

2.超链接

客户端与服务器之间的大量通信都由用户单击超链接驱动。Web应用程序中的超链接通常包含预先设定的请求参数,这些数据项不需由用户输入,而是由服务器将其插入用户单击的超链接的目标URL中,以这种方式提交。例如,Web应用程序中可能会显示一系列新闻报道链接,其形式如下:

img64a

当用户单击这个链接时,浏览器会提出以下请求:

img64b

服务器收到查询字符串中的参数(newsid),并使用它的值决定向用户返回什么内容。

3.表单

虽然基于超链接的导航方法负责客户端与服务器之间的绝大多数通信,但许多Web应用程序还是需要采用更灵活的形式收集输入,并接收用户输入。HTML表单是一种常见的机制,允许用户通过浏览器提交任意输入。以下是一个典型的HTTP表单:

img64c

当用户在表单中输入值并单击“提交”按钮时,浏览器将提出以下请求:

img64d

在这个请求中,有几个要点说明了请求如何使用各种因素控制服务器端处理过程。

img002 因为HTML表单标签中包含一个指定POST方法的属性,浏览器就使用这个方法提交表单,并将表单中的数据存入请求消息主体中。

img002 除用户输入的两个数据外,表单中还包含一个隐藏参数(redir)与一个提交参数(submit)。这两个参数都在请求中提交,服务器端应用程序可使用它们控制其逻辑。

img002 与前面显示的超链接示例一样,负责表单提交的目标URL也包含一个预先设定的参数(app)。该参数可用于控制服务器端的处理过程。

img002 请求中包含一个cookie参数(SESS),服务器在早先的响应中将其发布给浏览器。该参数可用于控制服务器端处理过程。

前面的请求中包含一个消息头,它规定消息主体中的内容类型为x-www-form-urlencoded。这表示和URL查询字符串中的一样,消息主体中的参数也以名/值对表示。multipart/form-data是提交表单数据时可能遇到的另一种类型的内容。应用程序可在表单标签的enctype属性中要求浏览器使用多部分编码。使用这种编码形式,请求中的Content-Type消息头还会指定一个随机字符串,用它来分隔请求主体中的参数。例如,如果表单指定多部分编码,其生成的请求如下所示:

img65

4.CSS

层叠样式表(CSS)是一种描述以标记语言编写的文档的表示形式的语言。在Web应用程序中,CSS用于指定HTML内容在屏幕上(以及打印页面等其他媒介中)的呈现方式。

现代的Web标准力求将文档的内容与其表示形式尽可能地区分开来。这种区分具有许多好 处,包括简化和缩小HTML页面,更易于更新网页的格式以及提高可访问性等。

CSS以各种格式化规则为基础,这些规则可以通过不同的详细程度进行定义。如果多个规则与一个文档元素相匹配,在这些规则中定义的不同属性将进行“层叠”,从而将适当的样式属性组合应用于该元素。

CSS语法使用选择器来定义一类标记元素(应将一组指定的属性应用于这些元素)。例如,下面的CSS规则定义使用<h2>标签标记的标题的前景颜色:

h2 { color: red; }

在Web应用程序安全的早期阶段,CSS在很大程度上被人们所忽略,人们认为它们不可能造成安全威胁。今天,CSS本身正不断成为安全漏洞的来源,并且被攻击者作为传送针对其他类型的漏洞的入侵程序的有效手段(有关详细信息,请参阅第12章和第13章)。

5.JavaScript

超链接与表单可用于建立能够轻易接收大多数Web应用程序所需输入的丰富用户界面。然而,许多应用程序使用一种更加分布式的模型,不仅使用客户端提交用户数据与操作,还通过它执行实际的数据处理。这样做主要出于两个原因。

img002 改善应用程序的性能,因为这样可在客户端组件上彻底执行某些任务,不需要在服务器间来回发送和接收请求与响应。

img002 提高可用性,因为这样可根据用户操作动态更新用户界面,而不需要加载服务器传送的全新HTML页面。

JavaScript是一种相对简单但功能强大的编程语言,使用它可方便地以各种仅使用HTML无法实现的方式对Web界面进行扩展。JavaScript常用于执行以下任务。

img002 确认用户输入的数据,然后将其提交给服务器避免因数据包含错误而提交不必要的请求。

img002 根据用户操作动态修改用户界面,例如,执行下拉菜单和其他类似于非Web界面的控制。

img002 查询并更新浏览器内的文档对象模型(Document Object Model,DOM),控制浏览器行为(稍后就会介绍浏览器DOM)。

6.VBScript

VBScript可用于替代只有Internet Explorer浏览器才支持的JavaScript。VBScript以Visual Basic为基础,并可以与浏览器DOM进行交互。但通常而言,VBScript不如JavaScript强大和成熟。

由于VBScript只能在特定浏览器中使用,今天的Web应用程序已经很少使用VBScript。从安全角度看,我们之所以对它感兴趣,是因为在使用JavaScript无法传送入侵程序时,攻击者可以通过它来传送针对跨站点脚本之类漏洞的入侵程序(请参阅第12章)。

7.文档对象模型

文档对象模型(DOM)是可以通过其API查询和操纵的HTML文档的抽象表示形式。

DOM允许客户端脚本按id访问各个HTML元素并以编程方式访问这些元素的结构。DOM还可用于读取和更新当前URL和cookie等数据。另外,DOM还包括一个事件模型,以便于代码钩住各种事件,如表单提交、通过链接导航及键击。

如下一节所述,浏览器DOM操纵是基于Ajax的应用程序采用的关键技术。

8.Ajax

Ajax是一组编程技术,用于在客户端创建旨在模拟传统桌面应用程序的流畅交互和动态行为的用户界面。

Ajax是“异步JavaScript和XML"的缩写,尽管今天的Web Ajax请求既不需要是异步请求,也不使用XML。

最早的Web应用程序基于完整的页面。每个用户操作,如单击链接或提交表单,都会启动窗口级别的导航事件,导致服务器加载新页面。这种运行方式会导致不连续的用户体验,在应用程序收到来自服务器的庞大响应并重新显示整个页面时,会出现长时间的延迟。

使用Ajax,一些用户操作将由客户端脚本代码进行处理,并且不需要重新加载整个页面。相反,脚本会“在后台”执行请求,并且通常会收到较小的响应,用于动态更新一部分用户界面。例如,在基于Ajax的购物应用程序中,如果用户单击“添加到购物车”按钮,应用程序将启动一个后台请求,在服务器端更新用户的购物车记录,随后,一个轻量级响应会更新用户屏幕上显示的购物车中商品的数量。浏览器中的整个页面几乎保持不变,这样就为用户带来更快速、更满意的体验。

Ajax使用的核心技术为XMLHttpRequest。经过一定程度的标准整合之后,这种技术现在已转化为一个本地JavaScript对象,客户端脚本可以通过该对象提出“后台”请求,而无须窗口级别的导航事件。尽管其名称仅包含请求,但XMLHttpRequest允许在请求中发送以及在响应中接收任意数量的内容。虽然许多Ajax应用程序确实使用XML对消息数据进行格式化,但越来越多的Ajax倾向于使用其他表示方法来交换数据(下一节提供了一个相关示例)。

值得注意的是,虽然大多数Ajax应用程序确实与服务器进行异步通信,但这并不是必需的。在某些情况下,如执行特殊操作时,可能需要阻止用户与应用程序进行交互。这时,由于不需要重新加载整个页面,Ajax将提供更加无缝的体验。

以前,使用Ajax已在Web应用程序中引入了一些新的漏洞。从更广义的角度看,使用Ajax会在服务器端和客户端引入更多潜在的攻击目标,因而增加了典型应用程序的受攻击面。在设计针对其他漏洞的更加高效的入侵程序时,攻击者也可以利用Ajax技术。有关详细信息,请参阅第12章和第13章。

9.JSON

JavaScript对象表示法(JSON)是一种可用于对任意数据进行序列化的简单数据交换格式。JSON可直接由JavaScript解释器处理。Ajax应用程序经常使用JSON,以替换最初用于数据传输的XML格式。通常,如果用户执行某个操作,客户端JavaScript将使用XMLHttpRequest将该操作传送到服务器。服务器则返回一个包含JSON格式的数据的轻量级响应。然后,客户端脚本将处理这些数据,并对用户界面进行相应地更新。

例如,基于Ajax的Web邮件应用程序可能提供显示所选联系人的详细资料的功能。如果用户单击某位联系人,浏览器将使用XMLHttpRequest检索所选联系人的详细资料,并使用JSON返回这些资料:

img68a

客户端脚本将使用JavaScript解释器来处理JSON响应并基于其内容更新用户界面的相关部分。

此外,当前的应用程序还将JSON用于封装传统上位于请求参数中的数据。例如,如果用户更新联系人的详细资料,则可以使用以下请求将新信息传送至服务器:

img68b

10.同源策略

同源策略是浏览器实施的一种关键机制,主要用于防止不同来源的内容相互干扰。基本上,从一个网站收到的内容可以读取并修改从该站点收到的其他内容,但不得访问从其他站点收到的内容。

如果不使用同源策略,那么,当不知情的用户浏览到某个恶意网站时,在该网站上运行的脚本代码将能够访问这名用户同时访问的任何其他网站的数据和功能。这样,该恶意站点就可以从用户的网上银行进行转账、阅读用户的Web邮件,或在用户网上购物时拦截他的信用卡信息。为此,浏览器实施限制,只允许相同来源的内容进行交互。

实际上,将这一概念应用于各种Web功能和技术会导致各种复杂情况和风险。关于同源策略,需要了解的一些主要特点如下。

img002 位于一个域中的页面可以向另一个域提出任意数量的请求(例如,通过提交表单或加载图像)。但该页面本身无法处理上述请求返回的数据。

img002 位于一个域中的页面可以加载来自其他域的脚本并在自己的域中执行这个脚本。这是因为脚本被假定为包含代码,而非数据,因此跨域访问并不会泄露任何敏感信息。

img002 位于一个域中的页面无法读取或修改属于另一个域的cookie或其他DOM数据。

这些特点可能导致各种跨域攻击,如诱使用户执行操作和捕获数据。此外,由于浏览器扩展技术以各种方式实施同源限制,这一问题变得更加复杂。我们将在第13章详细讨论这些问题。

11.HTML5

HTML5是对HTML标准的重大更新。当前,HTML5仍处在开发阶段,仅在浏览器中进行了小规模实施。

从安全角度看,我们对HTML5感兴趣主要出于以下原因。

img002 它引入了各种可用于传送跨站点脚本及实施其他攻击的新标签、属性和API(会在第12章 讲述)。

img002 它对XMLHttpRequest这一核心Ajax技术进行了修改,在某些情况下可以实现双向跨域交互。这可能导致新的跨域攻击(会在第13章讲述)。

img002 它引入了新的客户端数据存储机制,这可能导致用户隐私问题以及新型攻击,如客户端SQL注入(会在第13章讲述)。

12.“Web 2.0”

近些年来,Web 2.0这个专业术语已经成为一个流行词汇,用于Web应用程序领域内的各种相关趋势(尽管并不准确)的描述,这些趋势包括:

img002 大量使用Ajax执行各种异步后台请求;

img002 使用各种技术提高跨域集成;

img002 在客户端使用各种新技术,包括XML、JSON和Flex;

img002 采用更先进的技术来支持用户生成的内容、信息共享和交互。

和技术领域的所有新技术一样,这些趋势也造成了各种安全漏洞。但是,总体而言,这些漏洞并未形成新的Web应用程序安全问题。Web 2.0相关的漏洞在很大程度上与这种趋势出现之前的漏洞相同,或派生自之前的漏洞。总的来说,“Web 2.0安全”是一个错误的概念,它对于我们考虑重要的问题并无帮助。

13.浏览器扩展技术

除JavaScript功能外,一些Web应用程序还通过采用浏览器扩展技术,使用定制代码从各方面扩展浏览器的内置功能。这些组件可配置为字节码,由适当的浏览器插件执行,或需要在客户计算机上安装本地可执行程序。在攻击Web应用程序时,可能遇到的厚客户端技术包括:

img002 Java applet;

img002 ActiveX控件;

img002 Flash对象;

img002 Silverlight对象。

我们将在第5章详细讨论这些技术。

3.2.3 状态与会话

迄今为止,本书讨论的技术主要用于帮助Web应用程序服务器和客户端组件以各种方式进行数据交换和处理。但是,为实现各种有用的功能,应用程序需要追踪每名用户通过不同的请求与应用程序交互的状态。例如,一个购物应用程序允许用户浏览产品目录、往购物车内添加商品、查看并更新购物车内容、结账并提供个人与支付信息。

为实现这种功能,应用程序必须维护一组在提交各种请求过程中由用户操作生成的有状态数据。这些数据通常保存在一个叫做会话的服务器端结构中。当用户执行一个操作(如在购物车中添加一件商品)时,服务器端应用程序会在用户会话内更新相关信息。以后用户查看购物车中的内容时,应用程序就使用会话中的数据向用户返回正确的信息。

在一些应用程序中,状态信息保存在客户端组件而非服务器中。服务器在响应中将当前的数据传送给客户端,客户端再在请求中将其返回给服务器。当然,由于通过客户端组件传送的任何数据都可被用户修改,因此,应用程序需要采取措施阻止攻击者更改这些状态信息,破坏应用程序的逻辑。ASP.NET平台利用隐藏表单字段ViewState保存与用户的Web界面有关的状态信息,从而减轻服务器的工作负担。默认情况下,ViewState的内容中还包括一个密钥散列,以防止受到破坏。

因为HTTP协议本身并没有状态,为使用正确的状态数据处理每个请求,大多数应用程序需要采用某种方法在各种请求中重新确认每一名用户的身份。通常,应用程序会向每名用户发布一个令牌,对用户会话进行唯一标识,从而达到这一目的。这些令牌可使用任何请求参数传输,但许多应用程序往往使用HTTP cookie来完成这项任务。会话处理过程中也会产生几种漏洞,第7章将详细讨论这些内容。