一种构造SQL语句的方法及装置制造方法及图纸

技术编号:2915072 阅读:277 留言:0更新日期:2012-04-11 18:40
本发明专利技术公开了一种构造SQL语句的方法和装置,所述方法包括:获取用于构造SQL语句的信息,从所述信息中查找出所有变量,将除所述变量外的其他用于构造SQL语句的信息全部加上单引号;对所述所有变量进行过滤操作,过滤操作通过后,将所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。应用本发明专利技术,在构造SQL语句时,对SQL语句中的所有变量进行过滤,同时对非变量部分加单引号保护,以避免在初始化过滤之后生成SQL语句之前的中间操作被攻击者利用,从而避免在系统程序执行过程中可能存在的安全隐患,从而保证所生成的SQL语句的安全性。本发明专利技术解决了Web系统程序中的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语句的方法,其特征在于,包括: 获取用于构造SQL语句的信息,从所述信息中查找出所有变量,将除所述变量外的其他用于构造SQL语句的信息全部加上单引号; 对所述所有变量进行过滤操作,过滤操作通过后,将所述变量以及所述单引号内除变量外其他用于构造SQL语句的信息合在一起,生成SQL语句。

【技术特征摘要】
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所述的方法,其特征在于,所述对所有变量进行过滤的操作包括:从所述所有变量中找出属于第一类的变量,若所述第一类变量在预先给定的范围值内,所述第一类变量通过过滤操作;从所述所有变量中找出属于第二类的变量,对所述第二类变量按照第一过滤规则进行过滤,过滤完毕后,所述第二类变量通过过滤操作;从所述所有变量中找出属于第三类的变量,将所述第三类的变量全部强制转换成整数型类型,转换完毕后,所述第三类变量通过过滤操作;从所述所有变量中找出属于第四类的变量,将所...

【专利技术属性】
技术研发人员:林耀纳
申请(专利权)人:阿里巴巴集团控股有限公司
类型:发明
国别省市:KY[开曼群岛]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1