SQL注入缺陷检测方法、系统、设备及存储介质与流程

文档序号:17049460发布日期:2019-03-05 19:53阅读:233来源:国知局
SQL注入缺陷检测方法、系统、设备及存储介质与流程

本发明涉及计算机应用技术领域,尤其涉及一种sql注入缺陷检测方法、系统、设备及存储介质。



背景技术:

sql(structuredquerylanguage,结构化查询语言)注入(sqlinjection)是一种代码注入技术,用于攻击数据驱动的应用程序,其中恶意的sql语句被插入到输入字段中从而被恶意执行。

sql注入缺陷在sql查询的元素源自不可信源的应用程序中出现。如果没有预防措施,不可信数据可能会恶意更改查询,导致信息泄漏或数据修改。

sql注入缺陷最早在2000年左右被提出,其后学者们对sql注入的检测和防护展开了一系列的研究。

典型的一种sql注入例子如下:

(1)用户登录web应用系统时,需要进行身份认证,主要输入用户名和密码两个变量v_usr和v_pwd;

(2)web系统执行合法性检查的sql语句为:

“select*fromuserswhereusername=‘”+v_usr+“’andpassword=‘”+v_pwd+“’”,如果用户登录时用户取为‘admin’or1=1--,那么合法性检查的sql语句等效于select*fromuserswhereusername=‘admin’or1=1;

显然,用户名取‘admin’or1=1--时,无论密码输入多少,都可以登录系统。

sql注入缺陷的检测和防护方式目前主要有两大类,一是系统上线前检测,也称为静态检测;二是系统在线运行防御,也称为动态检测。

动态检测方式是一种黑盒检测方法,对上线的系统进行sql注入缺陷扫描,编制sql注入攻击脚本对web系统进行试探,通过检查http的回应报文内容来判断是否发生sql注入攻击,从而确定是否存在sql注入漏洞。appscan等工具可执行此类安全检测。一篇参考文献:

gouldc,suz,devanbup.jdbcchecker:astaticanalysistoolforsql/jdbcapplications[c].proceedingofthe26thinternationalconferenceonsoftwareengineering(icse).washingtondc:ieeecomputersociety,2004以及另一篇参考文献:

gouldc,suz,devanbup.staticcheckingofdynamicallygeneratedqueriesindatabaseapplications[c].proceedingsof26thinternationalconferenceonsoftwareengineering,2004给出了一种动态生成sql语句进行类型正确性检查的方法来检测是否存在sql注入,该方法的的缺点在于只能检测句法结构或语句类型出现异常的sql注入问题。

静态检测方法是一种白盒检测方法,通过静态语法解析查找web应用代码中可能引发sql注入的环节,在web应用发布前检查代码质量。fortify等工具可执行此类安全检测。静态检测方法可以参照参考文献:

williamgj,viegashj,orsoa.aclassificationofsqlinjectionattacksandcountermeasures[c].proc.ofinternationalsymposiumonsecuresoftwareengineering.2006。此外,参考文献:

wassermanng,suz.ananalysisframeworkforsecurityinwebapplications[c].proceedingsofthefseworkshoponspecificationandverificationofcomponentbasedsystem,2004提出一种自动推理机的方法对添加了输入值后的sql语句进行检查,该方法的缺点在于只能检测出重言式的sql注入攻击。此外,还有一些学者采用机器学习算法对sql注入缺陷进行检测,这一类检测方法的检测率和误报率往往依赖于训练集的大小,机器学习算法检测的方法可以参考文献:

huangyw,huangsk,lintp,etal.webapplicationsecurityassessmentbyfaultinjectionandbehaviormonitoring[c].porceedingofthe11thinternationalworldwideconferecne,2002。

因此,需要提出一种有效的sql注入缺陷检测的方案。



技术实现要素:

针对现有技术中的问题,本发明的目的在于提供一种sql注入缺陷检测方法、系统、设备及存储介质,通过符号表达式图中路径和路径约束条件的判断,能够高效地检测sql注入缺陷。

本发明实施例提供一种sql注入缺陷检测方法,所述方法包括如下步骤:

输入待检测的程序;

生成待检测的程序中各个函数的符号表达式图,所述符号表达式图包括节点和连接节点的边,所述节点包括值节点和运算符节点,所述边包括数据依赖性边和控制依赖性边,其中,所述数据依赖性边是将节点连接到与其有直接数据依赖关系的值节点的有方向性的边,所述控制依赖性边是当存在限定变量的条件时将变量连接到条件的有方向性的边;以及

检测各个函数的符号表达式图中是否存在从用户输入节点到查询语句节点之间的路径且路径约束条件均满足,如果是,则发现sql注入缺陷。

可选地,所述检测各个函数的符号表达式图中是否存在从用户输入节点到查询语句节点之间的路径且路径约束条件均满足,包括如下步骤:

对于各个函数的符号表达式图,从用户输入节点开始对所述符号表达式图进行逆向的深度优先遍历;

遍历到达查询语句节点时,根据所述控制依赖性边查找用户输入节点到查询语句节点之间的路径约束条件,并判断路径约束条件是否均满足,如果是,则发现sql注入缺陷。

可选地,所述方法还包括如下步骤:

生成各个函数的函数摘要,所述函数摘要包括符号摘要,所述符号摘要包括函数输入、函数输出以及函数输入节点到函数输出节点之间路径的约束集。

可选地,对于一函数的符号表达式图,如果存在从用户输入节点到查询语句节点的路径,则该函数的函数摘要还包括输入摘要、输出摘要和传递摘要,其中:

所述输入摘要包括函数输入到查询语句节点的摘要;

所述输出摘要包括用户输入节点到函数输出的摘要;

所述传递摘要包括函数输入到用户输入节点的摘要。

可选地,判断路径约束条件是否均满足,包括如下步骤:

判断当前检测函数中从用户输入节点到查询语句节点之间的路径中是否存在被调函数;

如果是,则将所述被调函数的函数摘要嵌入当前检测函数的符号表达式图,判断当前检测函数中与该被调函数对应的路径约束条件是否满足。

