黑客攻防从入门到精通(Web技术实战篇)
上QQ阅读APP看书,第一时间看更新

2.2 Web功能及使用技术

除了在客户端和服务器之间发送消息时使用的核心通信协议外,Web应用程序还通过使用不同的技术来实现其不同的功能。Web的主要功能我们将通过Web服务器端、Web客户端、会话与状态三个方面详细介绍。

2.2.1 Web服务器端功能

Web服务器一般指网站服务器,是指驻留于互联网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的3个Web服务器是Apache、Nginx、IIS。

在Mosaic浏览器(通常被认为是第一个图形化的Web浏览器)和超链接内容的初期,演变出了“Web服务器”的新概念,它通过HTTP协议来提供静态页面内容和图片服务。在那个时候,大多数内容都是静态的,并且HTTP 1.0只是一种传送文件的方式。但在不久后Web服务器提供了CGI功能,这意味着我们可以为每个Web请求启动一个进程来产生动态内容。现在,HTTP协议已经很成熟了,并且Web服务器变得更加复杂,拥有了像缓存、安全和Session管理这些附加功能。随着技术的进一步成熟,我们从Kiva和Net Dynamics学会了公司专属的基于Java的服务器端技术。这些技术最终全都融入我们今天依然在大多数应用开发里使用的JSP中。

通俗地讲,Web服务器传送(serves)页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods)。确切一点,你可以说:Web服务器专门处理HTTP请求(request),但是应用程序服务器是通过很多协议来为应用程序提供(serves)商业逻辑(business logic)的。

Web服务器可以解析(handles)HTTP协议。当Web服务器接收到一个HTTP请求(request),会返回一个HTTP响应(response),如送回一个HTML页面。为了处理一个请求(request), Web服务器可以响应(response)一个静态页面或图片,进行页面跳转(redirect),或者把动态响应(dynamic response)的产生委托(delegate)给一些其他的程序,如CGI脚本、JSP(Java Server Pages)脚本、servlets、ASP(Active Server Pages)脚本、服务器端(server-side)Java Script,或者一些其他的服务器端(server-side)技术。无论它们(译者注:脚本)的目的如何,这些服务器端(server-side)的程序通常产生一个HTML的响应(response)来让浏览器可以浏览。

要知道,Web服务器的代理模型(delegation model)非常简单。当一个请求(request)被送到Web服务器里来时,它只单纯地把请求(request)传递给可以很好地处理请求(request)的程序(译者注:服务器端脚本)。Web服务器仅仅提供一个可以执行服务器端(server-side)程序和返回(程序所产生的)响应(response)的环境,而不会超出职能范围。服务器端(server-side)程序通常具有事务处理(transaction processing)、数据库连接(database connectivity)和消息(messaging)等功能。

虽然Web服务器不支持事务处理或数据库连接池,但它可以配置(employ)各种策略(strategies)来实现容错性(fault tolerance)和可扩展性(scalability),如负载平衡(load balancing)和缓冲(caching)。集群特征(clustering features)经常被误认为仅仅是应用程序服务器专有的特征。

Web服务器的工作原理并不复杂,一般可分成以下4个步骤。

(1)连接过程。

(2)请求过程。

(3)应答过程。

(4)关闭连接。

下面对这4个步骤作简单的介绍。连接过程就是Web服务器和其浏览器之间所建立起来的一种连接。查看连接过程是否实现,用户可以找到和打开socket这个虚拟文件,这个文件的建立意味着连接过程这一步骤已经成功建立。请求过程就是Web的浏览器运用socket这个文件向其服务器提出各种请求。应答过程就是运用HTTP协议把在请求过程中所提出来的请求传输到Web的服务器,进而实施任务处理,然后运用HTTP协议把任务处理的结果传输到Web的浏览器,同时在Web的浏览器上面展示上述所请求之界面。关闭连接就是当上一个步骤——应答过程完成以后,Web服务器和其浏览器之间断开连接之过程。如图2-4所示。Web服务器上述4个步骤环环相扣、紧密相连,逻辑性比较强,可以支持多个进程、多个线程以及多个进程与多个线程相混合的技术。

图2-4 Web服务器功能

在Unⅸ和Linux平台下使用最广泛的免费HTTP服务器是Apache和Nginx服务器,而Windows平台NT/2000/2003使用ⅡS的Web服务器。在选择使用Web服务器时应考虑的本身特性因素有性能、安全性、日志和统计、虚拟主机、代理服务器、缓冲服务和集成应用程序等。下面介绍几种常用的Web服务器。

