一种基于语法分析的SQL防注入方法和装置与流程

文档序号:13332561阅读:170来源:国知局
一种基于语法分析的SQL防注入方法和装置与流程

本发明涉及网络安全技术领域,尤其是一种基于语法分析的sql防注入方法和装置。



背景技术:

sql注入是一种常用的且易于实施的攻击手段,对网络应用程序的安全构成严重威胁。目前sql注入的防范主要有手工检查、自动过滤、sql命令编码以及专用api等几种方法。

手工检查要求应用开发人员在程序中添加针对用户输入信息的检查代码。开发人员需确切地区分什么是合法的输入信息,才能够精确过滤掉恶意输入。然而复杂架构下的应用程序需要处理大量用户输入,手工检查不仅极大地考验着开发人员的防sql注入编码经验,也让程序变得难以维护。对于已上线运行的应用而言,为程序订制防sql注入的升级补丁费用太高。

自动过滤是在网络服务前端增加一个应用级的防火墙,在接收到用户输入信息时进行集中检查,过滤掉恶意输入,而过滤程序通常采用特征字符串匹配算法,往往仅凭预先定义好的一系列正则表达式进行过滤,精心构造的恶意输入很容易绕过这种过滤程序。

sql命令编码方法假设用户输入信息中不应该包含sql命令,首先将sql语句中的非用户输入部分的所有控制命令编码,编码后的sql语句在提交给数据库执行前先经过sql代理解码,sql代理如果发现无法解码的sql命令,则判定为用户输入了非法的控制命令。这种方法涉及到对web服务器和数据库服务器平台软件的大量修改,实现和安装都十分繁琐。很多新的高级语言将常用的数据库操作封装成一些专用的api函数,程序员不需要构造sql字符串,因此也不会有sql注入的风险。新的应用程序使用专用api能够避免sql注入,然而对于已经运行的大量应用而言则无能为力。



技术实现要素:

本发明的目的是提供一种基于语法分析的sql防注入方法和装置,该方法采用简单的特殊sql文法就能够过滤绝大多数sql注入攻击,不需要修改已有的应用程序代码,也不需要修改任何服务器平台软件。

为实现上述目的,本发明采用下述技术方案:

一种基于语法分析的sql防注入方法,包括以下步骤:

获取用户表单输入;

对用户表单输入进行预处理操作;

根据构建的词法规则识别预处理操作后语句中的词素;

根据构建的语法规则对词素进行语法分析,提炼出抽象语法结构串;

判断抽象语法结构串与标准结构串是否匹配,如果匹配,则判定用户输入为简单结构,不构成sql注入攻击;如果不匹配,则判定用户输入为复杂结构,构成sql注入攻击。

进一步地,在对用户表单输入进行预处理操作之前,还包括:

提取用户表单输入,加入关键字组装成完整的sql语句。

进一步地,所述预处理操作,包括:

对用户表单输入进行过滤注释和转换编码,所述过滤注释包括去掉用户表单输入中的干扰字符串,所述转换编码包括对用户表单输入中的十六进制编码进行转换。

进一步地,所述根据构建的词法规则识别预处理操作后语句中的词素,包括,

识别出预处理后的用户表单输入中的单词,判断单词是属于关键字、变量名、常量名中的哪一种,并形成词素列表。

进一步地,所述根据构建的语法规则对词素进行语法分析,提炼出抽象语法结构串,包括:

对词素列表进行语法分析,根据关键字提炼出用户输入的抽象字符串,并判断抽象字符串的类型。

进一步地,所述抽象字符串的类型,包括:

非注入,指正常用户输入,不构成注入攻击;值注入,将表达式右值替换为子查询语句或算术表达式;条件注入,扩展sql语句的条件表达式;组合注入,利用sql组合运算符构造复合查询来得到额外的数据库信息;语句注入,在原sql语句后面附加额外的语句。

进一步地,所述标准结构串为非注入输入类型,语法表达式为a=vanda=v,即单个或多个a=v,这里的a表示变量,v表示值。

一种基于语法分析的sql防注入装置,包括:

输入提取模块,完成对用户输入的提取;

预处理模块,完成对用户输入的过滤注释和转换编码的辅助工作;

