您好,欢迎访问三七文档
Web编程安全第8章1Web概述1.1Web系统Web是目前比较流行的软件编程方法之一,也是B/S模式的一种实现方式,由于Web编程的方法和传统C/S程序的不相同,因此,Web编程中的安全问题也具有其特殊性。本讲主要针对Web编程中的一些安全问题进行讲解。首先讲解了Web运行的原理,然后讲解了URL操作攻击,接下来针对Web程序的特性,讲解了四种页面之间传递状态的技术,并比较了它们的安全性,最后针对两种常见的安全问题:跨站脚本和SQL注入进行了详细叙述。应该指出的是,本讲所列举的并不是Web编程安全的全部内容,只是讲述了一些常见的安全问题。Web运行的原理Web程序在架构上属于B/S(浏览器/服务器)模式。随着Internet技术的兴起,B/S结构成为对C/S结构的一种改进。这种结构有如下特点:程序完全放在应用服务器上,并在应用服务器上运行,通过应用服务器同数据库服务器进行通信;客户机上无需安装任何客户端软件,系统界面通过客户端浏览器展现,客户端只需要在浏览器内输入URL;修改了应用系统,只需要维护应用服务器。由于B/S结构的优点,现在的网络应用系统中,B/S系统占绝对主流地位。了解了什么是Web程序,我们再来深入了解一下Web技术的相关特点。在Web程序结构中,浏览器端与应用服务器端采用请求/响应模式进行交互,如图所示。过程描述如下:1:客户端(通常是浏览器,如IE、Firefox等)接受用户的输入,如用户名、密码、查询字符串等;2:客户端向应用服务器发送请求:输入之后,提交,客户端把请求信息(包含表单中的输入以及其他请求等信息)发送到应用服务器端,客户端等待服务器端的响应;3:数据处理:应用服务器端使用某种脚本语言,来访问数据库,查询数据,并获得查询结果;4:数据库向应用服务器中的程序返回结果;5:发送响应:应用服务器端向客户端发送响应信息(一般是动态生成的HTML页面);6:显示:由用户的浏览器解释HTML代码,呈现用户界面。1.2Web编程可以说,不同的Web编程语言都对应着不同的Web编程方式,目前常见的应用于Web的编程语言主要有以下几种:1:CGI(CommonGatewayInterface)。CGI全称是“公共网关接口”,其程序须运行在服务器端。该技术可以用来解释处理来自Web客户端的输入信息,并在服务器进行相应的处理,最后将相应的结果反馈给浏览器。CGI技术体系的核心是CGI程序,负责处理客户端的请求。早期有很多Web程序用CGI编写,但是由于其性能较低(如对多用户的请求采用多进程机制)和编程复杂,目前使用较少。2:PHP(PHP:HypertextPreprocessor)。PHP是一种可嵌入HTML、可在服务器端执行的内嵌式脚本语言,语言的风格比较类似于C语言,使用范围比较广泛。其语法混合了C、Java、Perl,比CGI或者Perl能够更快速地执行动态网页。PHP执行效率比CGI要高许多;另外,它支持几乎所有流行的数据库以及操作系统。3:JSP(JavaServerPages)。JSP是由Sun公司提出,其他许多公司一起参与建立的一种动态网页技术标准。JSP技术在传统的网页HTML文件(*.htm,*.html)中嵌入Java程序段(Scriptlet)、Java表达式(Expression)或者JSP标记(tag),从而形成JSP文件(*.jsp),在服务器端运行。和PHP一样,JSP开发的Web应用也是跨平台的,另外,JSP还支持自定义标签。JSP具备了Java技术面向对象,平台无关性且安全可靠的优点,值得一提的是,众多大公司都支持JSP技术的服务器,如IBM、Oracle公司等,使得JSP在商业应用的开发方面成为一种流行的语言。4:ASP(ActiveServerPage)ASP,意为“动态服务器页面”,是微软公司开发的一种编程规范,最初目的是代替CGI脚本,可以运行于服务器端,与数据库和其它程序进行交互,可以包含HTML标记、文本、脚本以及COM组件等。由于其编写简便,快速开发支持较好,在中小型Web应用中,比较流行。5:JavaScriptJavaScript是一种基于对象和事件驱动的脚本语言,主要运行于客户端。JavaScript编写的程序在运行前不必编译,客户端浏览器可以直接来解释执行JavaScript。一般情况下,一些不用和服务器打交道的交互(如账号是否为空),就可以直接在客户端进行,给用户提供了一个较好的体验,减轻了服务器的负担。2避免URL操作攻击2.1URL的概念及其工作原理Web上有很多资源,如HTML文档、图像、视频、程序等,在访问时,它们的具体位置怎样确定呢?通常是利用URL。URL(UniformResoureLocator:统一资源定位器),是Internet上用来描述信息资源的字符串,可以帮助计算机来定位这些Web上可用资源。以下是一个典型的URL例子:可以看出,URI一般由3把部分组成:访问资源的命名机制(协议):http,实际上还有可能是ftp等;存放资源的主机名:localhost:8080;资源自身的名称,由路径表示:/Prj08/index.jsp;其他信息,如查询字符串等:?username=guokehua。=guokehua另外有一个概念,叫做统一资源标识(UniformResourceIdentifier,URI)。在网络领域,熟悉URL概念的人比熟悉URI的要多,实际上,URL是URI命名机制的一个子集。另外还有一个概念是URN(UniformResourceName,统一资源名称):也用来标识Internet上的资源,但是通过使用一个独立于位置的名称来实现。URN也是URI的一个子集。三者关系如下:2.2URL操作攻击URL操作攻击的原理,一般是通过URL来猜测某些资源的存放地址,从而非法访问受保护的资源。举一个例子,假如有一个教学管理系统,教师输入自己的账号、密码,可以看到他所教的班级的学生信息。系统中有一个学生表:还有一个教师表:系统流程如下:1:首先呈现给教师的是登录页面,如:,该页面代码中,首先显示一个表单:该表单将用户的账号和密码提交给一个控制器,控制器访问数据库,如果通过验证,则将用户信息存放在session内,跳到welcome页面。2:登录成功后,教师会看到下图所示的welcome界面,:该页面中,首先从session中获取登陆用户名,然后结合两个表进行查询,得到班级学生姓名,在列表中,显示了该教师所在班级的学生;后面的链接负责将该学生的学号传给display.jsp。3:用户点击“王海”后面的“查看”链接,到达页面:=0035,显示效果如下:该页面主要是根据传过来的值查询数据库中的学生表。将信息显示。表面上看上去,该程序没有任何问题。注意,前面的步骤中,点击“王海”右边的“查看”链接时,用于学生“王海”从数据库获取数据的URL为:=0035因为王海的学号为0035,所以,从客户端源代码上讲,“王海”右边的“查看”链接看起来是这样的:该URL非常直观,可以从中看到是获取stuno为0035的数据,因此,给了攻击者机会,你可以很容易尝试将如下URL输入到地址栏中:表示命令数据库查询学号为0001的学生信息,当然,可能刚开始的尝试或许得不到结果(该学号可能不存在),但是经过足够次数的尝试,总可以给攻击者得到结果的机会。如输入:=0001ahref==0035查看/a=0024得到的内容为:因为“江民”的学号就是“0024”,所以“江民”的信息就显示了出来。这里就造成了一个不安全的现象:老师可以查询不是他班级上的学生的信息。更有甚者,如果网站足够不安全的话,攻击者可以不用登陆,直接输入上面格式的URL(如=0024),将信息显示出来。这样编写导致该学校网站为URL操作攻击敞开了大门。2.3解决方法如何解决以上URL操作攻击?程序员在编写Web应用的时候,可以从以下方面加以注意:1:为了避免非登陆用户进行访问,对于每一个只有登录成功才能访问的页面,应该进行session的检查(session检查的内容在后面提到);2:为限制用户访问未被授权的资源,可在查询时将登录用户的用户名也考虑进去。如王海的学号为0035,所以王海右边的“查看”链接可以设计为这样:这样,用于学生王海从数据库获取数据的URL为:在向数据库查询时,就可以首先检查“guokehua”是否在登录状态,然后根据学号(0035)和教师用户名(guokehua)综合进行查询。这样,攻击者单独输入学号,或者输入学号和未登录的用户名,都无法显示结果。ahref==0035&username=guokehua查看/a=0035&username=guokehua3页面状态值安全我们知道,HTTP是无状态的协议。Web页面本身无法向下一个页面传递信息,如果需要让下一个页面得知该页面中的值,除非通过服务器。因此,Web页面保持状态并传递给其他页面,是一个重要技术。Web页面之间传递数据,是Web程序的重要功能,其流程如图8-3所示:其过程如下:页面1中输入数据“guokehua”,提交给服务器端的P2;P2获取数据,响应给客户端。问题的关键在于页面1中的数据如何提交,页面2中的数据如何获得。举一个简单的案例:页面1中定义了一个数值变量,并通过计算,将其平方的值显示在界面上;同时页面1中有一个链接到页面2,要求点击链接,在页面2中显示该数字的立方。很明显,该应用中,页面2必须知道页面1中定义的那个变量。在HTTP协议中一共有4种方法来完成这件事情:URL传值;表单传值;Cookie方法;session方法。这四种方法各有特点,各有安全性,本节将对其进行分析。3.1URL传值以上面举的例子为例,可以将页面1中的变量通过URL方法传给页面2,格式为:如上例子,可以写成:urlP1.jsp运行,效果如下:页面2路径?参数名1=参数值1&参数名2=参数值2&……页面底部显示了一个链接:到达urlP2,其链接内容为:相当于提交到服务器的urlP2.jsp,并给其一个参数number,值为12。此处urlP2代码为:urlP2.jsp点击urlP1.jsp中的链接,到达urlP2.jsp,效果如下:这说明,可以顺利实现值的传递。=12该方法有如下问题:1:传输的数据只能是字符串,对数据类型具有一定限制;2:传输数据的值会在浏览器地址栏里面被看到。如上例子,当点击了链接到达urlP2.jsp,浏览器地址栏上的地址变为:number的值可以被人看到。从保密的角度讲,这是不安全的。特别是秘密性要求很严格的数据(如密码),不应该用URL方法来传值。但是,URL方法并不
本文标题:08Web编程安全
链接地址:https://www.777doc.com/doc-1245078 .html