周端锋
(湖南第一师范学院 网络信息中心,湖南 长沙 410205)
在Web系统中,用户的表单输入以及URL地址、参数是web程序与用户交互的重要方式,web程序通过用户输入的信息进行运算操作,但往往有一些恶意用户输入一些程序设计者未曾预料的信息,其中一些恶意的输入会给其他浏览者或数据库甚至是应用程序的安全带来威胁,因此了解用户输入中的不安全因素及对应策略对于整个Web系统来说至关重要。
客户端验证是验证用户输入数据合法性的常用方式之一,通过客户端验证用户表输入的数据和用户浏览器地址栏输入的URL参数等。一般使用JavaScript编写脚本结合正则表达式的验证规则去验证用户的输入是否合法。例如在Web系统中验证用户输入的电子邮件格式通常使用如下的验证方法:
{if(obj.length>0&&!obj.match(/^.+@.+$/))
{alert("EMAIL错误!请重新输入");return false;}}
很多程序设计者以为在使用了客户端验证后,应用程序接受的是验证后的信息,后面在处理这些信息时就可以高枕无忧了。
很显然,这种客户端的验证是浏览器进行验证的,而浏览器是完全在用户的控制之中,如用户可以禁止浏览器执行JavaScript等脚本或使用某种特定的浏览器,在客户端的验证就只是一个摆设罢了。由此看来用户的输入让用户自己去控制的浏览器去验证存在很大的安全问题。恶意用户绕过客户端验证的过程如图1所示。
图1:输入经过客户端验证过程
客户端验证存在的问题的解决方案是将所有用户输入进行服务器端的验证,这样增加了服务器的运算工作量,但近几年服务器运算的速度突飞猛进,验证一些用户输入对于服务器的运算速度来说可以忽略不计;Ajax技术为我们提供了即时输入的服务器端验证的方法,可以为用户带来更好的体验。
跨站脚本攻击(XSS,Cross-Site Scripting)是 Web系统中常见的攻击方式之一,XSS是在远程Web页面的HTML代码中插入具有恶意目的的数据,当浏览器下载该页面时嵌入其中的脚本将被解释执行[1]。XSS将一些恶意信息存放在WEB服务器中,其它浏览此WEB程序的用户成为最终的攻击的受害者。
XSS攻击涉及攻击者(恶意用户)、存在漏洞的Web应用程序和受害者三个方面。在这三方中,作为载体的Web应用程序一般不会受到影响,而实际运行有害代码的是运行程序的受害者,XSS攻击可能会窃取受害者的个人信息甚至发送未经用户授权的请求。XSS攻击的一般步骤如图2所示。
图2:XSS攻击的一般步骤
XSS攻击产生于Web程序和用户交互过程中,因此防范此类攻击要Web程序设计人员对Web程序中对用户输入的字符串进行分析处理。
很多Web程序在有户提交信息时进行特征匹配检查,采用的特征匹配方法一般会需要对“JavaScript”等关键字进行检索,如果有相关关键字就可以认定为XSS攻击,并把敏感关键字转化为其它的字符,这种检测方法的缺陷显而易见:恶意用户可以通过插入字符或完全编码的方式躲避检测。
XSS攻击也是利用了Web页面的编写疏忽,可以从Web应用程序开发的角度来设计XSS对应策略。在用户提交数据之前对内容进行全面的验证,包括POST数据、HTTP头、URL参数,并检查字符串的长度、格式的合法性,合法的字符串可以提交、拒绝其它的字符串;实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被其它网站所执行;确认接收的内容规范化,其中有最小的、安全的标记(没有javascript),特别要注意远程的引用(包括CSS等),使用HTTP only的 cookie。
SQL注入是一种脚本注入式攻击,恶意用户输入用来影响被执行的SQL脚本[2]。SQL注入利用通常使用可以透过防火墙的HTTP服务的80端口,和HTTP服务相同端口有隐蔽性极强不易被发现的特点。只要是利用SQL语法的Web应用程序如果未对输入SQL语句做严格的处理都会存在SQL注入漏洞[3]。恶意用户通过表单等形式向数据库提交一段较特殊的SQL语句,绕过程序权限检测获取权限或增删数据,对Web程序数据形成极大的破坏。
经常使用的用户名和密码验证方式中要求用户输入有效的用户名与密码才能通过验证,如下面一段代码使用Asp和VBScript验证用户登陆中就存在漏洞,不法者可以使用SQL注入而无需了解用户密码。
不法用户在使用登陆对话框时,在用户名文本框中输入admin’or‘1=1再随意输入密码可以实现成功登陆。很显然,不法用户使用逻辑运算中的and与or的运算次序以及无论true/false和 true进行or运算后结果都为true,这就能够让rs记录集中存在他想要的记录,成功地非法登陆Web系统的后台。
在数据库中使用存储过程能够很好地杜绝SQL注入攻击,例如在使用用户登陆验证中使用如下存储过程(PL/SQL):
无论用户输入什么数据,数据库使用存储过程查询时都把用户输入的数据看作相关参数,不存在被注入的安全问题。
但一些微型数据库不支持存储过程,此时可以使用Web程序中的参数查询,在Web程序中指定用户输入为特定的参数,可以很好地杜绝SQL注入。如使用如下程序(C#):
在WEB文件夹中的存在一些资源可能被用户下载到本地电脑中,这种下载严重危害WEB程序及数据的安全。如在ASP+Access编写的WEB程序中,用户可以下载Access数据库文件,很多程序员使用改变文件名的方式防止用户下载,但这种做法无法彻底防止下载,使用ODBC数据源可以彻底解决数据库文件被下载的安全问题。
Web程序允许用户上传图片和一些常见类型的附件,在这些附件中存在不安全因素,可以对附件进行类型的过滤,如用户将用户上传的文件类型进行了限制。最近发现的图片木马利用微软IIS的安全漏洞进行攻击,该漏洞的涉及面非常广、危害极大。对付这类安全漏洞可以尽快为操作系统打上安全补丁,也可以针对用户上传附件然后执行附件的方式将用户上传附件的目录不允许执行脚本。
在WEB系统中使用URL地址中附加参数,WEB服务器根据URL地址和URL参数找到相应的资源并执行相关的操作,通常这些URL地址及参数直接显示在浏览器的地址栏中,用户可以看到这些URL并且可以随意修改。即使经过URL重写后,以“路径”形式出现的URL参数,实质上仍是一种Web攻击入口点[4]。例如:http://www.abc.com/delete.aspx?id=50,用户可以很容易地分析出当前的操作是删除id为50的记录,恶意修改id=50的参数可能删除其它内容。
很显然,此时的URL参数中存在有安全问题,URL加密可以很好地解决此类安全隐患。除了使用URLEncode和URLDecode外,还可以用HMAC消息认证机制[5],也自定义可逆加密算法。例如使用C#定义一个自定义可逆加密算法:
使用此加密/解密算算法可以很简单地实现URL参数加密。使用用户自定义加密算法,非法操作用户修改URL参数无法正常解密到需要操作的值,可以很好地保护WEB程序及数据的安全。
(注:本文系湖南第一师范学院科研课题资助项目,项目编号:XYS10N08)
[1]王辉,陈晓平,林邓伟.计算机工程与设计[J].2004,(8).
[2]SQL Server安全回顾[EB/OL].http://www.microsoft.com/china/ctc/Newsletter/04/ctc2.htm.
[3]陈小兵,张汉煜.SQL注入攻击及其防范检测技术研究[J].计算机工程与应用,2007-11.
[4]陆余良,郭浩.Web安全测试中URL参数重写检测框架[J].计算机工程,2010-12.
[5]王红霞.基于HMAC-SHA1算法的消息认证机制[J].山西师范大学学报(自然科学版),2005-03.