一种构造sql语句的方法及装置的制作方法

文档序号:6468672阅读:174来源:国知局

专利名称::一种构造sql语句的方法及装置的制作方法
技术领域
:本发明涉及软件
技术领域
,特别是指一种构造结构化查询语言(SQL,StructureQueryLanguage)语句的方法及装置。
背景技术
:结构-f匕查询i吾言(SQL,StructureQueryLanguage)是一种面向凄t才居库的通用数据处理语言规范。SQL注入攻击是指攻击者利用现有系统程序中对用户输入的数据进行特殊字符过滤不完整的缺陷,将恶意的SQL命令注入到服务器数据库引擎执行,达到窃取数据甚至控制服务器目的。SQL注入可存在于任何利用后台数据库的系统程序中,最常见的有PHP/JSP/ASP等Web系统程序。Web系统程序是一种采用超文本传输协议(HTTP,HypertextTransferProtocol)实现客户端和服务器之间通信的应用模式。单引号,作为SQL语句中字符串的定界符,属于特殊字符。包含单引号的SQL语句不能直接正常执行,需要对其中的单引号进行转义操作,即将单引号替换为反斜杆单引号(V)。例如,查询数据表(table)中字段(field)为U的数据,构造的SQL语句应该为:SELECT*FROMtableWHEREfield二'U'。对其中的单引号进行转义操作后得到SELECT*FROMtableWHEREfield=VUV,以使SQL语句能够正确的被执行。而当U中数据被恶意构造并含有单引号时,如单引号中的数据U被恶意构造为hz'cn时,SQL语句为:SELECT*FROMtableWHEREfield='hz'cn'。由于单引号内的数据还存在单引号,系统无法识别单引号内的数据到底是hz、cn还是hz,cn。这时,对其中的单引号进行转义操作后会得到YhzYcnY。通常,系统会默认识别第一对单引号中的内容,即将hz识别为单引号中的数据,而cn被认为是一对单引号(即'hz')之后的数据,同时还会认为cn后的单引号是一个不完整的单引号,进而导致SQL执行失败。攻击者则利用这种错误将攻击语句并在cn的单引号之后,例如,被修改后语句可以是SELECT*FROMtableWHEREfidd='hz'cn'main',这样即可实现SQL注入。也就是说,利用SQL语句的错误,加入攻击者所要加入的内容,从而实现注入攻击。可见,SQL注入的根源是系统程序中使用了用户输入数据来构造动态的SQLi吾句。目前,当用户提交数据后,系统程序在获取用户提交的数据时,会统一对所有变量进行安全过滤即初始化时的过滤,目的是使变量能安全的在SQL语句中使用。但是,由于这种初始化过滤是在获取用户提交数据后立即进行,而系统对用户提交的数据过滤后,生成SQL语句之前,还会对过滤后的数据进行一些中间操作如转义操作、查询操作等,而这些操作正是不可控的。因而,无法保证在系统程序初始化过滤之后,系统程序在执行过程中不被恶意构造,以至于无法保证所生成的SQL语句不是被恶意构造的。
发明内容本发明实施例的目的在于提供一种构造SQL语句的方法及装置,以解决在系统程序执行过程中可能存在的安全隐患,保证所生成的SQL语句是安全的。本发明实施例提供了一种构造SQL语句的方法,包括获取用于构造SQL语句的信息,从所述信息中查找出所有变量,将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;对所述所有变量进行过滤操作,过滤操作通过后,将所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。其中,如果所述用于构造SQL语句的信息是针对查询和/或删除类型的SQL语句的信息,则所述所有变量至少包括以下其中之一或任意组合第一类变量、第二类变量、第三类变量、第四类变量。其中,所述对所有变量进行过滤的操作包括从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;从所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作。其中,所述第一类变量至少包括字^:名变量,和/或,表名变量;所述第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;所述第三类变量至少包括属于SQL的LIMIT语句中的变量;所述第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量。其中,如果所述用于构造SQL语句的信息是针对插入类型的SQL语句的信息,则所述所有变量至少包括以下其中之一或任意组合第一类变量,第五类变量、第六类变量。其中,所述对所有变量进行过滤的操作包括从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为——对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的4建值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作;从所述所有变量中找出属于笫六类的变量,所述第六类变量位于需要插入的至少一条数据中,将需要插入的至少一条数据放入一个数组,多条数据组成一个二维数组,对对数组中的变量按照第一过滤规则进行过滤,将一条数据中的变量用逗号连接后两边加括号,再用逗号连接多条数据,过滤完毕后,所述第六类变量通过过滤操作。其中,所述第一类变量至少包括字,殳名变量,和/或,表名变量;所述第五类变量包括需要插入的字段名变量和字段值变量;所述第六类变量位于需要插入的至少一条数据中,包括字段值变量。其中,如果所述用于构造SQL语句的信息是针对更新类型的SQL语句的信息,则所述所有变量至少包括以下其中之一或任意组合第一类变量、第二类变量、第三类变量、第四类变量、第五类变量。其中,所述对所有变量进行过滤的操作包括从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;从所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作;从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为——对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤才喿作。其中,所述第一类变量至少包括字段名变量,和/或,表名变量;所述第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;所述第三类变量至少包括属于SQL的LIMIT语句中的变量;所述第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量;所述第五类变量包括需要插入的字段名变量和字段值变量。其中,所述按照第一过滤规则进行过滤的操作包括若被执行过滤操作的变量的类型为数据值,则将该变量两端加上单引号;若被执行过滤操作的变量的类型为非数值型,则判断该变量是否已经经过转义操作,若已经过转义操作,则先进行去除转义操作后,再进行转义操作,若未经过转义操作,则对所述变量进行转义操作;之后,将转义后的变量两端加上单引号。本发明实施例还提供了一种构造SQL语句的装置,包括获取单元,获取用于构造SQL语句的信息,从所述信息中查找出所有变量;非变量处理单元,用于将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;过滤单元,用于对所述所有变量进行过滤操作;SQL语句生成单元,用于将过滤后的所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。其中,所述过滤单元包括第一类变量过滤单元,用于从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;第二类变量过滤单元,用于从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;第三类变量过滤单元,用于从所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类第四类变量过滤单元,用于从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作;第五类变量过滤单元,用于从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为——对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作;第六类变量过滤单元,用于从所述所有变量中找出属于第六类的变量,所述第六类变量位于需要插入的至少一条数据中,将需要插入的至少一条数据放入一个数组,多条数据组成一个二维数组,对对数组中的变量按照第一过滤规则进行过滤,将一条数据中的变量用逗号连接后两边加括号,再用逗号连接多条数据,过滤完毕后,所述第六类变量通过过滤操作。其中,所述第一类变量至少包括字段名变量,和/或,表名变量;所述第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;所述第三类变量至少包括属于SQL的LIMIT语句中的变量;所述第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量;所述第五类变量包括需要插入的字段名变量和字段值变量;所述第六类变量位于需要插入的至少一条数据中,包括字段值变量。应用本发明,在构造SQL语句时,对SQL语句中的所有变量进行过滤,同时对非变量部分加单引号保护,以避免在初始化过滤之后生成SQL语句之前的中间操作被攻击者利用,从而避免在系统程序执行过程中可能存在的安全隐患,从而保证所生成的SQL语句的安全性。本发明解决了Web系统程序中的SQL注入攻击。为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图1是根据本发明实施例的构造SQL语句的方法流程图;图2是根据本发明实施例的构造SQL语句的装置结构图。具体实施例方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。参见图l,其是4艮据本发明实施例的构造SQL语句的方法流程图。具体包括步骤IOI,获取用于构造SQL语句的信息,从所述用于构造SQL语句的信息中查找出所有变量。步骤102,将除所述变量外的其他用于构造SQL语句的信息全部加上单引号,从而保证这部分内容无法使用变量构造,以保证这部分信息的安全。步骤103,对所述所有变量进行过滤操作,具体的过滤操作在后续说明。步骤104,过滤操作通过后,将所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。应用本发明,在构造SQL语句时,对SQL语句中的所有变量进4亍过滤,同时对非变量部分加单引号保护,以避免在初始化过滤之后生成SQL语句之前的中间操作被攻击者利用,从而避免在系统程序执行过程中可能存在的安全隐患,从而保证所生成的SQL语句的安全性。本发明解决了Web系统程序中的SQL注入攻击。需要说明的是,对于不同的应用场景需要不同类型的SQL语句,因此步骤101中所述的用于构造SQL语句的信息也是不同的。例如,在用户登陆某网站时输入的用户名和密码,可以作为查询类SQL语句获取的用于构造SQL语句的信息,因为系统此时需要根据用户输入的信息生成安全的SQL语句,查询相应的数据库以确i人该用户是否合法。再例如,用户发自己的帖子或博客,则该帖子或博客可以作为插入类SQL语句获取的用于构造SQL语句的信息,因为系统此时需要根据用户输入的信息生成安全的SQL语句,插入到相应的数据库中。更新或删除类型SQL语句与上述类似,不再说明。下面针对不同的SQL语句类型,分别描述前述步骤l03中如何对所有变量进行过滤操作。一、查询和/或删除类型的SQLi吾句如果需要构造查询和/或删除类型的SQL语句,则前述步骤101中用于构造SQL语句的信息是针对查询和/或删除类型的SQL语句的信息,此时,所述的所有变量至少包括以下其中之一或任意组合第一类变量、第二类变量、第三类变量、第四类变量。其中,所述第一类变量至少包括字^:名变量,和/或,表名变量;所述第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;所述第三类变量至少包括属于SQL的LIMIT语句中的变量;所述第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量。此时,步骤103中的所有变量进行过滤的操:作包括从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;前述预先给定的范围可以根据实际需求而定,在此不做限定。从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;从所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤纟乘作;从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作。二、插入类型的SQL语句如果需要构造插入类型的SQL语句,则前述步骤101中用于构造SQL语句的信息是针对插入类型的SQL语句的信息,此时,所述所有变量至少包括以下其中之一或任意组合第一类变量,第五类变量、第六类变量。其中,所述第一类变量至少包括字4殳名变量,和/或,表名变量;所述第五类变量包括需要插入的字段名变量和字段值变量;所述第六类变量位于需要插入的至少一条数据中,包括字段值变量。此时,步骤103中的所有变量进行过滤的操:作包括从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操:作;从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为——对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤4喿作;从所述所有变量中找出属于第六类的变量,所述第六类变量位于需要插入的至少一条敖据中,将需要插入的至少一条数据放入一个数组,多条数据组成一个二维数组,对对数组中的变量按照第一过滤规则进行过滤,将一条数据中的变量用逗号连接后两边加括号,再用逗号连接多条数据,过滤完毕后,所述第六类变量通过过滤才喿作。三、更新类型的SQL语句如果需要构造更新类型的SQL语句,则前述步骤101中用于构造SQL语句的信息是针对更新类型的SQL语句的信息,此时,所述所有变量至少包括以下其中之一或任意组合:第一类变量、第二类变量、第三类变量、第四类变量、第五类变量。其中,所述第一类变量至少包括字l殳名变量,和/或,表名变量;所述第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;所述第三类变量至少包括属于SQL的LIMIT语句中的变量;所述第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量;所述第五类变量包括需要插入的字段名变量和字段值变量。此时,步骤103中的所有变量进行过滤的操作包括从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤才喿作;从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;^v所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数組中,对所述数组中的变量按照第一过滤MJ'J进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作;从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为——对应的数组的键:值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作。前述三种类型的SQL语句中所涉及的按照第一过滤规则进行过滤的操作包括若被执行过滤操作的变量的类型为数据值,则将该变量两端加上单引号;若被执行过滤操作的变量的类型为非数值型,则判断该变量是否已经经过转义操作,若已经过转义操作,则先进行去除转义操作后,再进行转义操作,若未经过转义操作,则对所述变量进行转义操作;之后,将转义后的变量两端加上单引号。下面从开发的角度,结合具体实例对本发明再做详细说明。实施例一构造查询和/或删除类型的SQL语句a、获取用于构造SQL语句的信息,从所述用于构造SQL语句的信息中查找出所有变量。这里,用于构造SQL语句的信息是针对查询和/或删除类型的SQL语句的信息。b、将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;从而保证这部分内容无法使用变量构造。c、对所述所有变量进行过滤操作,具体包括cl、从所述所有变量中找出属于第一类的变量,即找出字段名变量、表名变量,判断所述字段名变量、表名变量是否在预先给定的范围值内,若是则第一类变量通过过滤操作,否则给出错误提示或返回一个表示错误信息的默认值;c2、从所述所有变量中找出属于第二类的变量,即属于SQL的WHERE语句查询条件中的变量,按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;c3、从所述所有变量中找出属于第三类的变量,即属于SQL的LIMIT语句中的变量,将LIMIT语句中的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;c4、从所述所有变量中找出属于第四类的变量,即属于SQL的WHERE语句中IN子句中的变量,将IN子句中的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤才喿作。步骤C2和C4中的按照第一过滤规则进行过滤的操作与前述相同,不再赘述。d、将所述所有变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。需要说明的是,在实际操作中,所生成的SQL语句可以包括上述四种变量其中之一或任意组合。具体实例如下查询语句通常的写法$sql="SELECTusername,password,$fieldFROM$tableWHEREregdate>,$regdate,ANDidIN('$id—l,,,$id—2,,,$id—3,)LIMIT$start,$num";其中$field是字段名变量Stable是表名变量按照本发明的方式的写法如下对字段名变量进行安全性过滤$field=CklnArray(Sfield,array('emair,,tel,));对表名变量进行安全性过滤$table=CklnArray($table,array('pw—membersl,,,pw一members2,));对sql语句中WHERE查询条件中的变量安全性过滤$regdate=pwEscape($regdate);对in子句进行处理$ids=pwImplode(array($id—1,$id—2,$id—3));对limit子句进行处理$limit=pwLimit($start,$num);对不含变量的sql语句部分进行的处理,下划线色部分为不含变量的sql语句部分$sql=,SELECTusemame,password,,.$field.,FROM'.$table.,WHEREre£date>,.$regdate.,ANDidINC.Sids.T.$limit;删除语句通常的写法$sql="DELETEFROM$tableWHEREregdate>,$regdate,ANDidIN('$id—l,,,$id—2,,,$id—3,)";其中Stable是表名变量按照本发明方式的写法如下对表名变量进行安全性过滤$table=CklnArray($table,array('pw—membersl,,,pw—members2,));对sql语句中WHERE查询条件中的变量安全性过滤$regdate=pwEscape($regdate);对in子句进行处理$ids=pwImplode(array($id—1,$id—2,$id—3》;对不含变量的sql语句部分进行处理,下划线部分为不含变量的sql语句部$sql=,DELETEFROM'.$table.,WHEREregdate>,.$regdate.,ANDidINC.$ids.!}:实施例二构造插入类型的SQL语句a、获取用于构造SQL语句的信息,从所述用于构造SQL语句的信息中查找出所有变量。这里,用于构造SQL语句的信息是针对插入类型的SQL语句的信息。b、将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;从而保证这部分内容无法使用变量构造。c、对所述所有变量进行过滤操作,具体包括cl、从所述所有变量中找出属于第一类的变量,即找出字段名变量、表名变量,判断所述字段名变量、表名变量是否在预先给定的范围值内,若是则第一类变量通过过滤操作,否则给出错误提示或返回一个表示错误信息的默认值;c2、从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量——对应的存到一个数组中,该字段名变量和字段值变量分别作为数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作;c3、从所述所有变量中找出属于第六类的变量,所述第六类变量位于需要插入的至少一条数据中,将需要插入的至少一条数据放入一个数组,多条数据组成一个二维数组,对对数组中的变量按照第一过滤规则进行过滤,将一条数据中的变量用逗号连接后两边加括号,再用逗号连接多条数据,过滤完毕后,所述第六类变量通过过滤操作。步骤c2和c3中的按照第一过滤规则进行过滤的操作与前述相同,不再赘述。d、将所述所有变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。需要说明的是,在实际操作中,所生成的SQL语句可以包括上述三种变量其中之一或任意组合。具体实例如下单条数据插入通常的写法$sql=,,INSERTINTO$tableSETusemame=,$usemame,,password=,$password'";按照本发明方式的写法如下对表名变量进行安全性过滤$table=CklnArray($table,array('pw—members1,,,pw—members2,));对单条数据进行处理$pwSQL=pwSqlSingle(array('username'=>$username,'password'=>$password,》;对不含变量的sql语句部分进行处理,下划线部分为不含变量的sql语句部分$sql=,INSERTINTO'.$table.,SET'.$pwSOL:多条数据插入通常的写法$sql="INSERTINTO$table(username,password)VALUES('$usemame—l,,,$password—1,),('$username_2,,,$password—2,),('$username一3,,,$password—3,)");对表名变量进行安全性过滤$table=CklnArray($table,array('pw—membersl,,,pw—members2,));对多条数据进行处理$pwSQL=pwSqlMulti(array(array($username一l,$password—l),array($username一2,$password—2),array($username—3,$password—3)));对不含变量的sql语句部分进行处理,下划线部分为不含变量的sql语句部分$sql=,INSERTINTO'.$table.,(username,password)VALUES'.$pwSQL;实施例三构造更新类型的SQL语句a、获取用于构造SQL语句的信息,从所述用于构造SQL语句的信息中查找出所有变量。这里,用于构造SQL语句的信息是针对更新类型的SQL语句的信息。b、将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;从而保证这部分内容无法使用变量构造。c、对所述所有变量进行过滤操作,具体包括cl、从所述所有变量中找出属于第一类的变量,即找出字段名变量、表名变量,判断所述字段名变量、表名变量是否在预先给定的范围值内,若是则第一类变量通过过滤操作,否则给出错误提示或返回一个表示错误信息的默认值;c2、从所述所有变量中找出属于第二类的变量,即属于SQL的WHERE语句查询条件中的变量,按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;c3、从所述所有变量中找出属于第三类的变量,即属于SQL的LIMIT语句中的变量,将LIMIT语句中的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;c4、从所述所有变量中找出属于第四类的变量,即属于SQL的WHERE语句中IN子句中的变量,将IN子句中的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤:捧作;c5、从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量——对应的存到一个数组中,该字段名变量和字段值变量分别作为数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作;d、将所述所有变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。需要说明的是,在实际操作中,所生成的SQL语句可以包括上述五种变量其中之一或任意组合。具体实例如下更新语句通常的写法$sql=,,UPDATE$tableSETusername=,$username,,password=,$password,WHEREregdate>,$regdate,ANDidIN('$id—l,,,$id—2,,,$id—3,)";其中$table是表名变量按照本发明方式的写法如下对表名变量进行安全性过滤$table=CklnArray($table,array('pw—membersl,,,pw—members2,));将需要更新的数据与字段名进行处理$pwSQL=pwSqlSingle(array('username'=>$username,'password'=>$password,》;对sql语句中WHERE查询条件中的变量安全性过滤$regdate=pwEscape($regdate);对in子句进行处理$ids=pwImplode(array($id—1,$id—2,$id—3》;对limit子句进行处理$limit=pwLimit($start,$num);对不含变量的sql语句部分进行的处理,下划线部分为不含变量的sql语句部分$sql=,UPDATE'.Stable.,SET.$pwSOL.WHEREregdate〉,.$regdate.,ANDidINC.$ids.T.$limit;本发明实施例还提供了一种构造SQL语句的装置,参见图2,包括获取单元201,获取用于构造SQL语句的信息,从所述信息中查找出所有变量;非变量处理单元202,用于将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;过滤单元203,用于对所述所有变量进行过滤才喿作;SQL语句生成单元204,用于将过滤后的所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。上述过滤单元203可以包括第一类变量过滤单元2031,用于从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;第二类变量过滤单元2032,用于从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;第三类变量过滤单元2033,用于从所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;第四类变量过滤单元2034,用于从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作;第五类变量过滤单元2035,用于从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为——对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作5第六类变量过滤单元2036,用于^Mv所述所有变量中找出属于第六类的变量,所述第六类变量位于需要插入的至少一条数据中,将需要插入的至少一条数据放入一个数组,多条数据组成一个二维数组,对对数组中的变量按照第一过滤规则进行过滤,将一条数据中的变量用逗号连接后两边加括号,再用逗号连接多条数据,过滤完毕后,所述第六类变量通过过滤操作。其中,上述第一类变量至少包括字段名变量,和/或,表名变量;第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;第三类变量至少包括属于SQL的LIMIT语句中的变量;第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量;第五类变量包括需要插入的字段名变量和字段值变量;第六类变量位于需要插入的至少一条数据中,包括字段值变量。应用本发明,在构造SQL语句时,对SQL语句中的所有变量进行过滤,同时对非变量部分加单引号保护,以避免在初始化过滤之后生成SQL语句之前的中间操作被攻击者利用,从而避免在系统程序执行过程中可能存在的安全隐患,从而保证所生成的SQL语句的安全性。本发明解决了Web系统程序中的SQL注入攻击。本领域普通技术人员可以理解实现上述方法实施方式中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于计算机可读取存储介质中,这里所称得的存储介质,如ROM/RAM、磁碟、光盘等。以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。权利要求1、一种构造SQL语句的方法,其特征在于,包括获取用于构造SQL语句的信息,从所述信息中查找出所有变量,将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;对所述所有变量进行过滤操作,过滤操作通过后,将所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。2、根据权利要求1所述的方法,其特征在于,如果所述用于构造SQL语句的信息是针对查询和/或删除类型的SQL语句的信息,则所述所有变量至少包括以下其中之一或任意组合第一类变量、第二类变量、第三类变量、第四类变量。3、根据权利要求2所述的方法,其特征在于,所述对所有变量进行过滤的操作包括从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;从所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤4乘作;从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤4乘作。4、根据权利要求2所述的方法,其特征在于,所述第一类变量至少包括字段名变量,和/或,表名变量;所述第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;所述第三类变量至少包括属于SQL的LIMIT语句中的变量;所述第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量。5、根据权利要求1所述的方法,其特征在于,如果所述用于构造SQL语句的信息是针对插入类型的SQL语句的信息,则所述所有变量至少包括以下其中之一或任意组合第一类变量,第五类变量、第六类变量。6、根据权利要求5所述的方法,其特征在于,所述对所有变量进行过滤的操作包括从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为——对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作;从所述所有变量中找出属于第六类的变量,所述第六类变量位于需要插入的至少一条数据中,将需要插入的至少一条数据放入一个数组,多条数据组成一个二维数组,对对数组中的变量按照第一过滤规则进行过滤,将一条数据中的变量用逗号连接后两边加括号,再用逗号连接多条数据,过滤完毕后,所述第六类变量通过过滤操作。7、根据权利要求5所述的方法,其特征在于,所述第一类变量至少包括字段名变量,和/或,表名变量;所述第五类变量包括需要插入的字段名变量和字段值变量;所述第六类变量位于需要插入的至少一条数据中,包括字段值变量。8、根据权利要求1所述的方法,其特征在于,如果所述用于构造SQL语句的信息是针对更新类型的SQL语句的信息,则所述所有变量至少包括以下其中之一或任意组合第一类变量、第二类变量、第三类变量、第四类变量、第五类变量。9、根据权利要求8所述的方法,其特征在于,所述对所有变量进行过滤的操作包括从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤MJ'J进行过滤,过滤完毕后,所述第二类变量通过过滤操:作;^W所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作;从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为——对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤纟喿作。10、根据权利要求8所述的方法,其特征在于,所述第一类变量至少包括字段名变量,和/或,表名变量;所述第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;所述第三类变量至少包括属于SQL的LIMIT语句中的变量;所述第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量;所述第五类变量包括需要插入的字段名变量和字段值变量。11、根据权利要求3、6或9所述的方法,其特征在于,所述按照第一过滤规则进行过滤的操作包括若净皮执行过滤操作的变量的类型为数据值,则将该变量两端加上单引号;若被执行过滤操作的变量的类型为非数值型,则判断该变量是否已经经过转义操作,若已经过转义操作,则先进行去除转义操作后,再进行转义操作,若未经过转义操作,则对所述变量进行转义操作;之后,将转义后的变量两端加上单引号。12、一种构造SQL语句的装置,其特征在于,包括获取单元,获取用于构造SQL语句的信息,从所述信息中查找出所有变量;非变量处理单元,用于将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;过滤单元,用于对所述所有变量进行过滤操作;SQL语句生成单元,用于将过滤后的所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。13、根据权利要求12所述的装置,其特征在于,所述过滤单元包括第一类变量过滤单元,用于>^人所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操:作;第二类变量过滤单元,用于从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;第三类变量过滤单元,用于^v所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;第四类变量过滤单元,用千从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作;第五类变量过滤单元,用于>^人所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为——对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作;第六类变量过滤单元,用于从所述所有变量中找出属于第六类的变量,所述第六类变量位于需要插入的至少一条数据中,将需要插入的至少一条数据放入一个数组,多条数据组成一个二维数组,对对数组中的变量按照第一过滤规则进行过滤,将一条数据中的变量用逗号连接后两边加括号,再用逗号连"l妄多条数据,过滤完毕后,所述第六类变量通过过滤操作。14、根据权利要求13所述的装置,其特征在于,所述第一类变量至少包括字段名变量,和/或,表名变量;所述第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;所述第三类变量至少包括属于SQL的LIMIT语句中的变量;所述第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量;所述第五类变量包括需要插入的字段名变量和字段值变量;所述第六类变量位于需要插入的至少一条数据中,包括字段值变量。全文摘要本发明公开了一种构造SQL语句的方法和装置,所述方法包括获取用于构造SQL语句的信息,从所述信息中查找出所有变量,将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;对所述所有变量进行过滤操作,过滤操作通过后,将所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。应用本发明,在构造SQL语句时,对SQL语句中的所有变量进行过滤,同时对非变量部分加单引号保护,以避免在初始化过滤之后生成SQL语句之前的中间操作被攻击者利用,从而避免在系统程序执行过程中可能存在的安全隐患,从而保证所生成的SQL语句的安全性。本发明解决了Web系统程序中的SQL注入攻击。文档编号G06F17/30GK101425117SQ20081018511公开日2009年5月6日申请日期2008年12月9日优先权日2008年12月9日发明者林耀纳申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1