可选地,生成待检测的程序中各个函数的符号表达式图,包括如下步骤:

从所述待检测的程序的底层函数依次向上层函数建立各个函数的符号表达式图;

检测各个函数的符号表达式图时,从底层函数依次向上层函数检测,并从底层函数依次向上层函数生成函数摘要;

检测上层函数的符号表达式图时,将该上层函数的下层函数的函数摘要嵌入该上层函数的符号表达式图中。

可选地,所述输入摘要包括函数输入、函数输入节点到查询语句节点之间路径的约束、分析结果报告、生成报告摘要的相应描述和检查器特定信息;

所述输出摘要包括用户输入、用户输入节点到函数输出节点之间路径的约束、分析结果报告、生成报告摘要的相应描述和检查器特定信息;

所述传递摘要包括函数输入、函数输入节点到用户输入节点之间路径的约束、分析结果报告、生成报告摘要的相应描述和检查器特定信息。

可选地,所述输入摘要的检查器特定信息包括函数输入节点到查询语句节点的路径约束的判断条件,分析结果报告是函数输入节点到查询语句节点之间路径约束是否满足的结果报告,生成报告摘要的相应描述是函数输入节点到查询语句节点之间路径的追溯摘要;

所述输出摘要的检查器特定信息包括用户输入节点到函数输出节点之间路径约束的判断条件,分析结果报告是用户输入节点到函数输出节点之间路径约束是否满足的结果报告,生成报告摘要的相应描述是用户输入节点到函数输出节点之间路径的追溯摘要;

所述传递摘要的检查器特定信息包括函数输入节点到用户输入节点之间路径约束的判断条件,分析结果报告是函数输入节点到用户输入节点之间路径约束是否满足的结果报告,生成报告摘要的相应描述是函数输入节点到用户输入节点之间路径的追溯摘要。

可选地,所述值节点包括终端值节点和非终端值节点,所述终端值节点表示当前函数外生成的未知的值或常量,所述非终端值节点包括当前函数内生成的值。

可选地,所述控制依赖性边指向的一侧为逻辑运算的运算符或布尔值节点。

可选地,用真和假来标记所述控制依赖性边,以表明逻辑运算的所需的结果。

可选地,所述生成待检测的程序中各个函数的符号表达式图之前,还包括如下步骤:

展开所述待检测的程序中的循环。

本发明实施例还提供一种sql注入缺陷检测系统,应用于所述的sql注入缺陷检测方法,所述系统包括:

程序输入模块,用于输入待检测的程序;

符号表达式图生成模块,用于生成待检测的程序中各个函数的符号表达式图,所述符号表达式图包括节点和连接节点的边,所述节点包括值节点和运算符节点,所述边包括数据依赖性边和控制依赖性边,其中,值节点表示,所述数据依赖性边是将节点连接到与其有直接数据依赖关系的值节点的有方向性的边,所述控制依赖性边是当存在限定变量的条件时将变量连接到条件的有方向性的边;以及

缺陷检测模块,用于检测各个函数的符号表达式图中是否存在从用户输入节点到查询语句节点之间的路径且路径约束条件均满足,如果是,则发现sql注入缺陷。

可选地,所述系统还包括:

摘要生成模块,用于生成各个函数的函数摘要,所述函数摘要包括符号摘要,所述符号摘要包括函数输入、函数输出以及函数输入节点到函数输出节点之间路径的约束集。

可选地,对于一函数的符号表达式图,如果存在从用户输入节点到查询语句节点的路径,则该函数的函数摘要还包括输入摘要、输出摘要和传递摘要,其中:

所述输入摘要包括函数输入到查询语句节点的摘要;

所述输出摘要包括用户输入节点到函数输出的摘要;

所述传递摘要包括函数输入到用户输入节点的摘要。

可选地,所述缺陷检测模块采用如下步骤判断路径约束条件是否均满足:

判断当前检测函数中从用户输入节点到查询语句节点之间的路径约束条件中是否存在被调函数;

如果是,则将所述被调函数的函数摘要嵌入当前检测函数,判断当前检测函数中与该被调函数对应的路径约束条件是否满足。

本发明实施例还提供一种sql注入缺陷检测设备,包括:

处理器;

存储器,其中存储有所述处理器的可执行指令;

其中,所述处理器配置为经由执行所述可执行指令来执行所述的sql注入缺陷检测方法的步骤。

本发明实施例还提供一种计算机可读存储介质,用于存储程序,所述程序被执行时实现所述的sql注入缺陷检测方法的步骤。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。

本发明所提供的sql注入缺陷检测方法、系统、设备及存储介质具有下列优点:

本发明提出了一种生成符号表达式图和根据符号表达式图完成sql注入缺陷检测的方案,首先在符号表达式图中建立各个值节点和连接各个值节点的边,根据值节点和边判断是否存在用户输入节点到查询节点的路径,根据控制依赖性边寻找路径约束条件并判断路径约束条件是否均可以满足,从而通过符号表达式图中路径和路径约束条件的判断,能够高效地检测sql注入缺陷。

附图说明

通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显。

图1示出了本发明的sql注入缺陷检测方法的流程图;

图2a-2b示出了本发明一实施例的预建模阶段中展开循环的一个例子;

图3示出了一端示例代码及其未修剪的hssa形式;

图4示出了根据本发明一实施例生成的示例性的seg;

图5a-5d示出了本发明一实施例的生成符号表达式图的过程;

图6a-6c示出了本发明一实施例的生成符号表达式图用于sql缺陷检测的示意图;

图7是本发明一实施例的sql注入缺陷检测系统的结构示意图;

图8是本发明一实施例的sql注入缺陷检测设备的结构示意图;

图9是本发明一实施例的计算机可读存储介质的结构示意图。

具体实施方式

现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本公开将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施方式中。

此外,附图仅为本公开的示意性图解,并非一定是按比例绘制。图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。附图中所示的一些方框图是功能实体,不一定必须与物理或逻辑上独立的实体相对应。可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。