(1)IIS。Microsoft的Web服务器产品为Internet Information Services(IIS), IIS是允许在公共Intranet或Internet上发布信息的Web服务器。IIS是目前最流行的Web服务器产品之一,很多著名的网站都是建立在IIS的平台上。IIS提供了一个图形界面的管理工具,称为Internet服务管理器,可用于监视配置和控制Internet服务。

IIS是一种Web服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包括互联网和局域网)上发布信息成了一件很容易的事。它提供ISAPI(Intranet Server API)作为扩展Web服务器功能的编程接口;同时,它还提供一个Internet数据库连接器,可以实现对数据库的查询和更新。

(2)Kangle。Kangle Web服务器(简称Kangle)是一款跨平台、功能强大、安全稳定、易操作的高性能Web服务器和反向代理服务器软件。除此之外,Kangle也是一款专为做虚拟主机研发的Web服务器,实现虚拟主机独立进程、独立身份运行;用户之间安全隔离,一个用户出现问题不影响其他用户;安全支持php、asp、asp.net、java、ruby等多种动态开发语言。

(3)WebSphere。WebSphere Application Server是一种功能完善、开放的Web服务器,是IBM电子商务计划的核心部分,它是基于Java的应用环境,用于建立、部署和管理Internet和Intranet Web。这一整套产品进行了扩展,以适应Web服务器的需要,范围从简单到高级直到企业级。

WebSphere针对以Web为中心的开发人员,他们都是在基本HTTP服务器和CGI编程技术上成长起来的。IBM将提供WebSphere产品系列,通过提供综合资源、可重复使用的组件、功能强大并易于使用的工具以及支持HTTP和IIOP通信的可伸缩运行时环境,来帮助这些用户从简单的Web应用程序转移到电子商务世界。

(4)WebLogic。BEA WebLogic Server是一种多功能、基于标准的Web服务器,为企业构建自己的应用提供了坚实的基础。各种应用开发、部署所有关键性的任务,无论是集成各种系统和数据库,还是提交服务、跨Internet协作,起始点都是BEA WebLogic Server。由于它具有全面的功能、对开放标准的遵从性、多层架构、支持基于组件的开发,基于Internet的企业都选择它来开发、部署最佳的应用。

BEA WebLogic Server在使应用服务器成为企业应用架构的基础方面继续处于领先地位。BEA WebLogic Server为构建集成化的企业级应用提供了稳固的基础,它们以Internet的容量和速度,在连网的企业之间共享信息、提交服务,实现协作自动化。

(5)Apache。Apache仍然是世界上用得最多的Web服务器,市场占有率达60%左右。它源于NCSAhttpd服务器,当NCSA WWW服务器项目停止后,那些使用NCSA WWW服务器的人们开始交换用于此服务器的补丁,这也是Apache名称的由来(pache补丁)。世界上很多著名的网站都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。

(6)Tomcat。Tomcat是一个开放源代码、运行Servlet和JSP Web应用软件的基于Java的Web应用软件容器。Tomcat Server是根据Servlet和JSP规范进行执行的,因此我们可以说Tomcat Server也实行了Apache-Jakarta规范且比绝大多数商业应用软件服务器要好。

Tomcat是Java Servlet 2.2和Java Server Pages 1.1技术的标准实现,是基于Apache许可证下开发的自由软件。Tomcat是完全重写的Servlet API 2.2和JSP 1.1兼容的Servlet/JSP容器。Tomcat使用了JServ的一些代码,特别是Apache服务适配器。随着Catalina Servlet引擎的出现,Tomcat第四版的性能得到提升,使得它成为一个值得考虑的Servlet/JSP容器,因此许多Web服务器都是采用Tomcat。

(7)Jboss。Jboss是一个基于J2EE的开放源代码的应用服务器。Jboss代码遵循LGPL许可,可以在任何商业应用中免费使用,而不用支付费用。Jboss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB 3.0的规范,但Jboss核心服务不包括支持Servlet/JSP的Web容器,一般与Tomcat或Jetty绑定使用。

Web服务器未来的发展趋势有以下3个方面。

(1)从HTML到XML。

标准通用标记语言的子集HTML被称为“第一代Web语言”,如前面的介绍,HTML作为Web的开发语言,对Web应用的发展起到了关键性的作用。但是HTML有一个致命的缺点:只适合于人与计算机的交流,不适合计算机与计算机的交流。HTML通过大量的标记来定义文档内容的表现方式,它仅仅描述了应如何在Web浏览器页面上布置文字、图形,并没有对Internet的信息含义本身进行描述,而信息又是Web应用中最重要的内容。通过HTML表现出来的文字、图形内容很容易被人理解,但不利于计算机程序去理解。另外,HTML的另一个问题是它的标记集合是固定的,用户不能根据自己的需要增加标记;而且各种浏览器的规格不尽相同,要使我们用HTML做的网页能够被所有浏览器正常显示,我们只能够使用W3C(万维网协会)规定的标记来创建网页。

