发明内容
本发明实施例的目的在于提供一种构造SQL语句的方法及装置,以解决在系统程序执行过程中可能存在的安全隐患,保证所生成的SQL语句是安全的。
本发明实施例提供了一种构造SQL语句的方法,包括:
获取用于构造SQL语句的信息,从所述信息中查找出所有变量,将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;
对所述所有变量进行过滤操作,过滤操作通过后,将所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。
其中,如果所述用于构造SQL语句的信息是针对查询和/或删除类型的SQL语句的信息,则所述所有变量至少包括以下其中之一或任意组合:第一类变量、第二类变量、第三类变量、第四类变量。
其中,所述对所有变量进行过滤的操作包括:
从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;
从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;
从所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;
从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作。
其中,所述第一类变量至少包括字段名变量,和/或,表名变量;所述第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;所述第三类变量至少包括属于SQL的LIMIT语句中的变量;所述第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量。
其中,如果所述用于构造SQL语句的信息是针对插入类型的SQL语句的信息,则所述所有变量至少包括以下其中之一或任意组合:第一类变量,第五类变量、第六类变量。
其中,所述对所有变量进行过滤的操作包括:
从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;
从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为一一对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作;
从所述所有变量中找出属于第六类的变量,所述第六类变量位于需要插入的至少一条数据中,将需要插入的至少一条数据放入一个数组,多条数据组成一个二维数组,对对数组中的变量按照第一过滤规则进行过滤,将一条数据中的变量用逗号连接后两边加括号,再用逗号连接多条数据,过滤完毕后,所述第六类变量通过过滤操作。
其中,所述第一类变量至少包括字段名变量,和/或,表名变量;所述第五类变量包括需要插入的字段名变量和字段值变量;所述第六类变量位于需要插入的至少一条数据中,包括字段值变量。
其中,如果所述用于构造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语句的方法流程图。具体包括:
步骤101,获取用于构造SQL语句的信息,从所述用于构造SQL语句的信息中查找出所有变量。
步骤102,将除所述变量外的其他用于构造SQL语句的信息全部加上单引号,从而保证这部分内容无法使用变量构造,以保证这部分信息的安全。
步骤103,对所述所有变量进行过滤操作,具体的过滤操作在后续说明。
步骤104,过滤操作通过后,将所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。
应用本发明,在构造SQL语句时,对SQL语句中的所有变量进行过滤,同时对非变量部分加单引号保护,以避免在初始化过滤之后生成SQL语句之前的中间操作被攻击者利用,从而避免在系统程序执行过程中可能存在的安全隐患,从而保证所生成的SQL语句的安全性。本发明解决了Web系统程序中的SQL注入攻击。
需要说明的是,对于不同的应用场景需要不同类型的SQL语句,因此步骤101中所述的用于构造SQL语句的信息也是不同的。
例如,在用户登陆某网站时输入的用户名和密码,可以作为查询类SQL语句获取的用于构造SQL语句的信息,因为系统此时需要根据用户输入的信息生成安全的SQL语句,查询相应的数据库以确认该用户是否合法。
再例如,用户发自己的帖子或博客,则该帖子或博客可以作为插入类SQL语句获取的用于构造SQL语句的信息,因为系统此时需要根据用户输入的信息生成安全的SQL语句,插入到相应的数据库中。
更新或删除类型SQL语句与上述类似,不再说明。
下面针对不同的SQL语句类型,分别描述前述步骤103中如何对所有变量进行过滤操作。
一、查询和/或删除类型的SQL语句
如果需要构造查询和/或删除类型的SQL语句,则前述步骤101中用于构造SQL语句的信息是针对查询和/或删除类型的SQL语句的信息,此时,所述的所有变量至少包括以下其中之一或任意组合:第一类变量、第二类变量、第三类变量、第四类变量。其中,所述第一类变量至少包括字段名变量,和/或,表名变量;所述第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;所述第三类变量至少包括属于SQL的LIMIT语句中的变量;所述第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量。
此时,步骤103中的所有变量进行过滤的操作包括:
从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;前述预先给定的范围可以根据实际需求而定,在此不做限定。
从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;
从所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;
从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作。
二、插入类型的SQL语句
如果需要构造插入类型的SQL语句,则前述步骤101中用于构造SQL语句的信息是针对插入类型的SQL语句的信息,此时,所述所有变量至少包括以下其中之一或任意组合:第一类变量,第五类变量、第六类变量。其中,所述第一类变量至少包括字段名变量,和/或,表名变量;所述第五类变量包括需要插入的字段名变量和字段值变量;所述第六类变量位于需要插入的至少一条数据中,包括字段值变量。
此时,步骤103中的所有变量进行过滤的操作包括:
从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;
从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为一一对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作;
从所述所有变量中找出属于第六类的变量,所述第六类变量位于需要插入的至少一条数据中,将需要插入的至少一条数据放入一个数组,多条数据组成一个二维数组,对对数组中的变量按照第一过滤规则进行过滤,将一条数据中的变量用逗号连接后两边加括号,再用逗号连接多条数据,过滤完毕后,所述第六类变量通过过滤操作。
三、更新类型的SQL语句
如果需要构造更新类型的SQL语句,则前述步骤101中用于构造SQL语句的信息是针对更新类型的SQL语句的信息,此时,所述所有变量至少包括以下其中之一或任意组合:第一类变量、第二类变量、第三类变量、第四类变量、第五类变量。其中,所述第一类变量至少包括字段名变量,和/或,表名变量;所述第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;所述第三类变量至少包括属于SQL的LIMIT语句中的变量;所述第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量;所述第五类变量包括需要插入的字段名变量和字段值变量。
此时,步骤103中的所有变量进行过滤的操作包括:
从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;
从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;
从所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;
从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作;
从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为一一对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作。
前述三种类型的SQL语句中所涉及的按照第一过滤规则进行过滤的操作包括:
若被执行过滤操作的变量的类型为数据值,则将该变量两端加上单引号;
若被执行过滤操作的变量的类型为非数值型,则判断该变量是否已经经过转义操作,若已经过转义操作,则先进行去除转义操作后,再进行转义操作,若未经过转义操作,则对所述变量进行转义操作;之后,将转义后的变量两端加上单引号。
下面从开发的角度,结合具体实例对本发明再做详细说明。
实施例一:构造查询和/或删除类型的SQL语句
a、获取用于构造SQL语句的信息,从所述用于构造SQL语句的信息中查找出所有变量。这里,用于构造SQL语句的信息是针对查询和/或删除类型的SQL语句的信息。
b、将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;从而保证这部分内容无法使用变量构造。
c、对所述所有变量进行过滤操作,具体包括:
c1、从所述所有变量中找出属于第一类的变量,即找出字段名变量、表名变量,判断所述字段名变量、表名变量是否在预先给定的范围值内,若是则第一类变量通过过滤操作,否则给出错误提示或返回一个表示错误信息的默认值;
c2、从所述所有变量中找出属于第二类的变量,即属于SQL的WHERE语句查询条件中的变量,按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;
c3、从所述所有变量中找出属于第三类的变量,即属于SQL的LIMIT语句中的变量,将LIMIT语句中的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;
c4、从所述所有变量中找出属于第四类的变量,即属于SQL的WHERE语句中IN子句中的变量,将IN子句中的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作。
步骤c2和c4中的按照第一过滤规则进行过滤的操作与前述相同,不再赘述。
d、将所述所有变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。
需要说明的是,在实际操作中,所生成的SQL语句可以包括上述四种变量其中之一或任意组合。
具体实例如下:
查询语句通常的写法:
$sql=”SELECT username,password,$field FROM $table WHEREregdate>’$regdate’AND id IN(‘$id_1’,’$id_2’,’$id_3’)LIMIT$start,$num”;
其中:$field是字段名变量 $table是表名变量
按照本发明的方式的写法如下:
对字段名变量进行安全性过滤
$field=CkInArray($field,array(‘email’,’tel’));
对表名变量进行安全性过滤
$table=CkInArray($table,array(‘pw_members1’,’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=’SFLECT username,password,’.$field.’FR OM‘.$table.’WHERE regdate>’.$regdate.’AND id IN(‘.$ids.’)‘.$limit;
删除语句通常的写法:
$sql=”DELETEF ROM $table WHERE regdate>’$regdate’AND id
IN(‘$id_1’,’$id_2’,’$id_3’)”;
其中:$table是表名变量
按照本发明方式的写法如下:
对表名变量进行安全性过滤
$table=CkInArray($table,array(‘pw_membersl’,’pw_members2’));
对sql语句中WHERE查询条件中的变量安全性过滤
$regdate=pwEscape($regdate);
对in子句进行处理
$ids=pwImplode(array($id_1,$$id_2,$id_3));
对不含变量的sql语句部分进行处理,下划线部分为不含变量的sql语句部分
$sql=’DELETE FROM‘.$table.’WHERE regdate>’.$$regdate.’AND id IN(‘.$ids.’)’
实施例二:构造插入类型的SQL语句
a、获取用于构造SQL语句的信息,从所述用于构造SQL语句的信息中查找出所有变量。这里,用于构造SQL语句的信息是针对插入类型的SQL语句的信息。
b、将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;从而保证这部分内容无法使用变量构造。
c、对所述所有变量进行过滤操作,具体包括:
c1、从所述所有变量中找出属于第一类的变量,即找出字段名变量、表名变量,判断所述字段名变量、表名变量是否在预先给定的范围值内,若是则第一类变量通过过滤操作,否则给出错误提示或返回一个表示错误信息的默认值;
c2、从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量一一对应的存到一个数组中,该字段名变量和字段值变量分别作为数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作;
c3、从所述所有变量中找出属于第六类的变量,所述第六类变量位于需要插入的至少一条数据中,将需要插入的至少一条数据放入一个数组,多条数据组成一个二维数组,对对数组中的变量按照第一过滤规则进行过滤,将一条数据中的变量用逗号连接后两边加括号,再用逗号连接多条数据,过滤完毕后,所述第六类变量通过过滤操作。
步骤c2和c3中的按照第一过滤规则进行过滤的操作与前述相同,不再赘述。
d、将所述所有变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。
需要说明的是,在实际操作中,所生成的SQL语句可以包括上述三种变量其中之一或任意组合。
具体实例如下:
单条数据插入通常的写法:
$sql=”INSERT INTO $table SET username=’$username’,password=’$password”’;
按照本发明方式的写法如下:
对表名变量进行安全性过滤
$table=CkInArray($table,array(‘pw_membersl’,’pw_members2’));
对单条数据进行处理
$pwSQL=pwSqlSingle(array(
′username′=>$username,
′password′=>$password,
));
对不含变量的sql语句部分进行处理,下划线部分为不含变量的sql语句部分
$sql=’INSERT INTO‘.$table.’SET‘.$pwSQL;
多条数据插入通常的写法:
$sql="INSERT INTO $table(username,password)VALUES(‘$username_1’,’$password_1’),(‘$username_2’,’$password_2’),(‘$username_3’,’$password_3’)");
对表名变量进行安全性过滤
$table=CkInArray($table,array(‘pw_membersl’,’pw_members2’));
对多条数据进行处理
$pwSQL=pwSqlMulti(array(
array($username_1,$password_1),
array($username_2,$password_2),
array($$username_3,$password_3)
));
对不含变量的sql语句部分进行处理,下划线部分为不含变量的sql语句部分
$sql=’INSERT INTO‘.$table.’(username,password)VALUES‘.$pwSQL;
实施例三:构造更新类型的SQL语句
a、获取用于构造SQL语句的信息,从所述用于构造SQL语句的信息中查找出所有变量。这里,用于构造SQL语句的信息是针对更新类型的SQL语句的信息。
b、将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;从而保证这部分内容无法使用变量构造。
c、对所述所有变量进行过滤操作,具体包括:
c1、从所述所有变量中找出属于第一类的变量,即找出字段名变量、表名变量,判断所述字段名变量、表名变量是否在预先给定的范围值内,若是则第一类变量通过过滤操作,否则给出错误提示或返回一个表示错误信息的默认值;
c2、从所述所有变量中找出属于第二类的变量,即属于SQL的WHERE语句查询条件中的变量,按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;
c3、从所述所有变量中找出属于第三类的变量,即属于SQL的LIMIT语句中的变量,将LIMIT语句中的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;
c4、从所述所有变量中找出属于第四类的变量,即属于SQL的WHERE语句中IN子句中的变量,将IN子句中的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作;
c5、从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量一一对应的存到一个数组中,该字段名变量和字段值变量分别作为数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作;
d、将所述所有变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。
需要说明的是,在实际操作中,所生成的SQL语句可以包括上述五种变量其中之一或任意组合。
具体实例如下:
更新语句通常的写法:
$sql=”UPDATE $table SET username=’$username’,password=’$password’
WHERE regdate>’$regdate’AND id IN(‘$id_1’,’$id_2’,’$id_3’)”;
其中:$table是表名变量
按照本发明方式的写法如下:
对表名变量进行安全性过滤
$table=CkInArray($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‘.$table.’SET.$pwSQL.WHERE regdate>’.$regdate.’ AND id IN(‘.$ids.’)‘.$limit;
本发明实施例还提供了一种构造SQL语句的装置,参见图2,包括:
获取单元201,获取用于构造SQL语句的信息,从所述信息中查找出所有变量;
非变量处理单元202,用于将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;
过滤单元203,用于对所述所有变量进行过滤操作;
SQL语句生成单元204,用于将过滤后的所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。
上述过滤单元203可以包括:
第一类变量过滤单元2031,用于从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;
第二类变量过滤单元2032,用于从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;
第三类变量过滤单元2033,用于从所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;
第四类变量过滤单元2034,用于从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作;
第五类变量过滤单元2035,用于从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为一一对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作;
第六类变量过滤单元2036,用于从所述所有变量中找出属于第六类的变量,所述第六类变量位于需要插入的至少一条数据中,将需要插入的至少一条数据放入一个数组,多条数据组成一个二维数组,对对数组中的变量按照第一过滤规则进行过滤,将一条数据中的变量用逗号连接后两边加括号,再用逗号连接多条数据,过滤完毕后,所述第六类变量通过过滤操作。
其中,上述第一类变量至少包括字段名变量,和/或,表名变量;第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;第三类变量至少包括属于SQL的LIMIT语句中的变量;第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量;第五类变量包括需要插入的字段名变量和字段值变量;第六类变量位于需要插入的至少一条数据中,包括字段值变量。
应用本发明,在构造SQL语句时,对SQL语句中的所有变量进行过滤,同时对非变量部分加单引号保护,以避免在初始化过滤之后生成SQL语句之前的中间操作被攻击者利用,从而避免在系统程序执行过程中可能存在的安全隐患,从而保证所生成的SQL语句的安全性。本发明解决了Web系统程序中的SQL注入攻击。
本领域普通技术人员可以理解实现上述方法实施方式中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于计算机可读取存储介质中,这里所称得的存储介质,如:ROM/RAM、磁碟、光盘等。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。