如下以一个sql注入缺陷检测的实例来进行说明。下面是一段使用释放后的内存代码片段:

在该代码中,这里第33行生成了一个sql查询语句,给定用户名和密码,查询用户的信息,然而用户输入的username可能是恶意输入,可能是”usernameor(false”.密码输入”xxx)”这样拼装出来的查询语句就是"select*fromdb_userwhereusername=usernameor(falseandpassword=xxx)",这样就完全避开了密码检测,产生数据泄露等安全问题。

下面是一段修复后的使用释放后的内存代码片段:

该修复示例使用参数查询,字符作为参数的占位符,还会验证用户名参数的长度,防止攻击者提交任意长的用户名。使用preparedstatement类的`set*()`方法来执行强类型检查。此技术可缓解sql注入漏洞,因为输入可通过双引号内的自动陷入正确转义。然而采用该技术,需要修改程序源代码,操作十分麻烦,并且不能完全杜绝sql注入攻击。

为了解决现有技术中的问题,本发明提供了一种sql注入检测方法。如图1所示,本发明一实施例的sql注入检测方法包括如下步骤:

s100:输入待检测的程序;

s200:生成待检测的程序中各个函数的符号表达式图,所述符号表达式图包括节点和连接节点的边,所述节点包括值节点和运算符节点,所述边包括数据依赖性边和控制依赖性边,其中,所述数据依赖性边是将节点连接到与其有直接数据依赖关系的值节点的有方向性的边,所述控制依赖性边是当存在限定变量的条件时将变量连接到条件的有方向性的边;以及

s300:检测当前检测函数的符号表达式图中是否存在从用户输入节点到查询语句节点之间的路径,如果是,则继续步骤s400,否则继续步骤s600;

s400:判断从用户输入节点到查询语句节点之间的路径的路径约束条件是否满足,如果是,则继续步骤s500,否则继续步骤s600;

s500:判定发现sql注入缺陷,可以生成错误报告。

s600:选择下一函数作为当前检测函数,继续步骤s300。

因此,本发明首先在符号表达式图中建立各个值节点和连接各个值节点的边,根据值节点和边判断是否存在用户输入节点到查询节点的路径,根据控制依赖性边寻找路径约束条件并判断路径约束条件是否均可以满足,从而通过符号表达式图中路径和路径约束条件的判断,能够高效地检测sql注入缺陷。

在该实施例中,所述检测各个函数的符号表达式图中是否存在从用户输入节点到查询语句节点之间的路径且路径约束条件均满足,包括如下步骤:

对于各个函数的符号表达式图,从用户输入节点开始对所述符号表达式图进行逆向的深度优先遍历;

遍历到达查询语句节点时,根据所述控制依赖性边查找用户输入节点到查询语句节点之间的路径约束条件,并判断路径约束条件是否均满足,如果是,则发现sql注入缺陷。

深度优先搜索,是图论中的经典算法。它的思想是:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

下面先介绍一下本发明的检测方法的具体思路。

(1)source-sink问题描述

为了简化问题并清楚地描述本发明的主要思路,此处首先以单个函数的项目为例。下面给出source-sink问题的定义。

定义1:首先给出source(数据流的来源)和sink(数据流入的对象)两个声明,记为src和sink,source-sink问题指的就是由src产生或使用的一个动态值是否在运行时间内可以流入sink中。

本发明解决source-sink最基本的思想是下面的步骤:

(1)追踪可以传播到src中的值v_src。换句话说,此步的目标是通过沿着seg图的边,反向搜索那些是v_src别名的值。为了减少解释,我们用v_pro去指示一个目标值。对于每一个v_pro,我们可以构造一个从v_pro到v_src的路径p1。

(2)追踪第一步得到的值v_pro是否可以在sink传播到值v_sink。这样做,不管我们在第一步何时得到值v_pro,我们都可以遍历v_pro的后代顶点来追踪它的传播。如果在遍历中我们可以到达v_sink,我们就构建一个从v_pro到v_sink的路径p2。

如果可以在第一步和第二步的描述中找出路径p1和p2,这就说明v_src和v_sink是v_pro的别名。判断v_src是否可以流入v_sink,只需要检查p1和p2两个路径条件是不是可以同时被满足。因此,首先收集p1和p2的路径条件,然后使用一个约束求解器去解决两个路径条件的结合。

在实际应用中,从v_src到v_pro之间的路径中可以存在不止一个v_pro,可以有多个v_pro,相当于路径被各个v_pro分段,每段有一个路径约束条件,如果要v_src和v_pro之间的路径是连通的,则每一段的路径约束条件都要满足。

上述内容解释了在只有一个函数的项目中是如何解决source-sink问题的。在现实的实例中,一个项目通常有很多函数。这就需要在程序间进行项目的分析。为了追踪函数间值的传播,提出通过聚集不同函数seg图的跨过程分析。

(2)摘要的表示、生成和应用

本发明将每个函数的摘要表示为一组摘要项目。一个摘要项目代表了目标函数受到其调用的单一影响,或者是目标函数对其调用者的单一影响。

摘要项分为两大类:符号摘要(symbolicsummary)和检查器定制摘要(checker-specificsummary)。对于一个调用函数,所有检查器的符号摘要是不变的,用来记录这个函数值的变化,但是每一个检查器的检查器定制摘要会不一样,这个就由检查器自身的特征决定要关注的约束。检查器定制摘要又分为输入摘要(inputsummary)、输出摘要(outputsummary)和传递摘要(wrappersummary)。

以下是不同的摘要项的说明:

符号摘要:值如何在目标函数中进行变化的一个摘要,是从函数参数到返回值的值的摘要。它由输入,输出,约束集合三部分组成。

输入摘要:函数中分析结果的摘要,它取决于调用者的输入,是从函数参数到v_sink的值的摘要。输入摘要分为输入、约束、分析结果的报告、生成报告摘要的相应描述(trace)、检查器特定信息(checkerspecificinformation)五部分组成。