正如前面所说,Web服务器向Web浏览器提供的信息都是来自有一定结构的数据库,在数据库里,为了检索和管理的方便,信息按照它本身的意义(如姓名、年龄、工作单位等)被存放在相应的字段里,一旦这些数据被调出来,经过CGI、ASP、JSP、PHP等转换成HTML后,其原来的意义无法转移到HTML标记中来,用户也就无法按照信息本来的意义去阅读。并且由于操作系统以及数据库的不同,不同的系统及应用层面之间要想互相理解对方的数据格式是相当困难的。这就需要一种新技术或标准能够将最初保存在数据库服务器中的原始数据结构在不同的系统层面共享。这种新技术就是XML。

使用XML可以解决上述难题。W3C对XML作了如下描述:“XML描述了一类被称为XML文档的数据对象,并部分描述了处理它们的计算机程序的行为。XML是标准通用标记语言的一个应用实例。从结构上说,XML文档遵从标准通用标记语言文档标准。”同HTML一样,XML也是一种基于文本的标记语言,都是从标准通用标记语言发展而来,二者的不同在于:XML可以让我们根据要表现的文档,自由地定义标记来表现具有实际意义的文档内容。例如,我们可以定义〈文档名称〉〈/文档名称〉这样具有实际意义的标记。而且XML不像HTML那样具有固定的标记集合,它实际上是一种定义语言的语言,也就是说使用XML的用户可以定义无穷的标记来描述文档中的任何数据元素,将文档的内容组织成丰富的完整的信息体系。总体来说,XML具有四大特点:便于存储的数据格式、可扩展性、高度结构化以及方便的网络传输,这些特点为我们创建开放、高效、可扩展、个性化的Web应用提供了一个崭新的起点。

(2)从有线到无线。

电子商务正在从台式机向着更为广泛的无线设备发展,Cahners In-Stat市场分析家预测,世界范围内的无线用户的人数近年来将会大幅度的增加。Aberdeen集团的研究主任Darcy Fowkes认为,采用无线方式进行电子商务的优势并不仅仅在于方便,它还可以节约公司的财力,而且移动办公能使工作更加高效。

然而,由于多种无线网络类型、标记语言、协议和无线设备并存的复杂情况,使得网络内容和数据转换成能够被无线设备识别的格式并不容易。许多企业都在致力于开发能够把应用程序以及互联网内容扩展到无线设备上的产品。

例如,IBM新版本的WebSphere Transcoding Publisher 3.5增加和改进了许多新的特性,可以将企业内部网上的数据翻译到多种无线设备上。该版本中新的特性包括对更多的无线设备、数据格式的支持,以及语言翻译功能。它基于Java架构,能把用HTML和XML等标记语言编写的应用程序和数据转换成WML、HDML(Handheld Device Markup Language)和iMode等无线设备所能识别的格式,这样,通过手持设备就可以访问互联网上的信息。

无线设备厂商Mobilize也推出了Mobilize Commerce产品,帮助企业进入无线网络。该软件可以通过无线连接的方式访问企业的内部系统,远程地实现订单发送,并进行确认。Mobilize Commerce可以充分利用XML对信息进行格式转换,以适合于无线设备,这些无线设备包括笔记本电脑、个人数字助理、无线电话、网络电话和双向寻呼等。

(3)从无声到有声。

世界上有10亿个电话终端,有超过2亿个的移动电话,而就人自身的交流习惯来看,人们也更愿意利用听和说的方式进行交流。

文本语音转换器(TTS, Text to Speech)的研究工作已经取得了很大的进步,实现了自动的语言分析理解,并允许TTS的使用者增加更多的韵律、音调在讲话中,使TTS系统的发声更接近人声。在自动语音识别系统(ASR)领域里,自动语音识别系统在从整个词的模仿匹配,向音素层次的识别系统方向发展。自动语音识别系统的词汇表由一个基于声音片断的字母表构成,而且这种词汇表是受不同语言限制的。基于这种方式,在一个宽广的声音行列里,讲话能被识别系统发现和挑拣出来,并加以识别。并且在识别一个词的时候,每一个音素将从系统的输入中被挑拣出来,拼接组合后与已经有的音素和词语模板进行比较,来产生需要的模板。音素的识别大大减轻了ASR对讲话者的依赖性,并且使它非常容易去建立大型的和容易修改的语音识别字典,从而满足不同应用市场的需求。