词素列表提取模块,完成对用户输入单词的提取,并对用户输入单词的词性进行分析形成词素列表;

语法结构分析模块,对词素列表进行分析,完成抽象字符串的抽取;

语法结构串比对模块,对抽取抽象字符串与标准字符串进行比较,判断是否是sql注入。

进一步地,还包括:

sql语句组装模块,对提取的用户输入加入关键字形成完整的sql语句。

发明内容中提供的效果仅仅是实施例的效果,而不是发明所有的全部效果,上述技术方案中的一个技术方案具有如下优点或有益效果:

本发明提出的sql语句语法预分析策略是一种防范sql注入攻击的新的方法,该方法提取用户的表单输入,将其组装到完整的sql语句中,对组装语句进行语法分析,寻找可能发生注入的语法结构。该方法判定sql注入的唯一依据是抽象的语法结构串,而非具体的特征字符串。组装sql语句语法预分析法采用简单的特殊sql文法就能够过滤绝大多数sql注入攻击。增强的文法有助于进一步提高攻击识别率,有效地避免了特征字符串匹配策略中的矛盾。

附图说明

此处所说明的附图用来提供对本发明的进一步解释,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是本发明基于语法分析的sql防注入方法实施例一的方法流程图;

图2是本发明基于语法分析的sql防注入方法实施例二的方法流程图;

图3是本发明基于语法分析的sql防注入装置实施一结构图;

图4是本发明基于语法分析的sql防注入装置实施二结构图。

具体实施方式

为能清楚说明本方案的技术特点,下面通过具体实施方式,并结合其附图,对本发明进行详细阐述。下文的公开提供了许多不同的实施例或例子用来实现本发明的不同结构。为了简化本发明的公开,下文中对特定例子的部件和设置进行描述。此外,本发明可以在不同例子中重复参考数字和/或字母。这种重复是为了简化和清楚的目的,其本身不指示所讨论各种实施例和/或设置之间的关系。

如图1所示,一种基于语法分析的sql防注入方法,包括以下步骤:

s1、获取用户表单输入;

s2、对用户表单输入进行预处理操作;预处理规则用于完成过滤注释、转换编码等辅助工作;预处理过程用于去掉用户输入中的干扰字符串以及十六进制编码等,攻击者往往利用这些字符串避开基于特征字符串匹配的过滤程序。

s3、根据构建的词法规则识别预处理操作后语句中的词素;识别出预处理后的用户表单输入中的单词,判断单词是属于关键字、变量名、常量名中的哪一种,并形成词素列表。

s4、根据构建的语法规则对词素进行语法分析,提炼出抽象语法结构串;对词素列表进行语法分析,根据关键字提炼出用户输入的抽象字符串,并判断抽象字符串的类型。

s5、判断抽象语法结构串与标准结构串是否匹配,如果匹配,则判定用户输入为简单结构,不构成sql注入攻击;如果不匹配,则判定用户输入为复杂结构,构成sql注入攻击。语法结构串只记录组装sql语句的where子句的语法抽象,注意语法规则了采用的是bison指定格式的上下文无关文法。

由于sql语句的高度结构化,无论复合结构的用户输入被包含缺陷代码的应用程序最终组装到什么样的sql语句中,都会导致后台数据库对该语句的错误解释,从而引发一次sql注入攻击,因此一旦在语法分析中发现复合结构的用户输入,就将其判定为恶意的sql注入字符串。

如表1所示,正常的用户输入是具有逻辑整体含义的简单结构,代表用户id号、姓名等信息;而实施sql注入的字符串一定是包含sql语法片段的复合结构。这是因为sql注入攻击本质上是希望后台数据库的sql解释程序按照不同的方式解释组装好的sql语句,如果用户输入的字符串不包含sql语法片段,显然无法达到这个目的。

表1用户输入字符串

通常的过滤程序通过查找用户输入字符串中的sql语法片段来判断用户输入是否为复合结构,脱离用户输入所处的上下文单独进行分析是造成过滤程序产生较多错漏的根源。作为程序前端的应用级防火墙,尽管无法确切地了解用户输入的上下文,但是sql语言的高度结构化使得可以通过为用户赋予一个典型的上下文环境,组装一条完整的sql语句来进行语法预分析,从而确切地判断用户输入是否为恶意的复合结构。