输出摘要:该函数可能影响其调用者的摘要,输出摘要是从source到return值的摘要。输出摘要是由输入,约束,生成报告的摘要的相应描述(例如trace),检查器特定信息(checkerspecificinformation)四部分组成,它是分析的一部分但不加入路径验证。对于目标函数调用者的每个不同效果,本发明创建一个单独的输出摘要。

传递摘要:是从函数参数到source的一个摘要。对于sql注入问题,由于没有return值,注入这一状态也不能作为输入,因此,在该实施例中,进一步引入一个传递摘要,与输入、输出摘要共同作为检查器定制摘要。

因此,在该实施例中,进一步地,所述sql注入缺陷检测方法还包括如下步骤:

生成各个函数的函数摘要,所述函数摘要包括符号摘要,所述符号摘要包括函数输入、函数输出以及函数输入节点到函数输出节点之间路径的约束集。

在该实施例中,将用户输入节点作为source节点,将查询语句节点作为sink节点,对于一函数的符号表达式图,如果存在从用户输入节点到查询语句节点的路径,则该函数的函数摘要还进一步包括输入摘要、输出摘要和传递摘要,其中:

所述输入摘要包括函数输入到查询语句节点的摘要;

所述输出摘要包括用户输入节点到函数输出的摘要;

所述传递摘要包括函数输入到用户输入节点的摘要。

在该实施例中,判断路径约束条件是否均满足,包括如下步骤:

判断当前检测函数中从用户输入节点到查询语句节点之间的路径中是否存在被调函数;

如果是,则将所述被调函数的函数摘要嵌入当前检测函数的符号表达式图,判断当前检测函数中与该被调函数对应的路径约束条件是否满足。

在该实施例中,生成待检测的程序中各个函数的符号表达式图,包括如下步骤:

从所述待检测的程序的底层函数依次向上层函数建立各个函数的符号表达式图;

检测各个函数的符号表达式图时,从底层函数依次向上层函数检测,并从底层函数依次向上层函数生成函数摘要;

检测上层函数的符号表达式图时,将该上层函数的下层函数的函数摘要嵌入该上层函数的符号表达式图中。

在符号表达式图中,一个函数可能同时作为另一个函数的被调函数,也可能需要调用再一个函数,被其他函数调用,而不调用其他函数的函数是最底层函数,调用其他函数而不被其他函数调用的函数是最顶层函数。从最底层函数到最顶层函数,函数层级关系依次向上建立。在判断上层函数中路径约束条件是否满足时,如果路径中存在其下层函数,则需要嵌入下层函数的函数摘要,才能判断路径约束条件是否满足。

在该实施例中,所述输入摘要包括函数输入、函数输入节点到查询语句节点之间路径的约束、分析结果报告、生成报告摘要的相应描述和检查器特定信息;其中,检查器特定信息指的是在输入摘要中的约束是否满足的判断条件,分析结果报告指的是约束是否满足的结果,生成报告摘要的相应描述可以包括函数输入节点到查询语句节点之间路径的追溯摘要。

所述输出摘要包括用户输入、用户输入节点到函数输出节点之间路径的约束、分析结果报告、生成报告摘要的相应描述和检查器特定信息;其中,检查器特定信息指的是输出摘要中的约束是否满足的判断条件,分析结果报告指的是输出摘要中约束是否满足的判断结果,生成报告摘要的相应描述可以包括用户输入节点到函数输出节点之间路径的追溯摘要。

所述传递摘要包括函数输入、函数输入节点到用户输入节点之间路径的约束、分析结果报告、生成报告摘要的相应描述和检查器特定信息;其中,检查器特定信息可以包括传递摘要中的约束是否满足的判断条件,分析结果报告指的是传递摘要中约束是否满足的判断条件,生成报告摘要的相应描述可以包括函数输入节点到用户输入节点之间路径的追溯摘要。

在该实施例中,所述值节点包括终端值节点和非终端值节点,所述终端值节点表示当前函数外生成的未知的值或常量,所述非终端值节点包括当前函数内生成的值。所述控制依赖性边指向的一侧为逻辑运算的运算符或布尔值节点;用真和假来标记所述控制依赖性边,以表明逻辑运算的所需的结果。

在该实施例中,所述生成待检测的程序中各个函数的符号表达式图之前,还包括如下步骤:对待检测的程序进行预处理,具体包括展开所述待检测的程序中的循环。

下面,结合附图简要介绍本发明提出的sql注入缺陷检测方法的总体框架。该算法主要包括四个阶段:预建模(pre-model)、先决分析(prerequisiteanalysis)、后建模(post-model)和缺陷分析(defectanalysis)。

在预建模阶段,主要从输入的程序中消除不感兴趣的结构,以简化后续分析。例如,循环展开、循环打破等都是在这个阶段执行的。

接下来,在先决分析阶段,计算基本信息,特别是该阶段的后续分析中所需的整个程序信息。根据先决分析结果,生成调用图。调用图是本领域中常用的用来描述程序结构的图,这里不再详述。

接着,在后建模阶段,使用先决分析阶段生成的调用图来进一步简化代码,并更新程序信息。例如,标记调用图中形成scc(强连通分量)的调用边,以便将来在不必进入循环的情况下,就能够对调用图中的迭代进行分析。

最后,在缺陷分析阶段,主要算法是符号值流分析(svfa),生成函数摘要信息,以完成函数内分析。此时,这些指针的值仍然是未知的。对符号指针表示图(speg)ir(中间语言)执行svfa,其中spegir对点对关系(左值依赖)和变量的符号值(右值依赖)一起进行建模,可得到符号表达式图(seg)。下面将更加详细地描述seg的生成过程和利用seg进行缺陷检测的方法。

本发明中提出的seg能够紧凑地将每个变量的值表示为外部存储器位置的变量的逻辑和算数表达式,例如,参数、全局变量和通过参数和全局变量可达的堆位置。seg是一种有向无环图(简称dag),是对所有变量的一种完整ssa表示。通过前向路径敏感的分析,从下向上构建seg,因此可以递增地评估sat查询。还因为seg的dag性质,我们可以将特定的seg子图替换为常数表示以加速约束解析。