Web语音发展的另一方面是语音可扩展标记语言(Voice eXtensible Markup Language, Voice XML)的进展。VoiceXML的主要目标是要将Web上已有的大量应用、丰富的内容,让交互式语音界面也能够全部享受。Web服务器处理一个来自客户端应用的请求,这一请求经过了VoiceXML解释程序语境处理,作为响应,服务器产生出VoiceXML文件,在回复当中,要经过VoiceXML解释程序的处理。VoiceXML 1.0规范基于XML,为语音和电话应用的开发者、服务提供商和设备制造商提供了一个智能化的API。VoiceXML的标准化将简化Web上具有语音响应服务的个性化界面的创建,使人们能够通过语音和电话访问网站上的信息和服务,像今天通过CGI脚本一样检索中心数据库,访问企业内部网,制造新的语音访问设备。VoiceXML的执行平台上面加载了相应的软件和硬件,如ASR、TTS,从而实现语音的识别以及文本和语音之间的转化。

2.2.2 Web客户端功能

Web客户端,显然就是指浏览器(Browser)端。任何应用系统都必须有一个供用户操作的界面,即用户界面。浏览器的工作,从整个B/S程序来看,是用户与整个B/S程序打交道的一个界面(接口),即人机界面(接口)、用户界面。它的任务如下。

