基于参数查询防止SQL注入攻击的方法
2012-01-12隋励丽张恒博
隋励丽,张恒博
(大连民族学院计算机科学与工程学院,辽宁大连 116605)
基于参数查询防止SQL注入攻击的方法
隋励丽,张恒博
(大连民族学院计算机科学与工程学院,辽宁大连 116605)
本文分析了SQL注入攻击的原理和攻击步骤的方法,针对ASP网站重点分析了SQL注入攻击的实现原理、实现过程,并且针对性地提出了利用参数查询有效预防SQL注入攻击的策略实现。该策略包括检查用户输入、使用类型安全的SQL参数、使用存储过程、进行数据加密以及进行安全部署等,能很好地加强ASP网站应用程序的安全性,可有效防范绝大多数针对网站本身SQL注入式攻击。
SQL;SQL注入攻击;参数查询;ADO
随着互联网的发展,大量的web网站开始涌现,极大地方便了人们的信息获取需求。与此同时,黑客针对网站的攻击也屡屡出现,造成了或多或少的经济损失。在这些攻击中,SQL注入攻击是黑客最常用手段之一。由于SQL数据库的广泛使用,以及web程序、web服务器和数据库服务器等的一些常见的漏洞,导致了SQL注入的普遍性与巨大危害性。因此,研究SQL注入攻击及其应对方案对保障网站安全具有重要意义[1-6]。本文结合示例介绍SQL注入式攻击行为以及如何对该类型的攻击进行有效防范。
1 SQL注入攻击
SQL注入攻击源于英文“SQL Injection Attack”,以下简称SIA。目前对SQL注入技术还没有标准的定义,常见的是对这种攻击形式、特点的描述。所谓SQL注入攻击,就是利用SQL注入技术来实施的网络攻击。在基于SQL Server服务器的Web应用程序中,因为开发周期和程序员水平差异等因素的影响,许多该类型的应用程序在设计与开发时没有充分考虑到数据合法性校验问题,对SQL语句传入的参数没有做出严格的检查和处理,使其在应用中存在安全隐患。通常将存在SQL注入点的程序或者网站称为SQL注入漏洞,即SQL注入是在有数据库连接的Web应用程序中出现的一种漏洞,在这类应用程序中允许用户输入查询条件,攻击者将查询条件嵌入到SQL查询语句中,利用SQL语法构造出畸形的SQL语句,发送到与该应用程序相关联的数据库服务器中去执行,导致攻击者能够欺骗数据库服务器执行非授权的任意查询,根据程序查询返回的结果,攻击者可以获取他想得到的信息,比如数据库服务器管理员的账号和密码。
大多数程序都会或多或少地使用SQL语句和数据库打交道。在程序代码中,SQL语句以字符串的形式存在,如:
这个例子以数据列column1、column2的值分别为value1、value2作为过滤条件,从数据表table1中查询column1、column2等数据列。其中column1为整数类型,column2为字符串类型。很多时候,value1与value2的值在程序运行时才能确定,这意味着SQL语句只能在程序运行中动态生成。不少开发人员喜欢采用字符串拼凑的方式生成SQL语句,形如
这种生成SQL语句的方式存在安全隐患,很容易导致SQL注入式攻击。又以上面的SQL语句为例,如果攻击者为column2指定的值为“’OR‘’=‘”(不包含双引号),则得到的SQL语句为
OR‘’=‘’,使WHERE子句形同虚设,table1中所有的记录都会查询出来。如果攻击者更缺德一点,为column2指定的值为“’;DELETE FROM table1WHERE‘’=‘”(不包含双引号),则得到的SQL语句为
执行之后,数据表table1就被清空了[1]。
2 SQL注入的防御策略
以上的问题都可以通过参数化查询解决。上面的SQL语句如果采用参数化查询的方式,则表示为:
其中两个问号(?)是待定的数据列的值。在有些开发平台,问号的地方可能用有指定标记的命名参数代替,如:
不管是问号还是命名参数,咋一看都似乎与字符串格式化差不多。不过,在参数化查询中,程序直接把这个包含待定值的SQL语句提交给数据库,由数据库引擎为之生成查询计划,之后,程序以参数的方式提供这些值。数据库引擎把参数中的值应用到查询计划中,然后执行查询结果。如果改变参数的值后再执行,则得到不同的查询结果,但SQL语句不需要重新提交,查询计划也不需要重新生成,参数的修改对查询计划没有影响[3]。
哪怕参数中包含精心设计的特殊字符,也不会形成SQL注入式攻击。参数改变的次数越多,则查询计划的重用性越高。与程序设计语言中的函数或过程类似,SQL语句的参数也可以分为输入参数、输出参数及输入输出参数,其中输入参数最为常见,上面的查询例子中的两个参数都是输入参数。参数的类型可以是整数、浮点数、字符串乃至二进制数据,采用参数化查询,可以很方便地导入二进制数据。
3 SQL注入防御策略的实现
参数化查询得到各种主流编程语言和开发工具的广泛支持。下面分别介绍ADO这3种数据访问模型中的参数化查询方式。
3.1 ADO中的参数化查询
在ADO中,查询的一般过程是创建Connection对象连接数据库,再创建Command对象执行SQL语句或存储过程。如果SQL语句有返回数据,则用游标方式遍历Recordset中的每一行,读取查询结果。在一般场合,Command对象可以省略,其只能由Connection对象和Recordset对象代替。不过如果采用参数化查询,则少不了Com-mand对象。该对象创建后,先指定SQL语句,然后创建SQL语句中待定的各个参数,给参数赋值后再执行Command对象。
待定的参数用Parameter对象代表。在Parameter对象中,Name属性可设置或返回参数名称,Value属性可设置或返回参数值,Direction属性指示是输入参数、输出参数还是输入输出参数,Type属性定义参数的数据类型,其他几个属性可设置或返回参数特性。
Command对象有一个Parameters属性,它是Parameters集合类型,其中包含SQL语句(或存储过程)的所有参数。在Parameters集合中,可以通过名称或序号访问各个参数。通常用Command对象的CreateParameter方法创建每个Parameter对象,再用Parameters集合的Append方法添加进来。Command对象还有一个布尔类型的Prepared属性,该属性如果为True,则表示该指令在第一次执行之前必须保存查询语句[2]。
3.2 ASP防御SQL注入举例
为了使大家对ADO中的参数化查询有更清晰的认识,这里举一个例子。在这个例子中,在login.htm网页上输入账号和密码后,提交执行op.asp访问Access数据库。数据库路径为d:siatest.mdb,里面的数据表usertable包含两个数据列,其中username,password都为文本类型。
Login.htm中输入账号文本框名称为UID,输入密码文本框名称为PWD,form表单的action属性值为”op.asp”
Op.asp的代码如下:
以上程序,如果把CommandText的值改为:" select*from usertable where username="&uid&"and password="&pwd&";",当账号输入1 or‘1’=1,密码输入任何值都能通过。而本程序账号输入1 or‘1’=1,密码输入任何值都不能通过,只有账号和密码都正确,才能通过。由此可见本方法有效防止了SQL注入攻击。
4 结语
本文针对ASP网站,重点介绍SQL注入攻击的实现原理、实现过程、防御策略及防御策略实现,这些策略包括:检查用户输入、使用类型安全的SQL参数、使用存储过程、进行数据加密以及进行安全部署等。全部使用这些策略能很好地加强ASP网站应用程序的安全性,可有效防范绝大多数针对网站本身SQL注入式攻击。当然,网络环境的安全性和系统平台的安全性也不容忽视,只有各个环节的安全性得到强化,才能最大限度保障安全。
[1]王志虎.SQL注入攻击及其预防方法研究[J].煤炭技术,2011(1):95-97.
[2]佟利亭.Asp中利用参数对象实现参数查询[J].福建电脑,2009(5):178.
[3]王小鉴.SQL参数化查询详解[J].电脑编程技巧与维护,2011(1):42-48.
[4]高洪涛.SQL注入攻击途径及策略分析[J].网络安全技术与应用,2011(3):14-16.
[5]吴国标.SQL注入攻击原理与防范[J].绍兴文理学院学报:自然科学版,2010(4):64-68.
[6]李婷.ASP.NET网站中SQL注入攻击及防范[J].科技资讯,2010(34):23.
A Method to Defend against SQL Injection Attack Based on Parameter Query
SUI Li-li,ZHANG Heng-bo
(School of Computer Science&Engineering,Dalian Nationalities University,Dalian Liaoning 116605,China)
This paper describes the principle and the methods of SQL injection attacks.And the paper puts the emphasis on the implementation methods and procedures of SQL injection attacks to the ASP website.The strategies are proposed to defend SQL injection attacks effectively by using the parameter query methods,which include checking user input,using type-safe SQL parameters,using stored procedures and so on.And the data encrypting and security deployment are used as well.The methods proposed in this paper can reinforce the security of the ASP web application,and can effectively prevent the website from the most of SQL injection attacks.
SQL;SIA;parameter query;ADO
TP393.08
A
1009-315X(2012)05-0495-03
2011-11-07;最后
2012-02-10
隋励丽(1972-),女,辽宁营口人,讲师,主要从事计算机应用技术研究。
(责任编辑 刘敏)