构造简单的select语句作为上下文环境,称为标准select语句,如下所示:

selectcolfromtblwherea=vanda=v

selectcolfromtblwherea=‘v’anda=v

将用户输入字符串代入where子句的第一个条件表达式右值v,得到完整的sql语句,如下所示,用户输入是否为复合结构变得一目了然。

selectcolfromtblwherea=selecttop1colfromtblanda=v

selectcolfromtblwherea=‘1’or‘any’=‘any’anda=v

sql语法预分析的目的是判断用户输入是否为恶意的复合结构,分析手段则是比较组装的select语句和标准select语句之间的语法结构串之间的异同。语法结构串是select语句where子句语法结构的简单抽象,由复合结构的输入组装得到的select语句where子句的语法结构串必然不同于标准select语句where子句的标准结构串。

根据sql的语法特征,可以归纳出sql注入攻击语句所对应的几种语法结构串,如表2所示。a:表示变量v:表示值q:表示查询,e:表示计算式,u:表示sql中的union查询,s:表示系统函数调用。a和v是任意非sql关键字的字符串,分别表示条件表达式的左值和右值;q是独立sql查询语句;e是sql的算术表达式;u表示sql中的组合运算符;s是sql内置的命令或存储过程组成的独立语句。

表2sql注入攻击语法抽象

非注入指正常用户输入,不构成注入攻击;值注入是将表达式右值替换为子查询语句或算术表达式;条件注入是扩展sql语句的条件表达式;组合注入是利用sql组合运算符构造复合查询企图得到额外的数据库信息;语句注入是在原sql语句后面附加额外的语句。语法结构a=v作为条件表达式的抽象,不一定是等式,还可能是不等式或者sql中的like表达式或in表达式等等。

表3典型的语法预分析实例

如表3所示,对一个典型的sql注入字符串进行语法预分析进行分析的全过程。通过搭建服务器,通过代理访问的方式,本发明可用于各种系统的防sql注入攻击。

如图2所示,一种基于语法分析的sql防注入方法,包括以下步骤:

s1、获取用户表单输入;

s2、提取用户表单输入,加入关键字组装成完整的sql语句;

s3、对组装成的完整sql语句进行预处理操作;

s4、根据构建的词法规则识别预处理操作后语句中的词素;

s5、根据构建的语法规则对词素进行语法分析,提炼出抽象语法结构串;

s6、判断抽象语法结构串与标准结构串是否匹配,如果匹配,则判定用户输入为简单结构,不构成sql注入攻击;如果不匹配,则判定用户输入为复杂结构,构成sql注入攻击。

如图3所示,一种基于语法分析的sql防注入装置,包括:

输入提取模块101,完成对用户输入的提取;

预处理模块102,完成对用户输入的过滤注释和转换编码的辅助工作;

词素列表提取模块103,完成对用户输入单词的提取,并对用户输入单词的词性进行分析形成词素列表;

语法结构分析模块104,对词素列表进行分析,完成抽象字符串的抽取;

语法结构串比对模块105,对抽取抽象字符串与标准字符串进行比较,判断是否是sql注入。

如图4所示,一种基于语法分析的sql防注入装置,包括:

输入提取模块101,完成对用户输入的提取;

sql语句组装模块102,对提取的用户输入加入关键字形成完整的sql语句;

预处理模块103,完成对用户输入的过滤注释和转换编码的辅助工作;

词素列表提取模块104,完成对用户输入单词的提取,并对用户输入单词的词性进行分析形成词素列表;

语法结构分析模块105,对词素列表进行分析,完成抽象字符串的抽取;

语法结构串比对模块106,对抽取抽象字符串与标准字符串进行比较,判断是否是sql注入。

上述虽然结合附图对本发明的具体实施方式进行了描述,但并非对本发明保护范围的限制,所属领域技术人员应该明白,在本发明的技术方案的基础上,本领域技术人员不需要付出创造性劳动即可做出的各种修改或变形仍在本发明的保护范围以内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1