(1)收集用户输入的数据(如用户数据:http://211.64.32.2/dsks/index.php)。

(2)将用户数据发送到服务器(向服务器请求该用户对服务器的请求)。

(3)接收服务器返回的响应(用浏览器能认识和执行的代码即客户端代码表示,如HTML代码、JavaScript代码等)。

(4)解释、执行这些代码,将结果显示在浏览器窗口中。

可见,浏览器扮演的是(多数情况下是远程的)服务器在用户那里的一个代理(Agent)的角色。这个代理,具有收集消息、请求响应和解释其领导(服务器)发回的指示的作用。

无论是组织用于收集用户数据的界面,还是解释来自服务器的指示形成结果界面,都是用Web客户端代码表示的。常用的Web客户端代码使用HTML语言或JavaScript语言编写,分别称为HTML代码或JavaScript代码。另外,还有CSS、XML等语言。

1.HTML超文本标记语言

超文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准。它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览器如何显示其中的内容(如文字如何处理、画面如何安排、图片如何显示等)。浏览器按顺序阅读网页文件,然后根据标记符解释和显示其标记的内容,对书写出错的标记将不指出其错误,且不停止其解释执行过程,编制者只能通过显示效果来分析出错原因和出错部位。但需要注意的是,对于不同的浏览器,对同一标记符可能会有不完全相同的解释,因而可能会有不同的显示效果。

图2-5为HTML编辑工具——Dreamweaver。

图2-5 HTML编辑工具——Dreamweaver

超文本标记语言文档制作不是很复杂,但功能强大,支持不同数据格式的文件镶入,这也是万维网(WWW)盛行的原因之一。其主要特点如下。

(1)简易性。超文本标记语言版本升级采用超集方式,从而更加灵活方便。

(2)可扩展性。超文本标记语言的广泛应用带来了加强功能、增加标识符等要求,超文本标记语言采取子类元素的方式,为系统扩展带来保证。

(3)平台无关性。虽然个人计算机大行其道,但使用MAC等其他机器的大有人在,超文本标记语言可以使用在广泛的平台上,这也是万维网(WWW)盛行的另一个原因。

(4)通用性。HTML是网络的通用语言,一种简单、通用的全置标记语言。它允许网页制作人建立文本与图片相结合的复杂页面,这些页面可以被网上任何其他人浏览到,无论使用的是什么类型的电脑或浏览器。

下面为HTML代码格式。

<HTML>
        <HEAD>
            <TITLE>这里写网页的标题</TITLE>
        </HEAD>
        <BODY>
            这里是网页的主体(显示在浏览器窗口中的部分)
        </BODY>
    </HTML>

2.CSS层叠样式表

层叠样式表是一种用来表现HTML或XML等文件样式的计算机语言。

CSS目前最新版本为CSS3,是能够真正做到网页表现与内容分离的一种样式设计语言。相对于传统HTML的表现而言,CSS能够对网页中的对象的位置排版进行像素级的精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力,并能够进行初步交互设计,是目前基于文本展示最优秀的表现设计语言。CSS能够根据不同使用者的理解能力,简化或者优化写法,针对各类人群,有较强的易读性。

有3种方法可以在站点网页上使用样式表。

(1)外联式Linking(也叫外部样式):将网页链接到外部样式表。

当样式需要被应用到很多页面时,外部样式表将是理想的选择。使用外部样式表,你就可以通过更改一个文件来改变整个站点的外观。

<head>
<link rel="stylesheet" type="text/css" href="mystyle.css">
</head>

(2)嵌入式Embedding(也叫内页样式):在网页上创建嵌入的样式表。

当单个文件需要特别样式时,就可以使用内部样式表。你可以在head部分通过<style>标签定义内部样式表。

<head>
    <style type="text/css">
    body {background-color: red}
    p {margin-left: 20px}</style>
    </head>(3)内联式Inline(也叫行内样式):应用内嵌样式到各个网页元素。

当特殊的样式需要应用到个别元素时,就可以使用内联样式。使用内联样式的方法是在相关的标签中使用样式属性。样式属性可以包含任何CSS属性。以下实例显示出如何改变段落的颜色和左外边距。

<p style="color: red; margin-left: 20px">
    This is a paragraph
    </p>

3.JavaScript脚本语言

JavaScript是一种直译式脚本语言,一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,被广泛用于客户端的脚本语言,最早是在HTML网页上使用,用来给HTML网页增加动态功能。JavaScript的组成成分如图2-6所示。

图2-6 JavaScript的组成成分

JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的,其特点如下。

(1)是一种解释性脚本语言(代码不进行预编译)。

(2)主要用来向HTML页面添加交互行为。

(3)可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。

(4)跨平台特性。在绝大多数浏览器的支持下,可以在多种平台下运行(如Windows、Linux、Mac、Android、iOS等)。

JavaScript脚本语言同其他语言一样,有它自身的基本数据类型、表达式和算术运算符及程序的基本程序框架。JavaScript提供了4种基本的数据类型和2种特殊数据类型用来处理数据和文字。而变量提供存放信息的地方,表达式则可以完成较复杂的信息处理。

JavaScript是一种脚本语言,其源代码在发往客户端运行之前不需经过编译,而是将文本格式的字符代码发送给浏览器,由浏览器解释运行。直译语言的弱点是安全性较差,而且在JavaScript中,如果一条运行不了,那么下面的语言也无法运行。其解决办法就是使用try{}catch(){}。

console.log("a"); //这是正确的
    console.log("b"); //这是正确的
    console.logg("c"); //这是错误的,并且到这里会停下来
    console.log("d"); //这是正确的
    console.log("e"); //这是正确的
    /*解决办法*/
    try{console.log("a"); }catch(e){}//这是正确的
    try{console.log("b"); }catch(e){}//这是正确的
    try{console.logg("c"); }catch(e){}//这是错误的,但是到这里不会停下来,
  而是跳过
    try{console.log("d"); }catch(e){}//这是正确的
    try{console.log("e"); }catch(e){}//这是正确的

JavaScript被归类为直译语言,因为主流的引擎都是每次运行时加载代码并解译。V8引擎是将所有代码解译后再开始运行,其他引擎则是逐行解译(SpiderMonkey会将解译过的指令暂存,以提高性能,称为实时编译),但由于V8的核心部分多数用JavaScript撰写(而SpiderMonkey是用C++编写的),因此在不同的测试上,两者性能互有优劣。与其相对应的是编译语言,如C语言,以编译语言编写的程序在运行之前,必须经过编译,将代码编译为机器码,再加以运行。

2.2.3 会话与状态

Web应用中的会话是指一个客户端浏览器与Web服务器之间连续发生的一系列请求和响应过程。

Web应用的会话状态是指Web服务器与浏览器在会话过程中产生的状态信息,借助会话状态,Web服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。

为实现各种有用的功能,应用程序需要追踪每位用户通过不同的请求与应用程序交互的状态。那么如何实现有状态的会话?

(1)会话ID可以通过一种称之为Cookies的技术在请求消息中进行传递,也可以作为请求URL的附加参数进行传递。会话ID是Web服务器为每一个客户端浏览器分配的一个唯一代号,它通常是在Web服务器接收到某个浏览器的第一次访问时产生,并且随同响应消息一道发送给浏览器。

(2)会话过程由Web服务器端的程序开启,一旦开启了一个会话,服务器端程序就要为这个会话创建一个独立的存储结构来保存该会话的状态信息,同一个会话中的访问请求都可以且只能访问属于该会话的存储结构中的状态信息。