具体实施方式
虽然流程图将各项操作描述成顺序的处理,但是其中的许多操作可以 被并行地、并发地或者同时实施。各项操作的顺序可以被重新安排。当其 操作完成时处理可以被终止,但是还可以具有未包括在附图中的附加步骤。 处理可以对应于方法、函数、规程、子例程、子程序等等。
计算机设备包括用户设备与网络设备。其中,用户设备或客户端包括 但不限于电脑、智能手机、PDA等;网络设备包括但不限于单个网络服务 器、多个网络服务器组成的服务器组或基于云计算的由大量计算机或网络 服务器构成的云。计算机设备可单独运行来实现本发明,也可接入网络并 通过与网络中的其他计算机设备的交互操作来实现本发明。计算机设备所 处的网络包括但不限于互联网、广域网、城域网、局域网、VPN网络等。
在这里可能使用了术语“第一”、“第二”等等来描述各个单元,但 是这些单元不应当受这些术语限制,使用这些术语仅仅是为了将一个单元 与另一个单元进行区分。这里所使用的术语“和/或”包括其中一个或更多 所列出的相关联项目的任意和所有组合。当一个单元被称为“连接”或“耦 合”到另一单元时,其可以直接连接或耦合到所述另一单元,或者可以存 在中间单元。
这里所使用的术语仅仅是为了描述具体实施例而不意图限制示例性实 施例。除非上下文明确地另有所指,否则这里所使用的单数形式“一个”、 “一项”还意图包括复数。还应当理解的是,这里所使用的术语“包括” 和/或“包含”规定所陈述的特征、整数、步骤、操作、单元和/或组件的 存在,而不排除存在或添加一个或更多其他特征、整数、步骤、操作、单 元、组件和/或其组合。
下面结合附图和较佳的实施例对本发明作进一步说明。
如图1所示,本实施例中公开一种SQL注入攻击的检测方法,该方法 包括:
S101、获取待检测的SQL;
S102、将所述待检测的SQL按照预设规则分解为多个SQL样本;
S103、将所述多个SQL样本分别输入到对应数量的预设决策模型中, 分别得到决策结果;
S104、将与多个SQL样本数量相对应的决策结果进行比较,根据比较 结果判断待检测的SQL是否为注入攻击。
本发明的SQL注入攻击的检测方法由于包括:获取待检测的SQL;将 所述待检测的SQL按照预设规则分解为多个SQL样本;将所述多个SQL样 本分别输入到对应数量的预设决策模型中,分别得到决策结果;将与多个 SQL样本数量相对应的决策结果进行比较,根据比较结果判断待检测的SQL 是否为注入攻击。采用这种方式就可以对获取的SQL进行分解为多个SQL 样本,对每个样本进行处理,获取决策结果,然后根据决策结果的数量确 定是否为SQL注入攻击,从而更加精确的检测SQL注入攻击。
SQL(结构化查询语言)是一种特殊目的的编程语言,是一种数据库查 询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统; 同时也是数据库脚本文件的扩展名。结构化查询语言包含6个部分:
一:数据查询语言(DQL:Data Query Language):其语句,也称为“数 据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保 留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保 留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他 类型的SQL语句一起使用。
二:数据操作语言(DML:Data Manipulation Language):其语句包 括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中 的行。也称为动作查询语言。
三:事务处理语言(TPL):它的语句能确保被DML语句影响的表的所 有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
四:数据控制语言(DCL):它的语句通过GRANT或REVOKE获得许可, 确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或 REVOKE控制对表单个列的访问。
五:数据定义语言(DDL):其语句包括动词CREATE和DROP。在数据 库中创建新表或删除表(CREAT TABLE或DROP TABLE);为表加入索引等。 DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询 的一部分。
六:指针控制语言(CCL):它的语句,像DECLARE CURSOR,FETCH INTO 和UPDATEWHERE CURRENT用于对一个或多个表单独行的操作。
本实施例中示例的,所述将所述待检测的SQL按照预设规则分解为多 个SQL样本的步骤具体包括:
根据预设数据库信息和历史SQL信息获取带有检测结果标记的标记 SQL语法树;
将所述待检测的SQL按照对应的标记SQL语法树进行转换处理;
从处理后的标记SQL语法树中随机抽取特征值,并重复多次,得到多 个SQL样本。
本实施例中示例的,所述根据预设数据库信息和历史SQL信息获取带 有检测结果标记的SQL语法树的步骤具体包括:
根据预设数据库及预设语法和关键字创建初始SQL语法树;
获取历史SQL数据和对相应历史SQL数据的检测结果;
将检测结果标记到对应的历史SQL数据上;
将已标记的历史SQL数据按照对应的初始SQL语法树进行转换处理, 获取带有检测结果标记的标记SQL语法树。
采用这种方式就可以根据不同的SQL数据库建立不同SQL语法树,例 如select语法中对应的是数据操作语言(DML:Data Manipulation Language),drop语法对应的是数据定义语言(DDL),关键字例如Integer, Keyword等,对不同类型的SQL数据库建立语法树,这样在接收到待检测 的SQL后就可以将其归类到相应的SQL语法树中,从而按照标准的SQL语法树将待检测的SQL进行转换。而且,本实施例中采用以往的历史数据生 成对应的SQL语法树,历史数据中已经可以根据以往的实际结果得知该对 应的历史SQL是否为注入攻击,本实施例中将是否为注入攻击进行标记, 从而在上述转换中将标记加入进去,得到带有检测结果标记的标记SQL语 法树。标记也可采用符号标记或数字标记等等。
例如,对于历史数据“select 2 from admin”,得知这个数据是注入 攻击,因此标记为“select 2 from admin”0,其中0为标记,代表该 历史数据为注入攻击。当然也可以采用其他标记,例如字母或符号等等。
而对应select语法的语言为DML,根据DML的数据库及select语法 和关键字创建初始SQL语法树:
[‘DML’,‘Integer’,‘Keyword’,‘Keyword’];
得到该初始SQL语法树之后,将对应的带有标记的历史数据转换为带 检测结果标记的标记SQL语法树:
[‘DML’,‘Integer’,‘Keyword’,‘Keyword’,‘0’];其中 0为标记,代表该历史数据为注入攻击。
又如,对于历史数据“INSERT INTO Persons VALUES('Gates','Bill', 'Xuanwumen 10','Beijing')”,得知这个数据是注入攻击,因此标记为 “INSERT INTOPersons VALUES('Gates','Bill','Xuanwumen 10', 'Beijing')”0,其中0为标记,代表该历史数据为注入攻击。
而对应INSERT语法的语言为DML,根据DML的数据库及INSERT语法 和关键字创建初始SQL语法树:
[‘DML’,‘Keyword’,‘Identifier',‘Keyword’,‘Parenthesis’];
得到该初始SQL语法树之后,将对应的带有标记的历史数据转换为带 检测结果标记的标记SQL语法树:
[‘DML’,‘Keyword’,‘Identifier',‘Keyword’,‘Parenthesis’, ‘0’];其中0为标记,代表该历史数据为注入攻击。
又如,对于历史数据“drop*from 111”,得知这个数据是合法的, 并非注入攻击,因此标记为“drop*from 111”1,其中1为标记,代 表合法。当然也可以采用其他标记,例如字母或符号等等。
而对应drop语法的语言为DDL,根据DDL的数据库及drop语法和关 键字创建初始SQL语法树:
[‘DDL’,‘Wildcard’,‘Keyword’,‘Integer’];
得到该初始SQL语法树之后,将对应的带有标记的历史数据转换为带 检测结果标记的标记SQL语法树:
[‘DDL’,‘Wildcard’,‘Keyword’,‘Integer’,‘1’];其中 1为标记,代表合法。
本实施例中示例的,所述方法进一步包括:
检测每个标记SQL语法树的长度,获取其中最长的标记SQL语法树的 长度;
将其余的标记SQL语法树的长度调整至与最长的标记SQL语法树的长 度一致。
例如,上述三个案例中,[‘DML’,‘Integer’,‘Keyword’,‘Keyword’, ‘0’]的长度为4;[‘DML’,‘Keyword’,‘Identifier',‘Keyword’, ‘Parenthesis’,‘0’]的长度为5;[‘DDL’,‘Wildcard’,‘Keyword’, ‘Integer’,‘1’]的长度为4。其中检测结果标记不算在长度中,即本 实施例中的0和1不算在长度中。为了便于抽取特征值,可将各个标记SQL 语法树的长度调整到一直。例如可将较短的语句调整到与最长的语句长度 相同。
本实施例中示例的,所述将其余的标记SQL语法树的长度调整至与最 长的标记SQL语法树的长度一致的步骤具体包括:
根据其余的标记SQL语法树与最长的标记SQL语法树的长度的长度差 值,在其余的标记SQL语法树中添加占位符作为特征值。
本实施例中上述三个案例中最长的长度为5,根据其他的语句的长度 与最长的长度差,可添加占位符,例如[‘DML’,‘Integer’,‘Keyword’, ‘Keyword’,‘0’]的长度为4,因此可添加一个占位符,占位符可以是 数字、字母、符合或几种的结合等等,本实施例中采用NULL作为占位符, 得到长度调整后的语句:[‘DML’,‘Integer’,‘Keyword’,‘Keyword’,‘NULL’‘0’]。
又如[‘DDL’,‘Wildcard’,‘Keyword’,‘Integer’,‘1’] 的长度为4,因此可添加一个占位符,本实施例中采用NULL作为占位符, 得到长度调整后的语句:[‘DDL’,‘Wildcard’,‘Keyword’,‘Integer’, ‘NULL’,‘1’]。这样上述两个语句的长度就与最长的语句长度相同了。 从而方便从语句中随机选取特征值,组成多个SQL样本。
本实施例中示例的,所述预设决策模型为随机森林模型。随机森林指 的是利用多棵树对样本进行训练并预测的一种分类器。机器学习中,随机 森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出 的类别的众数而定。Leo Breiman和AdeleCutler发展出推论出随机森 林的算法。而"Random Forests"是他们的商标。这个术语是1995年由 贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合Breimans的"Bootstrap aggregating"想法和Ho的"randomsubspace method"以建造决策树的集 合。
本实施例中示例的,所述将所述多个SQL样本分别输入到对应数量的 预设决策模型中,分别得到决策结果的步骤具体包括:
根据SQL样本的属性计算每个属性的信息增益,选取信息增益最大的 作为根节点属性;
根据根结点属性的每个可能值对应生成分支,并把SQL样本排列到预 设的分支之下;
用每个分支结点关联的SQL样本来选取在该结点被测试的最佳属性, 根据最佳属性得到决策结果。
本实施例中示例的,所述决策结果中包括合法结果和注入攻击结果; 所述将与多个SQL样本数量相对应的决策结果进行比较,根据比较结果判 断待检测的SQL是否为注入攻击的步骤包括:
将多个决策结果进行比较,若合法结果的数量大于注入攻击结果的数 量,则所述待检测的SQL为合法;若合法结果的数量不大于注入攻击结果 的数量,则所述待检测的SQL为注入攻击。
例如上述案例中,如果根据多个SQL样本中得到的检测结果中,若合 法结果的数量大于注入攻击结果的数量,则所述待检测的SQL为合法;若 合法结果的数量不大于注入攻击结果的数量,则所述待检测的SQL为注入 攻击。具体的,如果结果为1的SQL样本的数量大于结果为0的SQL样本 的数量,那么待检测的SQL为合法;如果结果为1的SQL样本的数量不大 于结果为0的SQL样本的数量,那么待检测的SQL为注入攻击。
为进一步阐述本发明,具体示例的过程为:
预先处理的步骤:
一、创建SQL语法树及训练数据特征,该步骤进一步包括:
a).根据常见的数据库(例如Mysql)的语法及关键字等,构建初始SQL 语法树。例如包括DDL(Data Definition Language,数据定义语 言),DML(Data ManipulationLanguage,数据操作语言),DCL(Data Control Language,数据控制语言),TCL(Transaction Control Language,事务控 制语言),关键字如keyword,identifier,parenthesis,integer等,其 中语法和关键字在对应的数据库中已有。
b).将带有检测结果标记的历史SQL数据根据初始SQL语法树转换成带 有检测结果标记的标记SQL语法树。例如下面5组原始数据SQL及其转换后的 结果,每组中第一行是原始SQL数据,也为历史SQL数据,第二行是标记SQL 语法树。0表示合法SQL,1表示注入SQL。
i.“select 2 from admin”0
['DML','Integer','Keyword','Keyword',’0’]
ii.“INSERT INTO Persons VALUES('Gates','Bill','Xuanwumen 10','Beijing')”0
['DML','Keyword','Identifier','Keyword', 'Parenthesis',’0’]
iii.“drop*from 111”1
['DDL','Wildcard','Keyword','Integer',’1’]
iv.“hhh from database alter(drop table)”1
['Identifier','Keyword','Keyword','DDL', 'Parenthesis',’1’]
v.“exec hhh tabe ttt aaa”1
['Keyword','Identifier','Identifier','Error', 'Punctuation',’1’]
c).考虑到SQL语句的长度不一,将SQL语句长度作为一个特征加入到特 征空间,因此,上面例子中的5句SQL变为:
['DML','Integer','Keyword','Keyword',’4’,’0’]
['DML','Keyword','Identifier','Keyword','Parenthesis',’ 5’,’0’]
['DDL','Wildcard','Keyword','Integer',’4’,’1’]
['Identifier','Keyword','Keyword','DDL','Parenthesis',’ 5’,’1’]
['Keyword','Identifier','Identifier','Error', 'Punctuation',’5’,’1’]
将原始训练集转换成形如上述的SQL语法树集。
二、使用上述建立好的训练数据使用随机森林进行模型训练;
a).设上述的SQL语法树集共有N个样本,每个样本有M个特征值,这里 需要说明的是:由于每句SQL长度不一,假设训练集中最长的SQL长度为L, 则应满足M>=L,对于SQL长度小于M的样本,不足的特征值用NULL代替。例 如:当M=6时,上述5句SQL样本变为:
['DML','Integer','Keyword','Keyword',’4’,’NULL’,’0’]
['DML','Keyword','Identifier','Keyword','Parenthesis',’ 5’,’0’]
['DDL','Wildcard','Keyword','Integer',’4’,’NULL’,’1’]
['Identifier','Keyword','Keyword','DDL','Parenthesis',’ 5’,’1’]
['Keyword','Identifier','Identifier','Error', 'Punctuation',’5’,’1’]
b).从N个样本随机有放回选取n(n<N)个样本,从这n个样本随机抽取 m(m<M)个特征值得到样本T,重复s次。假设每次得到的样本为ti,i取值 为1到s的所有正整数;其中M,N,m,n,s均为自然数,s大于等于2。
c).将上述得到的样本ti构造决策树,该步骤进一步包括:
(1).根据ti样本集的属性计算每个属性的信息增益,选取信息增益最大 的作为根节点属性。
(2).为根结点属性的每个可能值产生一个分支,并把训练样例排列到 适当的分支之下。
(3).重复这个过程,用每个分支结点关联的训练样例来选取在该点被 测试的最佳属性。
检测步骤:
三、将待检测SQL按照步骤一的规则切分成s个SQL样本(一句SQL 对应于s个SQL样本),分别输入到步骤二中得到的s棵决策树,在s棵决 策树得到结果,具体的可根据最佳属性得到决策结果;其中,若合法结果 的数量大于注入攻击结果的数量,则所述待检测的SQL为合法;若合法结 果的数量不大于注入攻击结果的数量,则所述待检测的SQL为注入攻击。具体的,如果结果为1的SQL样本的数量大于结果为0的SQL样本的数量, 那么待检测的SQL为合法;如果结果为1的SQL样本的数量不大于结果为 0的SQL样本的数量,那么待检测的SQL为注入攻击。
一种计算机处理设备,包括处理器及计算机可读存储介质,所述处理 器获取所述计算机可读存储介质上的计算机程序,并执行如上述任一所述 方法的步骤。
如图2所示,本实施例中公开一种SQL注入攻击的检测系统,包括:
获取模块201,用于获取待检测的SQL;
分解模块202,用于将所述待检测的SQL按照预设规则分解为多个SQL 样本;
决策模块203,用于将所述多个SQL样本分别输入到对应数量的预设 决策模型中,分别得到决策结果;
比较模块204,用于将与多个SQL样本数量相对应的决策结果进行比 较,根据比较结果判断待检测的SQL是否为注入攻击。
采用这种方式就可以对获取的SQL进行分解为多个SQL样本,对每个 样本进行处理,获取决策结果,然后根据决策结果的数量确定是否为SQL 注入攻击,从而更加精确的检测SQL注入攻击。
以上内容是结合具体的优选实施方式对本发明所作的进一步详细说 明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术 领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若 干简单推演或替换,都应当视为属于本发明的保护范围。