使用seg的流水线工作流程是非常灵活的,我们可以简单地添加更多阶段来实现特定功能。例如,将来我们可以将分析过程分阶段化,逐渐使用更准确的分析来细化错误报告。每个分析阶段仅验证来自上一个阶段的错误候选者。此处可以通过在预建模阶段和缺陷分析阶段之间添加一组阶段来实现这种功能。

下面将介绍每个阶段中实现的主要算法,并重点介绍符号值流分析(svfa)。应理解,本文中提供的实例和细节仅是为了帮助理解,而不以任何方式对本发明的范围构成限制。

预建模阶段

在预建模阶段,例如,可使用开源的llvm转换来对程序进行建模。表1示出了这里使用的llvm转换流程的完整列表。

表1

在该阶段中,主要任务是展开和打破所有的循环,根据循环嵌套结构,从内环到外环。近似循环对于有界模型检查至关重要,展开循环是最简单也是最粗暴的方式。在图2a和2b中示出了展开循环的一个例子。

图2a示出了展开循环之前的循环,该循环为规范的形式:该循环具有预读头部(pre-header),并且只有一个调用锁存的节点能够返回到头部(header)。虚线箭头将循环内部存在的节点连接到循环外部的退出节点(exitnode),并且所有退出节点都被布置了足够的φ函数,以保护来自循环的定义。当然,虚线箭头表示该条边并不存在。通过首先复制循环体(loopbody)k次,然后为克隆的变量更新定义-使用(def-use)关系,来执行展开循环k次。

图2b示出了将图2a中的循环展开两次的结果,即,复制了两次。我们对代码执行三种类型的更新。首先,将来自第i个循环的锁存(latch)复制到第i+1个循环的头部,为所有头部复制和更新φ函数。其次,将新的值插入被克隆的变量的退出节点的φ函数中。接下来,从头部的锁存去除后边缘。这时,如果锁存不能退出循环,则变为悬挂节点,我们为锁存附加一个不可达的指令,并依赖死代码消除来清理无用的变量。

先决分析阶段

该阶段主要设置来收集全局程序信息。要收集的非常基本的信息是调用图。我们使用传统指针分析方法来计算调用图,这里不再描述其细节。然而,我们仅使用自下向上的方法,这对于生成调用图是至关重要的,因为自上向下的方法速度过慢。

后建模阶段

我们在先决分析之后插入另一个编码建模阶段,提供进一步简化的代码在缺陷分析阶段使用。在该阶段执行的所有算法都是响应于全局程序信息的更新,如果该信息有改变的话。在后建模阶段,不仅可以实现调用图scc标记分析,如上文所述,标记在调用图中形成循环的后沿,还可以通过缺陷分析来利用这些信息来计算循环中函数的有界分析结果。可选地,还可以在该阶段增加其他重要的变换,如,常数传播(constantpropagation)等。

缺陷分析阶段

<type(τ)>::=bool|int|{(f1,τ1),...,(fn,τn)}|τ[]|τ*

<obj(o)>::=v|{(f1,o1),...,(fn,on)}

<deref(m)>::=*v|v→f1.f2...fn

<expr(e)>::=null|const(n,τ)|unknown(τ)|parm(τ)|global(τ)

|&o|&m|new...

|o|m|e1binope2|-e|(τ)e

<cond(c)>::=false|true|!c|c1andc2|c1orc2|v1compv2

<stmt(s)>::=o←e|m←o|ite(c,label-t,label-f)|assert(c)|assume(c)

<binop>::={+,-,×,/,mod,band,bor,bxor}

<comp>::={=,<,≥,>,≤,≠}

在该实施例中,缺陷分析的算法设计如下:

该示例性算法的源代码的语法定义如上所示,其中ite是if-then-else的缩写。该算法的第一条规则定义了该算法建模的类型,支持两种元素类型:布尔型和整型。在基本类型的基础上定义了c结构(cstruct)、数组(array)和指针(pointer)等复合类型。应注意,当前算法中没有对浮点算术进行建模,尽管约束求解器z3已经添加了对浮点数的支持。所有浮动变量都可以转换为整数变量,并将其整数值建模为未知数。

其余规则定义了变量和变量组成的表达式。具体来说,该算法支持多步指针表达式v→f1.f2...fn,为未初始化变量和浮动变量建模的unknown值,函数参数的parm值,以及全局变量的global值。由于llvm通过插入临时变量将长表达式转化为短表达式,因此,在此基础上,还可以将存储和加载语句写为*(p+f)=v和v=*(p+f),其中f是基本指针p的偏移量。

下面,将结合实例介绍缺陷检测方法。

程序内分析通过执行价值流分析(valueflowanalysis),在函数内查找相关缺陷。

价值流分析

下面给出示例性的价值流分析(vfa)的抽象域定义:

local+parametervariables

globalvariables

abstractobjects(new’edmemory)

c:pathconditions

abstractvalues

δ:

ψ:

vfa的任务是计算一个抽象存储位置可能具有的抽象值集合,即,如上所示的δ函数。抽象值是分析涉及的具体值的抽象表示。vfa还计算抽象位置具有给定的抽象值时的条件。计算结果被表示为函数。为了简单起见,我们还将条件位置值对写为其中并且

作为例子,我们可以选择ssa作为制定vfa的开始,因为ssa能够支持稀疏分析,从而可以显着提高分析性能。然而,由llvm构建的ssa只是转换了顶级变量,即,那些没有被指针指向的变量。堆内存位置也被llvm忽略,因此堆内存位置之间的值流是不清楚的。因此,尝试解析指针表达式来构造一个完全编码所有内存位置的def-use关系的ssa形式。

这里的核心问题是分解负载和存储语句。假设指针p指向在可能的混叠分析阶段获得的对象o1,o2,…,ok,则一个直接的因式分解方法是:

对于*(p+f)=v,可以用对象字段的一组直接赋值来替换它:o1.f=v,o2.f=v,...,ok.f=v。

