CN112860265B - 一种源代码数据库操作异常检测方法及装置 - Google Patents

一种源代码数据库操作异常检测方法及装置 Download PDF

Info

Publication number
CN112860265B
CN112860265B CN202110352688.XA CN202110352688A CN112860265B CN 112860265 B CN112860265 B CN 112860265B CN 202110352688 A CN202110352688 A CN 202110352688A CN 112860265 B CN112860265 B CN 112860265B
Authority
CN
China
Prior art keywords
database
name
variable
type
database operation
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.)
Active
Application number
CN202110352688.XA
Other languages
English (en)
Other versions
CN112860265A (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.)
Industrial and Commercial Bank of China Ltd ICBC
Original Assignee
Industrial and Commercial Bank of China Ltd ICBC
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 Industrial and Commercial Bank of China Ltd ICBC filed Critical Industrial and Commercial Bank of China Ltd ICBC
Priority to CN202110352688.XA priority Critical patent/CN112860265B/zh
Publication of CN112860265A publication Critical patent/CN112860265A/zh
Application granted granted Critical
Publication of CN112860265B publication Critical patent/CN112860265B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/242Query formulation
    • G06F16/2433Query languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/242Query formulation
    • G06F16/2433Query languages
    • G06F16/2445Data retrieval commands; View definitions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Mathematical Physics (AREA)
  • Computational Linguistics (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请实施例提供一种源代码数据库操作异常检测方法及装置,可用于信息安全技术领域,其方法包括:获取待检测的源代码中对应数据库操作的操作语句;根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;根据所述数据库操作变量名称、数据库表名称及字段名称,确定对应的变量类型和字段类型;根据所述第一映射关系表、数据库操作变量类型以及数据库字段类型,生成异常检测结果,本发明可以自动精确定位目标源代码中的数据库操作问题,无需开发者手动定位,极大地提高了开发者的工作效率,同时也显著地降低了目标源代码运行出错的风险。

Description

一种源代码数据库操作异常检测方法及装置
技术领域
本申请涉及计算机技术领域,具体涉及源代码数据库操作异常检测方法及装置。
背景技术
编译原理是对高级程序语言进行翻译的一门算法。编译原理包含词法分析,语法分析,语法制导翻译,中间代码生成,存储管理,代码优化和目标代码生产。
词法分析是一门算法,主要是读入源代码的输入字符,将它们组成词素,生成词法单元序列。词法分析的结果将用于语法分析。
语法分析是一门算法。语法分析检验词法单元序列是否可以由源语言的文法生成。语法分析构造出一棵抽象语法树,供编译器的后续部分处理。
源码扫描分析是软件开发中必不可少的一个环节.源码扫描主要是用于明确业务逻辑细节,隐藏的风险错误扫描等。源码扫描分析会占用大部分开发工作的很多时间,随着代码量的增加,耗在源码扫描分析的时间会更长。
发明内容
针对现有技术中的问题,本申请提供一种源代码数据库操作异常检测方法及装置,方法包括:首先获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;然后根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;接着根据所述数据库操作变量名称、数据库表名称及字段名称,确定对应的变量类型和字段类型;最后根据所述第一映射关系表、数据库操作变量类型以及数据库字段类型,生成异常检测结果。本发明可以自动精确定位目标源代码中的数据库操作问题,无需开发者手动定位,极大地提高了开发者的工作效率,同时也显著地降低了目标源代码运行出错的风险。
本发明的一个方面,提供一种源代码数据库操作异常检测方法,包括:
获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;
根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;
根据所述数据库操作变量名称、数据库表名称及字段名称,确定对应的变量类型和字段类型;
根据所述第一映射关系表、数据库操作变量类型以及数据库字段类型,生成异常检测结果。
在优选的实施例中,所述获取待检测的源代码中对应数据库操作的操作语句,包括:
确定每个源代码的语句中是否存在至少一个语法关键词;
若存在,获取该操作语句。
在优选的实施例中,所述生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表,包括:
根据数据库的语法规则,确定每个数据库操作语句中的数据库操作变量名称及与该变量对应的数据库表名称和字段名称;
将所有数据库操作语句的数据库操作变量名称,数据库表名称和字段名称进行汇总,生成所述第一映射关系表。
在优选的实施例中,所述根据数据库的语法规则,确定每个数据库操作语句中的数据库操作变量名称及与该变量对应的数据库表名称和字段名称,包括:
若数据库操作语句中表名称和/或字段名称是一个变量,则从所述数据库操作语句中提取出所述变量;
在源代码中查找对所述变量进行赋值的赋值语句,将所述赋值语句的值确定为数据库操作变量所对应的数据库表名称或字段名称;
若无法查找到所述赋值语句,将与数据库操作变量名重合度最高的数据库表名称确定为所对应的数据库表名称或字段名称。
在优选的实施例中,所述根据所述数据库操作变量名称,确定对应的变量类型,包括:
若第一条件成立,则将数据库操作方法的参数声明中的类型确定为对应的数据库操作变量类型,所述第一条件为数据库操作方法的参数声明中包括了所述数据库操作变量名称的类型;
若所述第一条件不成立,第二条件成立,则将局部实际参数声明的类型确定为对应的数据库操作变量类型,所述第二条件为局部实际参数声明包括了所述数据库操作变量名称的类型;
若所述第一条件和所述第二条件均不成立,第三条件成立,则将实际参数的类成员属性声明中的类型确定为对应的数据库操作变量类型,所述第三条件为实际参数的类成员属性声明中包括了所述数据库操作变量名称的类型;
若第一至第三条件均不成立,第四条件成立,则将实际参数调用方法的参数声明中的类型确定为对应的数据库操作变量类型,所述第四条件为实际参数调用方法的参数声明中包括了所述数据库操作变量名称的类型;
若第一至第四条件均不成立,执行迭代操作,直至确定所述数据库操作变量类型;所述迭代操作包括将所述数据库操作变量转换为源代码抽象语法树中当前层次所对应的上一层次数据库操作方法中的变量,重新判断第一至第四条件是否成立。
在优选的实施例中,还包括:生成待测源代码的抽象结构树。
在优选的实施例中,所述根据所述数据库表名称及字段名称,确定对应的字段类型,包括:
确定各个数据库服务器的IP地址或者域名、用户名和访问口令;
确定已获取数据库中查询表结构定义的权限;
查询所述数据库表名称对应的表结构中所述字段名称的定义,确定对应的字段类型。
本发明的又一方面,提供一种源代码数据库操作异常检测装置,包括:
语句获取模块,获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;
映射关系表生成模块,根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;
类型确定模块,根据所述数据库操作变量名称、数据库表名称及字段名称,确定对应的变量类型和字段类型;
异常检测模块,根据所述第一映射关系表、数据库操作变量类型以及数据库字段类型,生成异常检测结果。
在优选的实施例中,所述语句获取模块,包括:
关键词判断单元,确定每个源代码的语句中是否存在至少一个语法关键词;
语句确定单元,若存在,获取该操作语句。
在优选的实施例中,所述映射关系表生成模块,包括:
映射关系确定单元,根据数据库的语法规则,确定每个数据库操作语句中的数据库操作变量名称及与该变量对应的数据库表名称和字段名称;
汇总单元,将所有数据库操作语句的数据库操作变量名称,数据库表名称和字段名称进行汇总,生成所述第一映射关系表。
在优选的实施例中,所述映射关系确定单元,包括:
变量提取单元,若数据库操作语句中表名称和/或字段名称是一个变量,则从所述数据库操作语句中提取出所述变量;
赋值语句查询单元,在源代码中查找对所述变量进行赋值的赋值语句,将所述赋值语句的值确定为数据库操作变量所对应的数据库表名称或字段名称;
模糊匹配单元,若无法查找到所述赋值语句,将与数据库操作变量名重合度最高的数据库表名称确定为所对应的数据库表名称或字段名称。
在优选的实施例中,所述类型确定模块,包括:
第一条件下确定单元,若第一条件成立,则将数据库操作方法的参数声明中的类型确定为对应的数据库操作变量类型,所述第一条件为数据库操作方法的参数声明中包括了所述数据库操作变量名称的类型;
第二条件下确定单元,若所述第一条件不成立,第二条件成立,则将局部实际参数声明的类型确定为对应的数据库操作变量类型,所述第二条件为局部实际参数声明包括了所述数据库操作变量名称的类型;
第三条件下确定单元,若所述第一条件和所述第二条件均不成立,第三条件成立,则将实际参数的类成员属性声明中的类型确定为对应的数据库操作变量类型,所述第三条件为实际参数的类成员属性声明中包括了所述数据库操作变量名称的类型;
第四条件下确定单元,若第一至第三条件均不成立,第四条件成立,则将实际参数调用方法的参数声明中的类型确定为对应的数据库操作变量类型,所述第四条件为实际参数调用方法的参数声明中包括了所述数据库操作变量名称的类型;
迭代单元,若第一至第四条件均不成立,执行迭代操作,直至确定所述数据库操作变量类型;所述迭代操作包括将所述数据库操作变量转换为源代码抽象语法树中当前层次所对应的上一层次数据库操作方法中的变量,重新判断第一至第四条件是否成立。
在优选的实施例中,所述类型确定模块,还包括:抽象语法树生成单元,具体用于生成待测源代码的抽象结构树。
在优选上实施例中,所述类型确定模块,还包括:
数据库信息确定单元,确定各个数据库服务器的IP地址或者域名、用户名和访问口令;
权限确定单元,确定已获取数据库中查询表结构定义的权限;
字段类型导出单元,查询所述数据库表名称对应的表结构中所述字段名称的定义,确定对应的字段类型。
本发明的又一方面,本申请提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现所述的源代码数据库操作异常检测方法。
本发明的又一方面,本申请提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现所述的源代码数据库操作异常检测方法。
由上述技术方案可知,本申请提供的一种源代码数据库操作异常检测方法,方法包括:首先获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;然后根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;接着根据所述数据库操作变量名称、数据库表名称及字段名称,确定对应的变量类型和字段类型;最后根据所述第一映射关系表、数据库操作变量类型以及数据库字段类型,生成异常检测结果。本发明可以自动精确定位目标源代码中的数据库操作问题,无需开发者手动定位,极大地提高了开发者的工作效率,同时也显著地降低了目标源代码运行出错的风险。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是源代码数据库操作异常检测方法流程示意图。
图2是第一映射关系表生成流程示意图。
图3是数据库表和/或字段名确定流程示意图。
图4是数据库操作变量类型确定流程示意图。
图5是实施例中源代码的抽象语法树结构示意图。
图6是数据库字段类型确定流程示意图。
图7是源代码数据库操作异常检测装置结构示意图。
图8是本申请实施例中的电子设备的结构示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
需要说明的是,本申请公开的源代码数据库操作异常检测方法及装置可用于计算机技术领域,也可用于除计算机技术领域之外的任意领域,本申请公开的源代码数据库操作异常检测方法及装置的应用领域不做限定。
编译原理是对高级程序语言进行翻译的一门算法。编译原理包含词法分析,语法分析,语法制导翻译,中间代码生成,存储管理,代码优化和目标代码生产。
词法分析是一门算法,主要是读入源代码的输入字符,将它们组成词素,生成词法单元序列。词法分析的结果将用于语法分析。
语法分析是一门算法。语法分析检验词法单元序列是否可以由源语言的文法生成。语法分析构造出一棵抽象语法树,供编译器的后续部分处理。
源码扫描分析是软件开发中必不可少的一个环节.源码扫描主要是用于明确业务逻辑细节,隐藏的风险错误扫描等。源码扫描分析会占用大部分开发工作的很多时间,随着代码量的增加,耗在源码扫描分析的时间会更长。
针对现有技术中的问题,本申请提供一种源代码数据库操作异常检测方法及装置,首先获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;然后根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;接着根据所述数据库操作变量名称、数据库表名称及字段名称,确定对应的变量类型和字段类型;最后根据所述第一映射关系表、数据库操作变量类型以及数据库字段类型,生成异常检测结果。本发明可以自动精确定位目标源代码中的数据库操作问题,无需开发者手动定位,极大地提高了开发者的工作效率,同时也显著地降低了目标源代码运行出错的风险。
下面结合附图对本发明提供的源代码数据库操作异常检测方法及装置进行详细说明。
在具体的实施例中,本申请提供一种源代码数据库操作异常检测方法,如图1,包括:
S1:获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;
具体的,再源代码的逻辑处理过程中,一般都存在着与数据库之间的交互操作,例如向数据库中插入数据记录,更新数据库中的数据记录,删除数据库中的数据记录,查询数据库中的数据记录,将这些操作称之为数据库操作。在代码的执行过程中,为了持久化记录相关数据,会将数据存储到数据库,当需要相关对应的数据时从数据库中将其读取出,进行相关逻辑运算,所以在源代码中存在着数据库操作的操作语句,根据数据库的语法规则可知,所述操作语句中包括了数据库操作变量名称,数据库表名称和字段名称,例如源代码中某一行语句为connection.prepareStatement("select name from customer where id="+idVar);其中select name from customer where id="+idVar为数据库操作语句,从该操作语句中可知,与数据库操作相关的变量名称为idVar,相应的数据库表名称为customer,字段名称为name。
S2:根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;
具体的,获取了源代码中的数据库操作语句后,根据数据库语句的语法规则,对该些操作语句进行分析,提取出其中的数据库操作变量以及其相对应的表名称和字段名称,最后将所有的数据库操作变量及其对应的表名称和字段名称进行汇总,形成所述第一映射关系表。在具体的实施例中,所述生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表,如图2,包括:
S21:根据数据库的语法规则,确定每个数据库操作语句中的数据库操作变量名称及与该变量对应的数据库表名称和字段名称;
具体的,数据库的语句有其相应的语法规则,例如数据库中数据的插入,其基本语语法为:insert into表名(字段1,字段2...)values(值1,值2...);数据的删除,其基本语法为delete字段名from表名where根据条件;数据的修改,其基本语法为:update表名set需要修改的字段=’要修改的值’where根据条件;对数据的查询,其基本语法select字段名from表名where根据条件。根据这些语法规则,从数据库操作语句中确定数据库操作变量及其对应的表名称和字段名。在具体的实施例中,例如数据库操作语句为update customerset name='a'where id=${idVar},该语句为一个数据修改语句,其idVar是一个数据库操作变量,表示的是客户id,其对应的数据库表名称是customer,字段名称是name,该语句的含义是将数据库表customer中id为idVar的name字段修改为a。
在具体的实施例中,有的操作语句中表名或者字段名是一个变量,可以通过对变量赋值来实现多个数据库操作,所以如图3所示,对于该些数据库操作语句,从中解析出数据库操作变量及相应法律表名城和字段名称的步骤包括:
S211:若数据库操作语句中表名称和/或字段名称是一个变量,则从所述数据库操作语句中提取出所述变量;
S212:在源代码中查找对所述变量进行赋值的赋值语句,将所述赋值语句的值确定为数据库操作变量所对应的数据库表名称或字段名称;
S213:若无法查找到所述赋值语句,将与数据库操作变量名重合度最高的数据库表名称确定为所对应的数据库表名称或字段名称。
在具体的实施例中,例如源代码中的数据库操作语句为
通过对操作语句的解析可知,数据库操作变量为idVar,对应的数据表名称是一个变量tableName,字段名是name,所以需要从源代码中查找对变量tableName进行赋值的语句,具体如下代码所述:
可以理解,语句CtBlock block=invocation.getParent(CtBlock.class);为获取当前sql语句的最近作用域.;while(block!=null)为由近及远逐级遍历作用域,直到程序搜索完为止;
判断如果当前的行数为上次搜索过的作用域,就结束对当前作用域的查找,继续搜索上层作用域.
判断到当前语句为变量声明,且变量名等于代表表名的变量.如果赋值语句右值为常量,即找到了表名,若是对字段名进行查找则将tableName替换为fieldName即可.
line=block.getPosition().getLine();为记录当前作用域的开始位置,作为下次循环查找语句的终止条件.
block=block.getParent(CtBlock.class);为查找上级作用域.
若通过上述代码,无法查找到对应的赋值语句,则将与表名变量名称或字段名变量名称重合度最大的数据库表名称或字段名称作为查找结果。例如,当前存在表名为customer和employer的两张表,代码中代表表名的变量名为empl.根据最长匹配原则,可以确定当前变量代表的表名是employer.
S22:将所有数据库操作语句的数据库操作变量名称,数据库表名称和字段名称进行汇总,生成所述第一映射关系表。
具体的,将所有源代码中提取出的数据库操作语句中的数据库操作变量名称及其对应关系表名称和字段名称汇总在一个表格中,称之为第一映射关系中,通过该表格可以反映出数据库操作变量与数据库表及字段的映射关系,如表1所示,例如表中第一行反映了数据库操作变量idVar若对应的表名称为customer,对应着字段名称为name。
表1
S3:根据所述数据库操作变量名称、数据库表名称及字段名称,确定对应的变量类型和字段类型;
具体的,生成了第一映射关系表后,需要确定表中数据库操作变量的变量类型和对应字段的字段类型。在具体的实施例中,对于数据库操作变量和变量类型确定,如图4,其步骤包括:
S31:若第一条件成立,则将数据库操作方法的参数声明中的类型确定为对应的数据库操作变量类型,所述第一条件为数据库操作方法的参数声明中包括了所述数据库操作变量名称的类型;
在具体的实施例中,例如源代码语句为@Update("update customer set name='a'where id=${idVar}");public String updateName(int idVar);可以理解数据库操作方法updateName的参数声明中已经包括了对数据库操作变量idVar的数据类型为int型,故将数据库操作变量idVar的类型确定为int型。
S32:若所述第一条件不成立,第二条件成立,则将局部实际参数声明的类型确定为对应的数据库操作变量类型,所述第二条件为局部实际参数声明包括了所述数据库操作变量名称的类型;
在具体的实施例中,数据库操作方法的参数声明中没有包括所述数据库操作变量名称的类型,但是在局部实际参数声明中包括了所述数据库操作变量名称的类型,例如数据库操作方法声明如下:
@Update("update customer set name='a'where id=${idVar}")
public String updateName(Object idVar);
可以理解,变量idVar的声明类型Object是不明确的,但是在该变量的实际参数声明中,对变量idVar的类型进行了明确,其为int类型,如下所示:
int idVar=1;
mapper.updateName(idVar);
故将数据库操作变量idVar的类型确定为int型。
S33:若所述第一条件和所述第二条件均不成立,第三条件成立,则将实际参数的类成员属性声明中的类型确定为对应的数据库操作变量类型,所述第三条件为实际参数的类成员属性声明中包括了所述数据库操作变量名称的类型;
在具体的实施例中,数据库操作方法的参数声明和局部实际参数声明中均未包括数据库操作变量的类型,但是在实际参数的类成员属性声明中包括了数据库操作变量的类型,例如Object name=1;mapper.updateName(name);其中变量name的声明类型不是明确的。但是实际参数在类成员属性声明中定义了,如下所示,实际调用中的参数name,是类成员属性,且声明的类型是明确的String,故将变量的类型确定为String。
S34:若第一至第三条件均不成立,第四条件成立,则将实际参数调用方法的参数声明中的类型确定为对应的数据库操作变量类型,所述第四条件为实际参数调用方法的参数声明中包括了所述数据库操作变量名称的类型;
在具体的实施例中,数据库操作方法的参数声明,局部实际参数声明和实际参数的类成员属性声明中均未包括数据库操作变量的类型,但是在实际参数调用方法的参数声明中包括了数据库操作变量的类型,则将该类型作为数据库操作变量的类型。例如如下源代码中,类成员属性定义声明中变量name的类型不是明确的。
但是在实际参数调用方的方法参数声明中,其类型是明确的,如下所示方法run声明的参数name的类型为明确的String。所以将变量的类型确定为String型。
S35:若第一至第四条件均不成立,执行迭代操作,直至确定所述数据库操作变量类型;所述迭代操作包括将所述数据库操作变量转换为源代码抽象语法树中当前层次所对应的上一层次数据库操作方法中的变量,重新判断第一至第四条件是否成立。
在具体的实施例中,若第一、二、三、四条件均不成立,则需要借助抽象语法树来进行变量类型溯源。用到的抽象语法树结构内容如下:
CtMethod:方法的声明.用于生成方法的调用关系.
CtInvocation:方法声明中的调用表达式.用于生成方法的调用关系.
CtExecutableReference:可执行方法的引用.用于引用CtMethod和CtInvocation,方便后续查找调用关系层次.
CtExpression:表达式.用于解析SQL调用方法的参数和返回字段.
CtBlock:代码块,即作用域范围.用于从局部到全局逐级查找变量类型.
CtLocalVariable,局部变量声明.用于解析SQL调用方法的参数和返回字段的类型.
CtStatement:语句.用于判断当前语句是否局部变量声明.
在具体的实施例中,生成抽象语法树的步骤为:
S351:创建CallHierarchyProcessor和SqlInvocationProcessor,这两个processor实现Spoon的AbstractProcessor的接口,会交由Spoon的SpoonHandler处理,完成代码扫描的处理.
S352:CallHierarchyProcessor解析Java项目中每个public权限的方法中调用的其他方法,即CtMethod调用的CtInvocation,,而且CtInovcation本身也是一个CtMethod,因此利用CtMethod和CtInvocation的迭代关系来生成方法的调用关系层次逻辑数据结构如图5所示。
可以理解,若第一、二、三、四均不成立,则将数据库操作变量视为当前层次的上一层次的方法中参数,依次判断第一、二、三、四条件是否成立,若某一个成立则将对应的类型确定为数据库操作变量类型,若均不成立,则将数据操作变量视为更高一级层次的方法参数进行第一、二、三四条件的判断,以此进行迭代,直至确定数据库操作变量的类型。/>
另一方面,对于数据库字段来说字段类型的确定,如图6,其步骤包括:
S301:确定各个数据库服务器的IP地址或者域名、用户名和访问口令;
S302:确定已获取数据库中查询表结构定义的权限;
S303:查询所述数据库表名称对应的表结构中所述字段名称的定义,确定对应的字段类型。
在具体时间实施例中,一般利用数据库连接器访问数据库,导出数据库的字段类型定义,例如java中使用Jdbc,c#中使用SQLyoung等连接器。
S4:根据所述第一映射关系表、数据库操作变量类型以及数据库字段类型,生成异常检测结果。
具体的,按照第一映射关系表,对其中的数据库操作变量得类型和对应数据库字段系统类型进行对比,其中,数据库数据类型与java语言数据类型的映射关系,如表2所示,例如若变量类型为byte[],对应字段类型为BIT(>1),则判断两者类型是一致的;若变量类型为byte[],对应字段类型为BIT(1),则判断两者类型是不一致的,将该变量进行标记为异常变量。以此类推,将所有变量类型与数据库字段类型不一致的进行标记,生成目标源代码的数据库操作检测结果。
表2
/>
由以上描述可知,本发明提供的一种源代码数据库操作异常检测方法,首先获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;然后根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;接着根据所述数据库操作变量名称、数据库表名称及字段名称,确定对应的变量类型和字段类型;最后根据所述第一映射关系表、数据库操作变量类型以及数据库字段类型,生成异常检测结果。本发明可以自动精确定位目标源代码中的数据库操作问题,无需开发者手动定位,极大地提高了开发者的工作效率,同时也显著地降低了目标源代码运行出错的风险。
从软件层面来说,本申请提供一种用于执行所述源代码数据库操作异常检测方法中全部或部分内容的源代码数据库操作异常检测装置的实施例,参见图7,所述源代码数据库操作异常检测装置具体包含有如下内容:
语句获取模块1,获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;
映射关系表生成模块2,根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;
类型确定模块3,根据所述数据库操作变量名称、数据库表名称及字段名称,确定对应的变量类型和字段类型;
异常检测模块4,根据所述第一映射关系表、数据库操作变量类型以及数据库字段类型,生成异常检测结果。
由以上描述可知,本发明提供的源代码数据库操作异常检测装置,本装置首先获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;然后根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;接着根据所述数据库操作变量名称、数据库表名称及字段名称,确定对应的变量类型和字段类型;最后根据所述第一映射关系表、数据库操作变量类型以及数据库字段类型,生成异常检测结果。本发明可以自动精确定位目标源代码中的数据库操作问题,无需开发者手动定位,极大地提高了开发者的工作效率,同时也显著地降低了目标源代码运行出错的风险。
在具体的实施例中,本申请提供一种源代码数据库操作异常检测装置,具体用于执行如下步骤包括:
S1:获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;
具体的,再源代码的逻辑处理过程中,一般都存在着与数据库之间的交互操作,例如向数据库中插入数据记录,更新数据库中的数据记录,删除数据库中的数据记录,查询数据库中的数据记录,将这些操作称之为数据库操作。在代码的执行过程中,为了持久化记录相关数据,会将数据存储到数据库,当需要相关对应的数据时从数据库中将其读取出,进行相关逻辑运算,所以在源代码中存在着数据库操作的操作语句,根据数据库的语法规则可知,所述操作语句中包括了数据库操作变量名称,数据库表名称和字段名称,例如源代码中某一行语句为connection.prepareStatement("select name from customer where id="+idVar);其中select name from customer where id="+idVar为数据库操作语句,从该操作语句中可知,与数据库操作相关的变量名称为idVar,相应的数据库表名称为customer,字段名称为name。
S2:根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;
具体的,获取了源代码中的数据库操作语句后,根据数据库语句的语法规则,对该些操作语句进行分析,提取出其中的数据库操作变量以及其相对应的表名称和字段名称,最后将所有的数据库操作变量及其对应的表名称和字段名称进行汇总,形成所述第一映射关系表。在具体的实施例中,第一映射关系表生成模块,具体用于执行如下步骤:
S21:根据数据库的语法规则,确定每个数据库操作语句中的数据库操作变量名称及与该变量对应的数据库表名称和字段名称;
具体的,数据库的语句有其相应的语法规则,例如数据库中数据的插入,其基本语语法为:insert into表名(字段1,字段2...)values(值1,值2...);数据的删除,其基本语法为delete字段名from表名where根据条件;数据的修改,其基本语法为:update表名set需要修改的字段=’要修改的值’where根据条件;对数据的查询,其基本语法select字段名from表名where根据条件。根据这些语法规则,从数据库操作语句中确定数据库操作变量及其对应的表名称和字段名。在具体的实施例中,例如数据库操作语句为update customerset name='a'where id=${idVar},该语句为一个数据修改语句,其idVar是一个数据库操作变量,表示的是客户id,其对应的数据库表名称是customer,字段名称是name,该语句的含义是将数据库表customer中id为idVar的name字段修改为a。
在具体的实施例中,有的操作语句中表名或者字段名是一个变量,可以通过对变量赋值来实现多个数据库操作,所以映射关系确定单元,具体执行如下步骤:
S211:若数据库操作语句中表名称和/或字段名称是一个变量,则从所述数据库操作语句中提取出所述变量;
S212:在源代码中查找对所述变量进行赋值的赋值语句,将所述赋值语句的值确定为数据库操作变量所对应的数据库表名称或字段名称;
S213:若无法查找到所述赋值语句,将与数据库操作变量名重合度最高的数据库表名称确定为所对应的数据库表名称或字段名称。
在具体的实施例中,例如源代码中的数据库操作语句为
通过对操作语句的解析可知,数据库操作变量为idVar,对应的数据表名称是一个变量tableName,字段名是name,所以需要从源代码中查找对变量tableName进行赋值的语句,具体如下代码所述:
可以理解,语句CtBlock block=invocation.getParent(CtBlock.class);为获取当前sql语句的最近作用域.;while(block!=null)为由近及远逐级遍历作用域,直到程序搜索完为止;
判断如果当前的行数为上次搜索过的作用域,就结束对当前作用域的查找,继续搜索上层作用域.
判断到当前语句为变量声明,且变量名等于代表表名的变量.如果赋值语句右值为常量,即找到了表名,若是对字段名进行查找则将tableName替换为fieldName即可.
line=block.getPosition().getLine();为记录当前作用域的开始位置,作为下次循环查找语句的终止条件.
block=block.getParent(CtBlock.class);为查找上级作用域.
若通过上述代码,无法查找到对应的赋值语句,则将与表名变量名称或字段名变量名称重合度最大的数据库表名称或字段名称作为查找结果。例如,当前存在表名为customer和employer的两张表,代码中代表表名的变量名为empl.根据最长匹配原则,可以确定当前变量代表的表名是employer.
可以理解的是,映射关系确定单元执行上述步骤可以理解为包括变量提取单元,赋值语句查找单元,模糊匹配单元,其中变量提取单元执行S211步骤,赋值语句查找单元执行S212步骤,模糊匹配单元执行S213步骤,后续相关实施例不在赘述。
S22:将所有数据库操作语句的数据库操作变量名称,数据库表名称和字段名称进行汇总,生成所述第一映射关系表。
具体的,将所有源代码中提取出的数据库操作语句中的数据库操作变量名称及其对应关系表名称和字段名称汇总在一个表格中,称之为第一映射关系中,通过该表格可以反映出数据库操作变量与数据库表及字段的映射关系,如表1所示,例如表中第一行反映了数据库操作变量idVar若对应的表名称为customer,对应着字段名称为name。
S3:根据所述数据库操作变量名称、数据库表名称及字段名称,确定对应的变量类型和字段类型;
具体的,生成了第一映射关系表后,需要确定表中数据库操作变量的变量类型和对应字段的字段类型。在具体的实施例中,变量类型确定模块中的变量类型确定单元,具体执行如下步骤包括:
S31:若第一条件成立,则将数据库操作方法的参数声明中的类型确定为对应的数据库操作变量类型,所述第一条件为数据库操作方法的参数声明中包括了所述数据库操作变量名称的类型;
在具体的实施例中,例如源代码语句为@Update("update customer set name='a'where id=${idVar}");public String updateName(int idVar);可以理解数据库操作方法updateName的参数声明中已经包括了对数据库操作变量idVar的数据类型为int型,故将数据库操作变量idVar的类型确定为int型。
S32:若所述第一条件不成立,第二条件成立,则将局部实际参数声明的类型确定为对应的数据库操作变量类型,所述第二条件为局部实际参数声明包括了所述数据库操作变量名称的类型;
在具体的实施例中,数据库操作方法的参数声明中没有包括所述数据库操作变量名称的类型,但是在局部实际参数声明中包括了所述数据库操作变量名称的类型,例如数据库操作方法声明如下:
@Update("update customer set name='a'where id=${idVar}")
public String updateName(Object idVar);
可以理解,变量idVar的声明类型Object是不明确的,但是在该变量的实际参数声明中,对变量idVar的类型进行了明确,其为int类型,如下所示:
int idVar=1;
mapper.updateName(idVar);
故将数据库操作变量idVar的类型确定为int型。
S33:若所述第一条件和所述第二条件均不成立,第三条件成立,则将实际参数的类成员属性声明中的类型确定为对应的数据库操作变量类型,所述第三条件为实际参数的类成员属性声明中包括了所述数据库操作变量名称的类型;
在具体的实施例中,数据库操作方法的参数声明和局部实际参数声明中均未包括数据库操作变量的类型,但是在实际参数的类成员属性声明中包括了数据库操作变量的类型,例如Object name=1;mapper.updateName(name);其中变量name的声明类型不是明确的。但是实际参数在类成员属性声明中定义了,如下所示,实际调用中的参数name,是类成员属性,且声明的类型是明确的String,故将变量的类型确定为String。
S34:若第一至第三条件均不成立,第四条件成立,则将实际参数调用方法的参数声明中的类型确定为对应的数据库操作变量类型,所述第四条件为实际参数调用方法的参数声明中包括了所述数据库操作变量名称的类型;
在具体的实施例中,数据库操作方法的参数声明,局部实际参数声明和实际参数的类成员属性声明中均未包括数据库操作变量的类型,但是在实际参数调用方法的参数声明中包括了数据库操作变量的类型,则将该类型作为数据库操作变量的类型。例如如下源代码中,类成员属性定义声明中变量name的类型不是明确的。
但是在实际参数调用方的方法参数声明中,其类型是明确的,如下所示方法run声明的参数name的类型为明确的String。所以将变量的类型确定为String型。
S35:若第一至第四条件均不成立,执行迭代操作,直至确定所述数据库操作变量类型;所述迭代操作包括将所述数据库操作变量转换为源代码抽象语法树中当前层次所对应的上一层次数据库操作方法中的变量,重新判断第一至第四条件是否成立。
在具体的实施例中,若第一、二、三、四条件均不成立,则需要借助抽象语法树来进行变量类型溯源。用到的抽象语法树结构内容如下:
CtMethod:方法的声明.用于生成方法的调用关系.
CtInvocation:方法声明中的调用表达式.用于生成方法的调用关系.
CtExecutableReference:可执行方法的引用.用于引用CtMethod和CtInvocation,方便后续查找调用关系层次.
CtExpression:表达式.用于解析SQL调用方法的参数和返回字段.
CtBlock:代码块,即作用域范围.用于从局部到全局逐级查找变量类型.
CtLocalVariable,局部变量声明.用于解析SQL调用方法的参数和返回字段的类型.
CtStatement:语句.用于判断当前语句是否局部变量声明.
在具体的实施例中,抽象语法树生成单元,具体执行如下步骤:
S351:创建CallHierarchyProcessor和SqlInvocationProcessor,这两个processor实现Spoon的AbstractProcessor的接口,会交由Spoon的SpoonHandler处理,完成代码扫描的处理.
S352:CallHierarchyProcessor解析Java项目中每个public权限的方法中调用的其他方法,即CtMethod调用的CtInvocation,,而且CtInovcation本身也是一个CtMethod,因此利用CtMethod和CtInvocation的迭代关系来生成方法的调用关系层次逻辑数据结构如图5所示。
可以理解,若第一、二、三、四均不成立,则将数据库操作变量视为当前层次的上一层次的方法中参数,依次判断第一、二、三、四条件是否成立,若某一个成立则将对应的类型确定为数据库操作变量类型,若均不成立,则将数据操作变量视为更高一级层次的方法参数进行第一、二、三四条件的判断,以此进行迭代,直至确定数据库操作变量的类型。/>
另一方面,类型确定模块还包括数据库字段类型确定单元,具体执行如下步骤包括:
S301:确定各个数据库服务器的IP地址或者域名、用户名和访问口令;
S302:确定已获取数据库中查询表结构定义的权限;
S303:查询所述数据库表名称对应的表结构中所述字段名称的定义,确定对应的字段类型。
在具体时间实施例中,一般利用数据库连接器访问数据库,导出数据库的字段类型定义,例如java中使用Jdbc,c#中使用SQLyoung等连接器。
S4:根据所述第一映射关系表、数据库操作变量类型以及数据库字段类型,生成异常检测结果。
具体的,按照第一映射关系表,对其中的数据库操作变量得类型和对应数据库字段系统类型进行对比,其中,数据库数据类型与java语言数据类型的映射关系,如表2所示,例如若变量类型为byte[],对应字段类型为BIT(>1),则判断两者类型是一致的;若变量类型为byte[],对应字段类型为BIT(1),则判断两者类型是不一致的,将该变量进行标记为异常变量。以此类推,将所有变量类型与数据库字段类型不一致的进行标记,生成目标源代码的数据库操作检测结果。
由以上描述可知,本发明提供的一种源代码数据库操作异常检测装置,包括语句获取模块,获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;映射关系表生成模块,根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;类型确定模块,根据所述数据库操作变量名称、数据库表名称及字段名称,确定对应的变量类型和字段类型;异常检测模块,根据所述第一映射关系表、数据库操作变量类型以及数据库字段类型,生成异常检测结果。本发明可以自动精确定位目标源代码中的数据库操作问题,无需开发者手动定位,极大地提高了开发者的工作效率,同时也显著地降低了目标源代码运行出错的风险。
从硬件层面来说,本申请提供一种用于实现源代码数据库操作异常检测方法中的全部或部分内容的电子设备的实施例,所述电子设备具体包含有如下内容:
图8为本申请实施例的电子设备9600的系统构成的示意框图。如图8所示,该电子设备9600可以包括中央处理器9100和存储器9140;存储器9140耦合到中央处理器9100。值得注意的是,该图8是示例性的;还可以使用其他类型的结构,来补充或代替该结构,以实现电信功能或其他功能。
在一实施例中,源代码数据库操作异常检测功能可以被集成到中央处理器中。其中,中央处理器可以被配置为进行如下控制:
S1:获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;
S2:根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;
S3:根据所述数据库操作变量名称、数据库表名称及字段名称,确定对应的变量类型和字段类型;
S4:根据所述第一映射关系表、数据库操作变量类型以及数据库字段类型,生成异常检测结果。
从上述描述可知,本申请实施例提供的电子设备,可以自动精确定位目标源代码中的数据库操作问题,无需开发者手动定位,极大地提高了开发者的工作效率,同时也显著地降低了目标源代码运行出错的风险。
在另一个实施方式中,源代码数据库操作异常检测装置可以与中央处理器9100分开配置,例如可以源代码数据库操作异常检测装置配置为与中央处理器9100连接的芯片,通过中央处理器的控制来实现源代码数据库操作异常检测功能。
如图8所示,该电子设备9600还可以包括:通信模块9110、输入单元9120、音频处理器9130、显示器9160、电源9170。值得注意的是,电子设备9600也并不是必须要包括图8中所示的所有部件;此外,电子设备9600还可以包括图8中没有示出的部件,可以参考现有技术。
如图8所示,中央处理器9100有时也称为控制器或操作控件,可以包括微处理器或其他处理器装置和/或逻辑装置,该中央处理器9100接收输入并控制电子设备9600的各个部件的操作。
其中,存储器9140,例如可以是缓存器、闪存、硬驱、可移动介质、易失性存储器、非易失性存储器或其它合适装置中的一种或更多种。可储存上述与失败有关的信息,此外还可存储执行有关信息的程序。并且中央处理器9100可执行该存储器9140存储的该程序,以实现信息存储或处理等。
输入单元9120向中央处理器9100提供输入。该输入单元9120例如为按键或触摸输入装置。电源9170用于向电子设备9600提供电力。显示器9160用于进行图像和文字等显示对象的显示。该显示器例如可为LCD显示器,但并不限于此。
该存储器9140可以是固态存储器,例如,只读存储器(ROM)、随机存取存储器(RAM)、SIM卡等。还可以是这样的存储器,其即使在断电时也保存信息,可被选择性地擦除且设有更多数据,该存储器的示例有时被称为EPROM等。存储器9140还可以是某种其它类型的装置。存储器9140包括缓冲存储器9141(有时被称为缓冲器)。存储器9140可以包括应用/功能存储部9142,该应用/功能存储部9142用于存储应用程序和功能程序或用于通过中央处理器9100执行电子设备9600的操作的流程。
存储器9140还可以包括数据存储部9143,该数据存储部9143用于存储数据,例如联系人、数字数据、图片、声音和/或任何其他由电子设备使用的数据。存储器9140的驱动程序存储部9144可以包括电子设备的用于通信功能和/或用于执行电子设备的其他功能(如消息传送应用、通讯录应用等)的各种驱动程序。
通信模块9110即为经由天线9111发送和接收信号的发送机/接收机9110。通信模块(发送机/接收机)9110耦合到中央处理器9100,以提供输入信号和接收输出信号,这可以和常规移动通信终端的情况相同。
基于不同的通信技术,在同一电子设备中,可以设置有多个通信模块9110,如蜂窝网络模块、蓝牙模块和/或无线局域网模块等。通信模块(发送机/接收机)9110还经由音频处理器9130耦合到扬声器9131和麦克风9132,以经由扬声器9131提供音频输出,并接收来自麦克风9132的音频输入,从而实现通常的电信功能。音频处理器9130可以包括任何合适的缓冲器、解码器、放大器等。另外,音频处理器9130还耦合到中央处理器9100,从而使得可以通过麦克风9132能够在本机上录音,且使得可以通过扬声器9131来播放本机上存储的声音。
本申请的实施例还提供能够实现上述实施例中的源代码数据库操作异常检测方法中全部步骤的一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述实施例中的执行主体为服务器或客户端的源代码数据库操作异常检测方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述步骤:
S1:获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;
S2:根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;
S3:根据所述数据库操作变量名称、数据库表名称及字段名称,确定对应的变量类型和字段类型;
S4:根据所述第一映射关系表、数据库操作变量类型以及数据库字段类型,生成异常检测结果。
从上述描述可知,本申请实施例提供的计算机可读存储介质,可以自动精确定位目标源代码中的数据库操作问题,无需开发者手动定位,极大地提高了开发者的工作效率,同时也显著地降低了目标源代码运行出错的风险。
本领域内的技术人员应明白,本发明的实施例可提供为方法、装置、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(装置)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
本发明中应用了具体实施例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

Claims (16)

1.一种源代码数据库操作异常检测方法,其特征在于,包括:
获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;
根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;
根据所述数据库操作变量名称,确定对应的变量类型,根据所述数据库表名称及字段名称,确定对应的字段类型;
根据所述第一映射关系表,对其中的数据库操作变量类型和对应的数据库字段类型进行对比,将数据库操作变量类型与数据库字段类型不一致的进行标记,生成异常检测结果。
2.根据权利要求1所述的源代码数据库操作异常检测方法,其特征在于,所述获取待检测的源代码中对应数据库操作的操作语句,包括:
确定每个源代码的语句中是否存在至少一个语法关键词;
若存在,获取该操作语句。
3.根据权利要求1所述的源代码数据库操作异常检测方法,其特征在于,所述生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表,包括:
根据数据库的语法规则,确定每个数据库操作语句中的数据库操作变量名称及与该变量对应的数据库表名称和字段名称;
将所有数据库操作语句的数据库操作变量名称,数据库表名称和字段名称进行汇总,生成所述第一映射关系表。
4.根据权利要求3所述的源代码数据库操作异常检测方法,其特征在于,所述根据数据库的语法规则,确定每个数据库操作语句中的数据库操作变量名称及与该变量对应的数据库表名称和字段名称,包括:
若数据库操作语句中表名称和/或字段名称是一个变量,则从所述数据库操作语句中提取出所述变量;
在源代码中查找对所述变量进行赋值的赋值语句,将所述赋值语句的值确定为数据库操作变量所对应的数据库表名称或字段名称;
若无法查找到所述赋值语句,将与数据库操作变量名重合度最高的数据库表名称确定为所对应的数据库表名称或字段名称。
5.根据权利要求1所述的源代码数据库操作异常检测方法,其特征在于,所述根据所述数据库操作变量名称,确定对应的变量类型,包括:
若第一条件成立,则将数据库操作方法的参数声明中的类型确定为对应的数据库操作变量类型,所述第一条件为数据库操作方法的参数声明中包括了所述数据库操作变量名称的类型;
若所述第一条件不成立,第二条件成立,则将局部实际参数声明的类型确定为对应的数据库操作变量类型,所述第二条件为局部实际参数声明包括了所述数据库操作变量名称的类型;
若所述第一条件和所述第二条件均不成立,第三条件成立,则将实际参数的类成员属性声明中的类型确定为对应的数据库操作变量类型,所述第三条件为实际参数的类成员属性声明中包括了所述数据库操作变量名称的类型;
若第一至第三条件均不成立,第四条件成立,则将实际参数调用方法的参数声明中的类型确定为对应的数据库操作变量类型,所述第四条件为实际参数调用方法的参数声明中包括了所述数据库操作变量名称的类型;
若第一至第四条件均不成立,执行迭代操作,直至确定所述数据库操作变量类型;所述迭代操作包括将所述数据库操作变量转换为源代码抽象语法树中当前层次所对应的上一层次数据库操作方法中的变量,重新判断第一至第四条件是否成立。
6.根据权利要求5所述的源代码数据库操作异常检测方法,其特征在于,还包括:
生成待测源代码的抽象语法树。
7.根据权利要求1所述的源代码数据库操作异常检测方法,其特征在于,所述根据所述数据库表名称及字段名称,确定对应的字段类型,包括:
确定各个数据库服务器的IP地址或者域名、用户名和访问口令;
确定已获取数据库中查询表结构定义的权限;
查询所述数据库表名称对应的表结构中所述字段名称的定义,确定对应的字段类型。
8.一种源代码数据库操作异常检测装置,其特征在于,包括:
语句获取模块,获取待检测的源代码中对应数据库操作的操作语句;所述操作语句包括数据库操作变量名称、数据库表名称及字段名称;
映射关系表生成模块,根据每个所述操作语句中的所述数据库操作变量名称、数据库表名称及字段名称,生成所述数据库操作变量名称与所述数据库表名称和字段名称相映射的第一映射关系表;
类型确定模块,根据所述数据库操作变量名称,确定对应的变量类型,根据所述数据库表名称及字段名称,确定对应的字段类型;
异常检测模块,根据所述第一映射关系表,对其中的数据库操作变量类型和对应的数据库字段类型进行对比,将数据库操作变量类型与数据库字段类型不一致的进行标记,生成异常检测结果。
9.根据权利要求8所述的源代码数据库操作异常检测装置,其特征在于,所述语句获取模块,包括:
关键词判断单元,确定每个源代码的语句中是否存在至少一个语法关键词;
语句确定单元,若存在,获取该操作语句。
10.根据权利要求8所述的源代码数据库操作异常检测装置,其特征在于,所述映射关系表生成模块,包括:
映射关系确定单元,根据数据库的语法规则,确定每个数据库操作语句中的数据库操作变量名称及与该变量对应的数据库表名称和字段名称;
汇总单元,将所有数据库操作语句的数据库操作变量名称,数据库表名称和字段名称进行汇总,生成所述第一映射关系表。
11.根据权利要求10所述的源代码数据库操作异常检测装置,其特征在于,所述映射关系确定单元,包括:
变量提取单元,若数据库操作语句中表名称和/或字段名称是一个变量,则从所述数据库操作语句中提取出所述变量;
赋值语句查询单元,在源代码中查找对所述变量进行赋值的赋值语句,将所述赋值语句的值确定为数据库操作变量所对应的数据库表名称或字段名称;
模糊匹配单元,若无法查找到所述赋值语句,将与数据库操作变量名重合度最高的数据库表名称确定为所对应的数据库表名称或字段名称。
12.根据权利要求8所述的源代码数据库操作异常检测装置,其特征在于,所述类型确定模块,包括:
第一条件下确定单元,若第一条件成立,则将数据库操作方法的参数声明中的类型确定为对应的数据库操作变量类型,所述第一条件为数据库操作方法的参数声明中包括了所述数据库操作变量名称的类型;
第二条件下确定单元,若所述第一条件不成立,第二条件成立,则将局部实际参数声明的类型确定为对应的数据库操作变量类型,所述第二条件为局部实际参数声明包括了所述数据库操作变量名称的类型;
第三条件下确定单元,若所述第一条件和所述第二条件均不成立,第三条件成立,则将实际参数的类成员属性声明中的类型确定为对应的数据库操作变量类型,所述第三条件为实际参数的类成员属性声明中包括了所述数据库操作变量名称的类型;
第四条件下确定单元,若第一至第三条件均不成立,第四条件成立,则将实际参数调用方法的参数声明中的类型确定为对应的数据库操作变量类型,所述第四条件为实际参数调用方法的参数声明中包括了所述数据库操作变量名称的类型;
迭代单元,若第一至第四条件均不成立,执行迭代操作,直至确定所述数据库操作变量类型;所述迭代操作包括将所述数据库操作变量转换为源代码抽象语法树中当前层次所对应的上一层次数据库操作方法中的变量,重新判断第一至第四条件是否成立。
13.根据权利要求12所述的源代码数据库操作异常检测装置,其特征在于,所述类型确定模块,还包括:
抽象语法树生成单元,具体用于生成待测源代码的抽象语法树。
14.根据权利要求8所述的源代码数据库操作异常检测装置,其特征在于,所述类型确定模块,还包括:
数据库信息确定单元,确定各个数据库服务器的IP地址或者域名、用户名和访问口令;
权限确定单元,确定已获取数据库中查询表结构定义的权限;
字段类型导出单元,查询所述数据库表名称对应的表结构中所述字段名称的定义,确定对应的字段类型。
15.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1至7任一项所述的源代码数据库操作异常检测方法。
16.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现权利要求1至7任一项所述的源代码数据库操作异常检测方法。
CN202110352688.XA 2021-03-31 2021-03-31 一种源代码数据库操作异常检测方法及装置 Active CN112860265B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110352688.XA CN112860265B (zh) 2021-03-31 2021-03-31 一种源代码数据库操作异常检测方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110352688.XA CN112860265B (zh) 2021-03-31 2021-03-31 一种源代码数据库操作异常检测方法及装置

Publications (2)

Publication Number Publication Date
CN112860265A CN112860265A (zh) 2021-05-28
CN112860265B true CN112860265B (zh) 2024-02-09

Family

ID=75992033

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110352688.XA Active CN112860265B (zh) 2021-03-31 2021-03-31 一种源代码数据库操作异常检测方法及装置

Country Status (1)

Country Link
CN (1) CN112860265B (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114490390A (zh) * 2022-01-25 2022-05-13 中国农业银行股份有限公司 测试数据生成方法、装置、设备及存储介质
CN116070261A (zh) * 2022-12-15 2023-05-05 上海观安信息技术股份有限公司 数据库的流量识别方法、装置、存储介质及计算机设备
CN117591542B (zh) * 2024-01-18 2024-03-22 准检河北检测技术服务有限公司 一种数据库软件数据安全智能检测方法

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109857630A (zh) * 2017-11-30 2019-06-07 阿里巴巴集团控股有限公司 代码检测方法、系统及设备
CN112100168A (zh) * 2019-06-18 2020-12-18 北京京东尚科信息技术有限公司 一种确定数据关联关系的方法和装置

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109857630A (zh) * 2017-11-30 2019-06-07 阿里巴巴集团控股有限公司 代码检测方法、系统及设备
CN112100168A (zh) * 2019-06-18 2020-12-18 北京京东尚科信息技术有限公司 一种确定数据关联关系的方法和装置

Also Published As

Publication number Publication date
CN112860265A (zh) 2021-05-28

Similar Documents

Publication Publication Date Title
CN112860265B (zh) 一种源代码数据库操作异常检测方法及装置
US11126930B2 (en) Code completion for dynamically-typed programming languages using machine learning
US9058360B2 (en) Extensible language framework using data cartridges
CN108549538B (zh) 一种代码检测方法、装置、存储介质及测试终端
US20200042628A1 (en) Software vulnerability graph database
CN111931181B (zh) 基于图挖掘的软件逻辑漏洞检测方法
CN109710220B (zh) 关系型数据库查询方法、装置、设备及存储介质
CN111259067A (zh) 一种基于Spring实现DAO接口的方法、装置及设备
CN116560683A (zh) 软件更新方法、装置、设备及存储介质
CN117033418A (zh) 语句重写方法、系统及装置
CN108959454B (zh) 一种提示子句指定方法、装置、设备及存储介质
CN111475196A (zh) 编译告警溯源方法、装置、电子设备及计算机可读介质
CN114356964A (zh) 数据血缘构建方法、装置、存储介质及电子设备
CN108694172B (zh) 信息输出方法和装置
US11556531B2 (en) Crux detection in search definitions
CN115114325B (zh) 数据查询方法、装置、电子设备以及存储介质
CN115391785A (zh) 一种软件漏洞的风险检测方法、装置以及设备
CN115129598A (zh) 一种sql语句的风险检测方法、装置、系统及介质
CN112416966B (zh) 即席查询方法、装置、计算机设备和存储介质
JP6955162B2 (ja) 解析装置、解析方法および解析プログラム
CN109635175B (zh) 页面数据拼接方法、装置、可读存储介质和电子设备
CN114647439A (zh) 一种代码扫描的方法、代码迁移的方法及相关装置
CN111796832A (zh) 热补丁文件生成方法、装置、设备及存储介质
CN116450682B (zh) 基于数据合并的模型生成方法、装置、设备及介质
US20240152507A1 (en) Schema-free static query template

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant