CN101425117A - 一种构造sql语句的方法及装置 - Google Patents

一种构造sql语句的方法及装置 Download PDF

Info

Publication number
CN101425117A
CN101425117A CNA2008101851176A CN200810185117A CN101425117A CN 101425117 A CN101425117 A CN 101425117A CN A2008101851176 A CNA2008101851176 A CN A2008101851176A CN 200810185117 A CN200810185117 A CN 200810185117A CN 101425117 A CN101425117 A CN 101425117A
Authority
CN
China
Prior art keywords
variable
class
variablees
array
belongs
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CNA2008101851176A
Other languages
English (en)
Other versions
CN101425117B (zh
Inventor
林耀纳
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
ZHEJIANG INTIME E-COMMERCE Co.,Ltd.
Original Assignee
Alibaba Group Holding Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Alibaba Group Holding Ltd filed Critical Alibaba Group Holding Ltd
Priority to CN2008101851176A priority Critical patent/CN101425117B/zh
Publication of CN101425117A publication Critical patent/CN101425117A/zh
Application granted granted Critical
Publication of CN101425117B publication Critical patent/CN101425117B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种构造SQL语句的方法和装置,所述方法包括:获取用于构造SQL语句的信息,从所述信息中查找出所有变量,将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;对所述所有变量进行过滤操作,过滤操作通过后,将所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。应用本发明,在构造SQL语句时,对SQL语句中的所有变量进行过滤,同时对非变量部分加单引号保护,以避免在初始化过滤之后生成SQL语句之前的中间操作被攻击者利用,从而避免在系统程序执行过程中可能存在的安全隐患,从而保证所生成的SQL语句的安全性。本发明解决了Web系统程序中的SQL注入攻击。

Description

一种构造SQL语句的方法及装置
技术领域
本发明涉及软件技术领域,特别是指一种构造结构化查询语言(SQL,Structure Query Language)语句的方法及装置。
背景技术
结构化查询语言(SQL,Structure Query Language)是一种面向数据库的通用数据处理语言规范。SQL注入攻击是指攻击者利用现有系统程序中对用户输入的数据进行特殊字符过滤不完整的缺陷,将恶意的SQL命令注入到服务器数据库引擎执行,达到窃取数据甚至控制服务器目的。
SQL注入可存在于任何利用后台数据库的系统程序中,最常见的有PHP/JSP/ASP等Web系统程序。Web系统程序是一种采用超文本传输协议(HTTP,Hypertext Transfer Protocol)实现客户端和服务器之间通信的应用模式。
单引号,作为SQL语句中字符串的定界符,属于特殊字符。包含单引号的SQL语句不能直接正常执行,需要对其中的单引号进行转义操作,即将单引号替换为反斜杆单引号(\′)。
例如,查询数据表(table)中字段(field)为U的数据,构造的SQL语句应该为:SELECT*FROM table WHERE field=′U′。对其中的单引号进行转义操作后得到SELECT*FROM table WHERE field=\′U\′,以使SQL语句能够正确的被执行。
而当U中数据被恶意构造并含有单引号时,如单引号中的数据U被恶意构造为hz′cn时,SQL语句为:SELECT*FROM table WHERE field=′hz′cn′。由于单引号内的数据还存在单引号,系统无法识别单引号内的数据到底是hz、cn还是hz’cn。这时,对其中的单引号进行转义操作后会得到\′hz\′cn\′。
通常,系统会默认识别第一对单引号中的内容,即将hz识别为单引号中的数据,而cn被认为是一对单引号(即′hz′)之后的数据,同时还会认为cn后的单引号是一个不完整的单引号,进而导致SQL执行失败。攻击者则利用这种错误将攻击语句并在cn的单引号之后,例如,被修改后语句可以是SELECT*FROM table WHEREfield=′hz′cn′main′,这样即可实现SQL注入。也就是说,利用SQL语句的错误,加入攻击者所要加入的内容,从而实现注入攻击。可见,SQL注入的根源是系统程序中使用了用户输入数据来构造动态的SQL语句。
目前,当用户提交数据后,系统程序在获取用户提交的数据时,会统一对所有变量进行安全过滤即初始化时的过滤,目的是使变量能安全的在SQL语句中使用。但是,由于这种初始化过滤是在获取用户提交数据后立即进行,而系统对用户提交的数据过滤后,生成SQL语句之前,还会对过滤后的数据进行一些中间操作如转义操作、查询操作等,而这些操作正是不可控的。因而,无法保证在系统程序初始化过滤之后,系统程序在执行过程中不被恶意构造,以至于无法保证所生成的SQL语句不是被恶意构造的。
发明内容
本发明实施例的目的在于提供一种构造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语句的方法流程图;
图2是根据本发明实施例的构造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、磁碟、光盘等。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。

Claims (14)

1、一种构造SQL语句的方法,其特征在于,包括:
获取用于构造SQL语句的信息,从所述信息中查找出所有变量,将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;
对所述所有变量进行过滤操作,过滤操作通过后,将所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。
2、根据权利要求1所述的方法,其特征在于,如果所述用于构造SQL语句的信息是针对查询和/或删除类型的SQL语句的信息,则所述所有变量至少包括以下其中之一或任意组合:第一类变量、第二类变量、第三类变量、第四类变量。
3、根据权利要求2所述的方法,其特征在于,所述对所有变量进行过滤的操作包括:
从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;
从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;
从所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;
从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作。
4、根据权利要求2所述的方法,其特征在于,
所述第一类变量至少包括字段名变量,和/或,表名变量;
所述第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;
所述第三类变量至少包括属于SQL的LIMIT语句中的变量;
所述第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量。
5、根据权利要求1所述的方法,其特征在于,如果所述用于构造SQL语句的信息是针对插入类型的SQL语句的信息,则所述所有变量至少包括以下其中之一或任意组合:第一类变量,第五类变量、第六类变量。
6、根据权利要求5所述的方法,其特征在于,所述对所有变量进行过滤的操作包括:
从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;
从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为一一对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作;
从所述所有变量中找出属于第六类的变量,所述第六类变量位于需要插入的至少一条数据中,将需要插入的至少一条数据放入一个数组,多条数据组成一个二维数组,对对数组中的变量按照第一过滤规则进行过滤,将一条数据中的变量用逗号连接后两边加括号,再用逗号连接多条数据,过滤完毕后,所述第六类变量通过过滤操作。
7、根据权利要求5所述的方法,其特征在于,
所述第一类变量至少包括字段名变量,和/或,表名变量;
所述第五类变量包括需要插入的字段名变量和字段值变量;
所述第六类变量位于需要插入的至少一条数据中,包括字段值变量。
8、根据权利要求1所述的方法,其特征在于,如果所述用于构造SQL语句的信息是针对更新类型的SQL语句的信息,则所述所有变量至少包括以下其中之一或任意组合:第一类变量、第二类变量、第三类变量、第四类变量、第五类变量。
9、根据权利要求8所述的方法,其特征在于,所述对所有变量进行过滤的操作包括:
从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;
从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;
从所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;
从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作;
从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为一一对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作。
10、根据权利要求8所述的方法,其特征在于,
所述第一类变量至少包括字段名变量,和/或,表名变量;
所述第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;
所述第三类变量至少包括属于SQL的LIMIT语句中的变量;
所述第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量;
所述第五类变量包括需要插入的字段名变量和字段值变量。
11、根据权利要求3、6或9所述的方法,其特征在于,所述按照第一过滤规则进行过滤的操作包括:
若被执行过滤操作的变量的类型为数据值,则将该变量两端加上单引号;
若被执行过滤操作的变量的类型为非数值型,则判断该变量是否已经经过转义操作,若已经过转义操作,则先进行去除转义操作后,再进行转义操作,若未经过转义操作,则对所述变量进行转义操作;之后,将转义后的变量两端加上单引号。
12、一种构造SQL语句的装置,其特征在于,包括:
获取单元,获取用于构造SQL语句的信息,从所述信息中查找出所有变量;
非变量处理单元,用于将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;
过滤单元,用于对所述所有变量进行过滤操作;
SQL语句生成单元,用于将过滤后的所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。
13、根据权利要求12所述的装置,其特征在于,所述过滤单元包括:
第一类变量过滤单元,用于从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;
第二类变量过滤单元,用于从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;
第三类变量过滤单元,用于从所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;
第四类变量过滤单元,用于从所述所有变量中找出属于第四类的变量,将所述第四类型的变量全部放入一个数组中,对所述数组中的变量按照第一过滤规则进行过滤,将过滤后的变量用逗号连接,过滤完毕后,所述第四类变量通过过滤操作;
第五类变量过滤单元,用于从所述所有变量中找出属于第五类的变量,所述第五类变量包括需要插入的字段名变量和字段值变量,将需要插入的字段名变量和字段值变量分别作为一一对应的数组的键值和数据的值,对数组中的变量按照第一过滤规则进行过滤,将数组中的键值和数组的值用等号连接,再用逗号将整个数组连接,过滤完毕后,所述第五类变量通过过滤操作;
第六类变量过滤单元,用于从所述所有变量中找出属于第六类的变量,所述第六类变量位于需要插入的至少一条数据中,将需要插入的至少一条数据放入一个数组,多条数据组成一个二维数组,对对数组中的变量按照第一过滤规则进行过滤,将一条数据中的变量用逗号连接后两边加括号,再用逗号连接多条数据,过滤完毕后,所述第六类变量通过过滤操作。
14、根据权利要求13所述的装置,其特征在于,
所述第一类变量至少包括字段名变量,和/或,表名变量;
所述第二类变量至少包括属于SQL的WHERE语句查询条件中的变量;
所述第三类变量至少包括属于SQL的LIMIT语句中的变量;
所述第四类变量至少包括属于SQL的WHERE语句中IN子句中的变量;
所述第五类变量包括需要插入的字段名变量和字段值变量;
所述第六类变量位于需要插入的至少一条数据中,包括字段值变量。
CN2008101851176A 2008-12-09 2008-12-09 一种构造sql语句的方法及装置 Active CN101425117B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2008101851176A CN101425117B (zh) 2008-12-09 2008-12-09 一种构造sql语句的方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2008101851176A CN101425117B (zh) 2008-12-09 2008-12-09 一种构造sql语句的方法及装置

Publications (2)

Publication Number Publication Date
CN101425117A true CN101425117A (zh) 2009-05-06
CN101425117B CN101425117B (zh) 2010-12-22

Family

ID=40615727

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2008101851176A Active CN101425117B (zh) 2008-12-09 2008-12-09 一种构造sql语句的方法及装置

Country Status (1)

Country Link
CN (1) CN101425117B (zh)

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103338208A (zh) * 2013-07-16 2013-10-02 五八同城信息技术有限公司 一种sql注入防御的方法和系统
CN104714975A (zh) * 2013-12-17 2015-06-17 航天信息股份有限公司 一种动态的查询语句处理方法及其装置
CN105184150A (zh) * 2015-08-28 2015-12-23 李立中 一种语句预处理方法、装置以及语句的解释方法、装置
CN105912594A (zh) * 2016-04-05 2016-08-31 深圳市深信服电子科技有限公司 Sql语句处理方法和系统
CN106548071A (zh) * 2016-08-09 2017-03-29 北京安天电子设备有限公司 一种动态检测sql注入点的方法及系统
CN112115466A (zh) * 2020-08-26 2020-12-22 广州锦行网络科技有限公司 一种绕过select关键字的sql注入方法

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6611834B1 (en) * 2000-01-12 2003-08-26 International Business Machines Corporation Customization of information retrieval through user-supplied code
CN100464329C (zh) * 2005-06-14 2009-02-25 联想(北京)有限公司 动态结构化查询语言语句的构造方法
CN101312393B (zh) * 2007-05-24 2011-08-31 北京启明星辰信息技术股份有限公司 一种sql注入漏洞检测方法及系统

Cited By (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103338208A (zh) * 2013-07-16 2013-10-02 五八同城信息技术有限公司 一种sql注入防御的方法和系统
CN104714975A (zh) * 2013-12-17 2015-06-17 航天信息股份有限公司 一种动态的查询语句处理方法及其装置
CN105184150A (zh) * 2015-08-28 2015-12-23 李立中 一种语句预处理方法、装置以及语句的解释方法、装置
CN105184150B (zh) * 2015-08-28 2018-08-14 李立中 一种语句预处理方法、装置以及语句的解释方法、装置
CN105912594A (zh) * 2016-04-05 2016-08-31 深圳市深信服电子科技有限公司 Sql语句处理方法和系统
CN105912594B (zh) * 2016-04-05 2020-01-07 深信服科技股份有限公司 Sql语句处理方法和系统
CN106548071A (zh) * 2016-08-09 2017-03-29 北京安天电子设备有限公司 一种动态检测sql注入点的方法及系统
CN112115466A (zh) * 2020-08-26 2020-12-22 广州锦行网络科技有限公司 一种绕过select关键字的sql注入方法
CN112115466B (zh) * 2020-08-26 2021-05-14 广州锦行网络科技有限公司 一种绕过select关键字的sql注入方法

Also Published As

Publication number Publication date
CN101425117B (zh) 2010-12-22

Similar Documents

Publication Publication Date Title
EP3560143B1 (en) Data isolation in a blockchain network
CN101425117B (zh) 一种构造sql语句的方法及装置
Upton et al. CodeIgniter for rapid php application development
US8166009B2 (en) Method and apparatus for optimistic locking using SQL select, update, delete, and insert statements
US7861215B2 (en) Method, system, and program product for modeling processes
JP2020531975A (ja) ブロックチェーンのリンクの暗号保護され且つフィルタリングされ且つソートされたトランザクションデータセットの集合を提供する装置
CN101662462A (zh) 提供针对跨域交互的运行时脆弱性防护的方法和系统
US20190354944A1 (en) Edit transactions for blockchains
Lhotka et al. Expert VB 2005 business objects
CN103136621B (zh) 工程送审表单的审核流程的在线管理方法
Sendiang et al. Minimization of SQL injection in scheduling application development
Dahl et al. Structured semantics for the CORAS security risk modelling language
CN106980638A (zh) 操作记录系统、方法和操作对象变更信息查询方法
WO2020247115A1 (en) Subscription to edits of blockchain transaction
JP5341695B2 (ja) 情報処理システム、情報処理方法、およびプログラム
JP5640752B2 (ja) 攻撃模倣テスト方法、攻撃模倣テスト装置及び攻撃模倣テストプログラム
CN116069738B (zh) 根区文件的生成方法、终端设备及计算机可读存储介质
CN101958905A (zh) 一种命令管理方法、装置及系统
KR102300467B1 (ko) 스프레드시트 문서에 포함된 표를 이용한 지식 데이터베이스의 구축 및 상기 지식 데이터베이스에 대한 사용자 접근을 가능하게 하는 지식 데이터베이스 관리 장치 및 그 동작 방법
Knaddison Cracking Drupal: A Drop in the Bucket
Huang Designing Security into Software Systems using Threat Modeling.
Liu Constructing server for ECG monitoring application Using Java Spring Boot
Bell MySQL Database Service
Klausen Java 11: Web applications and Java EE: Software development
Nekvindová MetaRMS-information systems building platform

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 1129937

Country of ref document: HK

C14 Grant of patent or utility model
GR01 Patent grant
REG Reference to a national code

Ref country code: HK

Ref legal event code: GR

Ref document number: 1129937

Country of ref document: HK

TR01 Transfer of patent right

Effective date of registration: 20201223

Address after: Room 701-2, 528 Yan'an Road, Xiacheng District, Hangzhou City, Zhejiang Province

Patentee after: ZHEJIANG INTIME E-COMMERCE Co.,Ltd.

Address before: Cayman Islands Grand Cayman capital building, a four storey No. 847 mailbox

Patentee before: Alibaba Group Holding Ltd.

TR01 Transfer of patent right