对于v=*(p+f),可以用赋值v=χ(o1.f,o2.f,…,ok.f)替换它。函数χ表示其参数之一可以赋值给v。

对象字段的因式分配由其原始指针表达式来注释,我们将访问这些表达式,以进行空指针引用检查。我们将数组建模为单个单元,因此,数组的每个加载和存储将被重定向到该单个单元。在完成对存储和加载的翻译之后,恢复对变量的所有可能的赋值。然后,我们运行标准的ssa构造算法来插入对象域的φ函数。所得到的ir称为完全基于堆的ssa(hssa)。hssa的一个例子如图3所示,在下文中将结合这个例子继续解释本发明的原理。

图3示出了一段示例代码及其未修剪的hssa形式。

接下来,我们将图3所示的hssair转换成图形形式,揭示价值计算结构,如,在抽象语法树中。我们称之为图形表示符号表达式(seg)。seg是本发明提出的一种全新的数据结构。

图4示出了根据本发明的一个实施例生成的示例性的seg。其中,灰色椭圆形节点表示终端值,未着色的椭圆形节点表示非终端值。实线和虚线代表数据和控制依赖性边。每个非终端值附加到控制依赖性边,以表示该值有效的条件。控制依赖性边的标签代表我们对条件的期望。为了清楚起见,忽略标记为true的控件依赖性边。在图4中,运算符用矩形灰色节点表示。

形式上,seg是一个4元组(v,o,d,c)。

其中,v是一组值节点,节点的值分为终端值和非终端值。终端值表示在此函数之外生成的未知值。在该设计中,此函数可访问的参数、全局变量和堆位置的值是终端值,它们表示为图4底部的灰色节点。图4中的椭圆形节点是非终端值,表示在此过程中生成的值。由于seg的ssa性质,我们还将唯一的内存位置与每个非终端值相关联,以将该值命名。

o表示该算法中定义的所有运算符的运算符节点集合。

d是一组数据依赖性边,在图4中以实线表示。

c是一组控制依赖性边,在图4中以虚线表示。箭头侧的节点必须是逻辑运算的运算符节点。此处还用true或false来注释边,以表示逻辑运算的所需结果。

终端值的集合也称为接口对象(io),它们的正式定义如下:

<pio>::=parmi|global

<io>::=pio|*io|io→f|io.f

其中,pio表示主接口对象。在pio的语法中,parami是函数的第i个参数,global是全局变量。io的递归部分是通过以pio作为根的指针取解引用可访问的存储器位置,例如,<o1.f>0和<o2.f>0。在当前的算法中,我们将io的值视为符号值,而不会跟踪全局信息流。

如下所示的算法1给出了构建seg的伪代码。

该算法以反向顺序(rpo)迭代基本块。对于每个基本块b,我们首先构建其路径条件其是对于来自的所有路径p的路径约束c(p)的分离。然而,这种路径条件可能非常冗长。压缩路径条件的想法是以递归形式重写其定义:pc(b)=pc(bif)∧c(bif→b),其中bif是b的控制依赖基本块,c(bif→b)是使程序执行从bif到b的条件。在算法1中,函数getbbcond(b)返回一对值(l,cin),其中l是true或false标签,cin是b所依赖于的if条件。可以使用控制依赖图来容易地实现getbbcond函数。

接下来,我们按顺序对每个基本块中的语句进行符号评估,并调用函数findcreateexpr来逐步构建seg。findcreateexpr接受三个参数,它们是:运算符、操作数列表和路径条件。最相关的构造是φ函数。我们必须计算门控函数γ,其中,γi是选择φ函数的第i个元素的条件。使用下面的定理可以导出门控函数:

假设xn=φ(x1,x2,…,xk),

则有γi(b)=pc(predi(b))∧c(predi(b)→b),

其中,predi(b)是b的第i个前导基本块。

如上所述,我们可以使用示例性的算法1构建根据本发明的seg。由算法1构建的seg具有三个特征:

1.我们将因子赋值解释为对象字段,作为强更新。例如,<o1.f>1不保留值<o1.f>0。目的是用稳健性换取精确性。

2.seg是一个最大共享的图,seg的每一个子图是唯一的,即,seg没有同构子图。findandcreateexpr函数可以避免相同的子图。一个例子是节点<o1.f>3和<o2.f>3,它们共享相同的子图。

3.由不同if语句中的两个或多个逻辑运算组成的路径条件紧凑地表示为逻辑运算控制依赖于另一逻辑运算。例如,!=运算符控制取决于<=运算符,它编码语句中的条件if(b<=0)和if(q!=null)。

重构每个变量的计算过程的原因是我们可以轻松地发现不可行的路径,并通过解析约束来排除错误的信息流。在我们的例子中,if(c>a)和if(b≤0)的分支是不能同时进行的。我们可以发现这个事实,因为查询sat((c1=a0+b0)∧(c1>a0)∧(b0≤0))为false。

下面结合一个具体实例来具体介绍一种sql注入缺陷检测的方案。

首先结合图5a-5d介绍该实例中符号表达式图的生成过程。

下面是一段sql注入代码示例:

在第1行代码中,getfromuser()从用户获取可能的恶意用户输入,s=getfromuser()为注入点,是一个v_src,因此图5a中s有灰度显示。在第2行代码中,以b1、b2作为条件判断依据,决定z被赋值为z1或s。如图5a所示,对于前两个语句,我们为变量z、z1和恶意用户输入节点s构建一个φ节点,使用箭头连接它们以表示数据依赖性。

在第3行代码中,我们对z!=s的约束条件进行判断,如果条件成立,则x=y+3。在图5b中,以x、y、常量3和“+”操作符、“!”操作符、“z!=s”的cond(约束条件)创建节点,并连接x、y、3、+以表示x=y+3的数据依赖性,连接cond,!=,z,s以表示cond为z!=s的数据依赖性。因为存在定义x的约束条件(即z!=s的cond),所以此处使用虚线箭头将x连接到cond节点以表示控制依赖性。实际上,如图5c所示,每个节点都有其控制依赖性边来表示它们可以定义在哪种约束条件下。

最后,当x>3时,执行createquery(…)的敏感操作,createquery(…)是一个v_sink(在图5d中以灰度表示)。在图5d中,为createquery(…)操作、“>”操作符和x>3的cond1创建节点,并连接x,+,3,cond1以表示其数据依赖性,使用虚线箭头将createquery(…)连接到cond1以表示控制依赖性。最终语句将createquery(…)连接到具有特定条件的z。

下面结合图6a-6c介绍一实例中如何采用符号表达式图检测sql注入缺陷。

如图6a所示,使用生成的符号表达式图,通过每个输入查找程序中是否存在sql注入缺陷。如图6b所示,由一个用户输入节点s开始,逆向深度优先遍历seg,首先到达节点z,从s到z的路径r1生成一个约束条件cond(z=s),接着到达查询语句节点createquery(…),添加z到createquery(…)的路径r2的约束条件cond(createquery()),并进行检测两个约束条件是否同时满足,如果同时满足,则检测到一个sql注入缺陷。

在判断cond(z=s)时,需要根据s函数的返回值来判断约束条件cond(z=s)是否满足。因此,对于图6a-6c的seg图来说,s函数是此seg图的被调函数,需要将s函数的函数摘要嵌入到此seg图中,以判断约束条件cond(z=s)是否满足。如果s函数的返回值是一个常量,则只需要将符号摘要嵌入到seg图中即可,如果s函数的返回值是一个变量,则需要将检查器定制摘要,即输入摘要、输出摘要和传递摘要嵌入到seg图中,根据输入摘要确定s函数的函数输入的传入过程,输出摘要确定s函数的函数输出的传出过程,传递摘要确定s函数内部的变量传递过程。从而可以根据检查器定制摘要得到s的返回值,进而判断约束条件cond(z=s)是否满足。同样地,在生成s函数的函数摘要时,可以通过s函数的seg图查找各个路径的约束条件,生成符号摘要和检查器定制摘要。在s函数的seg图中查找各个约束条件时,如果涉及到下一层的被调函数,则需要将下一层的被调函数的函数摘要嵌入到s函数的set图中。在检测过程中,需要先检测s函数的下一层的被调函数的seg图,判断s函数的下一层的被调函数是否存在sql注入缺陷,检测完成后,生成s函数的下一层的被调函数的函数摘要,然后将s函数的下一层的被调函数的函数摘要嵌入到s函数的seg图中,检测s函数内是否存在sql注入缺陷,检测完成后,生成s函数的函数摘要,然后将s函数的函数摘要嵌入到图6a-6c中示出的seg图中,检测图6a-6c中示出的seg图中是否存在sql注入缺陷,检测完成后,可以生成图6a-6c中示出的seg图对应的函数的函数摘要,并可以进一步将其嵌入到上一层函数的seg图中,实现层层调用。

在该实施例中,s函数的符号摘要和检查器定制摘要分别为:

符号摘要:包括s函数的函数输入、函数输出和s函数中所有约束的集合;

所述输入摘要包括函数输入、函数输入节点到查询语句节点之间路径的约束、分析结果报告、生成报告摘要的相应描述和检查器特定信息;其中,函数输入为s函数的函数输入,在s函数中查找到s函数的函数输入节点和查询语句节点之后,生成检查器特定信息,具体指的是在s函数中函数输入节点到查询语句节点之间的路径约束是否满足的判断条件,分析结果报告指的是s函数中函数输入节点到查询语句节点之间的路径约束是否满足的结果,生成报告摘要的相应描述可以包括函数输入节点到查询语句节点之间路径的追溯摘要。例如,生成报告摘要的相应描述可以包括s函数中查询语句节点通过哪些节点一步步回溯到函数输入节点的路径信息。

所述输出摘要包括用户输入、用户输入节点到函数输出节点之间路径的约束、分析结果报告、生成报告摘要的相应描述和检查器特定信息;其中,函数输出为s函数的输出,查询到s函数内的用户输入节点和函数输出节点之后,生成检查器特定信息,具体指的是s函数中用户输入节点到函数输出节点之间路径约束是否满足的判断条件,分析结果报告指的是s函数中用户输入节点到函数输出节点之间路径约束是否满足的判断结果,生成报告摘要的相应描述可以包括用户输入节点到函数输出节点之间路径的追溯摘要,例如s函数中函数输出节点通过哪些节点如何一步步回溯到用户输入节点的路径信息。

所述传递摘要包括函数输入、函数输入节点到用户输入节点之间路径的约束、分析结果报告、生成报告摘要的相应描述和检查器特定信息;其中,检查器特定信息可以包括s函数中函数输入节点到用户输入节点之间路径的约束约束是否满足的判断条件,分析结果报告指的是s函数中函数输入节点到用户输入节点之间约束是否满足的判断条件,生成报告摘要的相应描述可以包括函数输入节点到用户输入节点之间路径的追溯摘要,例如s函数中用户输入节点通过哪些节点如何一步步回溯到函数输入节点的路径信息。

如图6c所示,在访问查询语句节点后,返回到上一个节点z,并将完成检测的路径r2的约束条件抛弃,继续查找其他查询语句,重复检测,一直到完成所有从z节点开始的查询语句约束检测。例如,路径r1的约束条件和路径r3的约束条件结合来判断,等等。

在查找中可以看到,不需要返回到整个查找起点s节点,也不需要对其他无关的路径条件进行检测,从节点出发,只需要进行cond(z=s)和不同查询函数约束(例如cond(createquery())等)的求解。通过这种方式,可以高效方便地实现sql注入缺陷的检测。在一实施例中,可以利用smt求解器的增量求解特性来优化约束求解的性能,但本发明不限于此。smt技术采用理论求解器(t-求解器)来判定在理论t中的一阶逻辑公式f的可满足性。其中t是一组一阶逻辑公式集合,对任意给出公式f由理论t中原子式组成,那么关于理论t和f的smt问题就是判定公式f是否是t-可满足的。判定公式f是否t-可满足的程序称为理论求解器(t-求解器)。

如图7所示,本发明实施例还提供一种sql注入缺陷检测系统,应用于所述的sql注入缺陷检测方法,所述系统包括:

程序输入模块m100,用于输入待检测的程序;

符号表达式图生成模块m200,用于生成待检测的程序中各个函数的符号表达式图,所述符号表达式图包括节点和连接节点的边,所述节点包括值节点和运算符节点,所述边包括数据依赖性边和控制依赖性边,其中,值节点表示,所述数据依赖性边是将节点连接到与其有直接数据依赖关系的值节点的有方向性的边,所述控制依赖性边是当存在限定变量的条件时将变量连接到条件的有方向性的边;以及

缺陷检测模块m300,用于检测各个函数的符号表达式图中是否存在从用户输入节点到查询语句节点之间的路径且路径约束条件均满足,如果是,则发现sql注入缺陷。

在该实施例中,所述sql注入缺陷检测系统还包括:

摘要生成模块m400,用于生成各个函数的函数摘要,所述函数摘要包括符号摘要,所述符号摘要包括函数输入、函数输出以及函数输入节点到函数输出节点之间路径的约束集。

在该实施例中,对于一函数的符号表达式图,如果存在从用户输入节点到查询语句节点的路径,则该函数的函数摘要还包括输入摘要、输出摘要和传递摘要,其中:

所述输入摘要包括函数输入到查询语句节点的摘要;

所述输出摘要包括用户输入节点到函数输出的摘要;

所述传递摘要包括函数输入到用户输入节点的摘要。

在该实施例中,所述缺陷检测模块采用如下步骤判断路径约束条件是否均满足:

判断当前检测函数中从用户输入节点到查询语句节点之间的路径约束条件中是否存在被调函数;

如果是,则将所述被调函数的函数摘要嵌入当前检测函数,判断当前检测函数中与该被调函数对应的路径约束条件是否满足。

在该实施例中,所示符号表达式图生成模块m200根据如下步骤生成待检测的程序中各个函数的符号表达式图:

从所述待检测的程序的底层函数依次向上层函数建立各个函数的符号表达式图;

检测各个函数的符号表达式图时,从底层函数依次向上层函数检测,并从底层函数依次向上层函数生成函数摘要;

检测上层函数的符号表达式图时,将该上层函数的下层函数的函数摘要嵌入该上层函数的符号表达式图中。

本发明实施例还提供一种sql注入缺陷检测设备,包括处理器;存储器,其中存储有所述处理器的可执行指令;其中,所述处理器配置为经由执行所述可执行指令来执行所述的sql注入缺陷检测方法的步骤。

所属技术领域的技术人员能够理解,本发明的各个方面可以实现为系统、方法或程序产品。因此,本发明的各个方面可以具体实现为以下形式,即:完全的硬件实施方式、完全的软件实施方式(包括固件、微代码等),或硬件和软件方面结合的实施方式,这里可以统称为“电路”、“模块”或“平台”。

下面参照图8来描述根据本发明的这种实施方式的电子设备600。图8显示的电子设备600仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。

如图8所示,电子设备600以通用计算设备的形式表现。电子设备600的组件可以包括但不限于:至少一个处理单元610、至少一个存储单元620、连接不同平台组件(包括存储单元620和处理单元610)的总线630、显示单元640等。

其中,所述存储单元存储有程序代码,所述程序代码可以被所述处理单元610执行,使得所述处理单元610执行本说明书上述电子处方流转处理方法部分中描述的根据本发明各种示例性实施方式的步骤。例如,所述处理单元610可以执行如图1中所示的步骤。

所述存储单元620可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(ram)6201和/或高速缓存存储单元6202,还可以进一步包括只读存储单元(rom)6203。

所述存储单元620还可以包括具有一组(至少一个)程序模块6205的程序/实用工具6204,这样的程序模块6205包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。

总线630可以为表示几类总线结构中的一种或多种,包括存储单元总线或者存储单元控制器、外围总线、图形加速端口、处理单元或者使用多种总线结构中的任意总线结构的局域总线。

电子设备600也可以与一个或多个外部设备700(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该电子设备600交互的设备通信,和/或与使得该电子设备600能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(i/o)接口650进行。并且,电子设备600还可以通过网络适配器660与一个或者多个网络(例如局域网(lan),广域网(wan)和/或公共网络,例如因特网)通信。网络适配器660可以通过总线630与电子设备600的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备600使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、raid系统、磁带驱动器以及数据备份存储平台等。

本发明实施例还提供一种计算机可读存储介质,用于存储程序,所述程序被执行时实现所述的sql注入缺陷检测方法的步骤。在一些可能的实施方式中,本发明的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当所述程序产品在终端设备上运行时,所述程序代码用于使所述终端设备执行本说明书上述电子处方流转处理方法部分中描述的根据本发明各种示例性实施方式的步骤。

参考图9所示,描述了根据本发明的实施方式的用于实现上述方法的程序产品800,其可以采用便携式紧凑盘只读存储器(cd-rom)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本发明的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。

所述程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。

所述计算机可读存储介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读存储介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。可读存储介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、rf等等,或者上述的任意合适的组合。

可以以一种或多种程序设计语言的任意组合来编写用于执行本发明操作的程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如java、c++等,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(lan)或广域网(wan),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统、设备和计算机存储介质的实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。

本发明所提供的sql注入缺陷检测方法、系统、设备及存储介质具有下列优点:

本发明提出了一种生成符号表达式图和根据符号表达式图完成sql注入缺陷检测的方案,首先在符号表达式图中建立各个值节点和连接各个值节点的边,根据值节点和边判断是否存在用户输入节点到查询节点的路径,根据控制依赖性边寻找路径约束条件并判断路径约束条件是否均可以满足,从而通过符号表达式图中路径和路径约束条件的判断,能够高效地检测sql注入缺陷。

以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的保护范围。

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