URL提取方法及装置
文献发布时间:2023-06-19 10:32:14
技术领域
本公开一个或多个实施例涉及软件安全技术领域,尤其涉及一种URL提取方法及装置。
背景技术
随着网络通信技术的不断发展,越来越多的应用程序依靠访问URL来提供服务,与其相关的信息网络安全问题也日益突显。人们在享受网络发展带来便利的同时,面临着大量如垃圾邮件、网络钓鱼、点击欺骗等的恶意网络攻击,它们大多借助恶意URL来完成攻击行为。
从应用程序提取出URL是开展许多异常检测工作的基础。正确的识别和分析源代码中存在的网络通信URL对隐藏服务识别、恶意网站检测、漏洞检测等安全检测中都起到了非常重要的作用。由于URL格式多样,所处的文本环境也复杂,因此,提取具有较大的困难。而且随着信息技术的不断发展和网络攻防技术的变化,URL在应用程序中的存在方式也将更加多变,URL的提取也将变得更加困难。现有的提取方法不够精确,不能满足实际需求。
发明内容
有鉴于此,本公开一个或多个实施例的目的在于提出一种URL提取方法及装置,以解决现有技术中存在的问题。
基于上述目的,本公开一个或多个实施例提供了一种URL提取方法,包括:
获取源代码文件;
基于源代码文件构建抽象语法树;
遍历所述抽象语法树,获取Web-API;
根据Web-API,确定目标参数;
再次遍历所述抽象语法树,判断目标参数是否存在于源代码文件中;
若是,进行第一处理,得到URL;若否,进行第二处理,得到URL。
在其中一个实施例中,所述第一处理包括:根据目标参数的赋值类型,进行对应的提取处理;其中,所述目标参数的赋值类型包括常量赋值、函数赋值和用户输入。
在其中一个实施例中,在所述第一处理中:当目标参数为常量赋值时,进行第一提取处理:直接提取目标参数对应的常量字符串;当目标参数为用户输入时,进行第二提取处理:设定用户输入,提取设定用户输入对应的常量字符串。
在其中一个实施例中,当目标参数为函数赋值时,进行第三提取处理;所述第三提取处理包括:
跟踪目标参数依赖的构造函数对应的参数的赋值和方法调用构造,解析目标参数的值,获得常量字符串;
按照构造函数执行所得常量字符串,得到完整常量字符串。
在其中一个实施例中,跟踪目标参数依赖的构造函数对应的参数的赋值和方法调用构造,解析目标参数的值,获得常量字符串具体可以包括:
判断提取目标参数依赖的构造函数对应的参数的赋值类型;
当参数为常量赋值时,进行所述第一提取处理;当参数为用户输入时,进行所述第二提取处理;当参数为函数输入时,进行所述第三提取处理。
在其中一个实施例中,所述第二处理包括:根据源代码文件引入的外部资源文件的类型,进行对应的提取处理。
在其中一个实施例中,所述第二处理具体包括:当外部资源文件的类型为源代码型时,循环基于源代码文件构建抽象语法树至得到URL的步骤;当外部资源文件的类型为非源代码型时,搜索目标参数的值,得到常量字符串。
在其中一个实施例中,所述根据Web-API,确定目标参数具体包括:
根据Web-API调用模块的信息,解析Web-API依赖的节点,得到调用方法所依赖的对象及其参数,即得目标参数。
在其中一个实施例中,还包括,存储URL至文件中,并输出URL及URL所在的文件路径。
本公开实施例还提供一种URL提取装置,包括:
源代码文件获取模块,用于获取源代码文件;
抽象语法树构建模块,用于基于源代码文件构建抽象语法树;
Web-API获取模块,用于遍历所述抽象语法树,获取Web-API;
目标参数确定模块,用于根据Web-API,确定目标参数;
目标参数位置判断模块,用于再次遍历所述抽象语法树,判断目标参数是否存在于源代码文件中;
处理模块,用于若目标参数存在于源代码文件中为是,进行第一处理,得到URL;若目标参数存在于源代码文件中为否,进行第二处理,得到URL。
从上面所述可以看出,本公开一个或多个实施例提供的URL提取方法及装置,通过:获取源代码文件;基于源代码文件构建抽象语法树;遍历所述抽象语法树,获取Web-API;根据Web-API,确定目标参数;再次遍历所述抽象语法树,判断目标参数是否存在于源代码文件中;若是,进行第一处理;若否,进行第二处理,得到URL。能够直接获取源代码中存在的URL。具有URL提取的准确率较高,能够较为灵活的应对不同的场景,无需实时维护等优点,大大提升源代码中可疑URL检测的工作效率。
附图说明
为了更清楚地说明本公开一个或多个实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开一个或多个实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本公开实施例的URL整体提取方法的流程示意图;
图2为本公开实施例的URL提取方法的流程示意图;
图3为本公开实施例的抽象语法树的示意图;
图4为本公开实施例的URL的具体提取方法的流程示意图;
图5为本公开实施例的URL提取装置示意图;
图6为本公开实施例的电子设备的示意图。
具体实施方式
为使本公开的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本公开进一步详细说明。
需要说明的是,除非另外定义,本公开一个或多个实施例使用的技术术语或者科学术语应当为本公开所属领域内具有一般技能的人士所理解的通常意义。本公开一个或多个实施例中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。
如背景技术部分所述,URL是Uniform Resource Location的缩写,译为“统一资源定位符”。URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
申请人在实现本公开的过程中发现,目前的URL提取工作使用的主要是正则匹配技术。正则表达式(RgeularExPersion)定义了一个用来搜索匹配字符串的模式。利用正则表达式可以实现字符串的模式匹配,以及对输入域中的值进行数据验证。但是正则表达式匹配来提取URL的方法有两个缺点。首先,正则匹配的检测目标单一,对于对短网址、包含IP地址、格式特殊或是处在复杂语境中的 URL 提取效果不佳,而且如果URL使用别字或是大小写切换进行对抗时也会出现无法识别的情况,从而造成很多漏报。除此之外,正则匹配方法的效率较低,容易发生匹配异常,进而导致崩溃或者资源耗尽等情况。
申请人提出一种通过解析源代码抽象语法树的URL提取的方法,该方法主要包括AST(Abstract Syntax Tree)抽象语法树生成、URL提取和输出三个部分。对该源代码生成抽象语法树,然后对抽象语法树进行解析,获取其中存在的URL。整体流程图如图1所示。具有URL提取的准确率较高,能够较为灵活的应对不同的场景,无需实时维护等优点,大大提升源代码中可疑URL检测的工作效率。
以下,通过具体的实施例进一步详细说明本公开的技术方案。
请参阅图2,本公开实施例提供一种URL提取方法,包括:
S100,获取源代码文件;
S200,基于源代码文件构建抽象语法树;
S300,遍历所述抽象语法树,获取Web-API;
S400,根据Web-API,确定目标参数;
S500,再次遍历所述抽象语法树,判断目标参数是否存在于源代码文件中;
S600,根据目标参数的存储位置,进行对应的处理,得到URL。
本公开一个或多个实施例中,步骤S100中,所述源代码文件的类型可以为C语言和Java等常见语言中的至少一种。可以通过访问待测的源代码文件夹所在路径,来获取源代码文件。
本公开一个或多个实施例中,步骤S200中,基于源代码文件构建抽象语法树具体可以包括:根据源代码文件的具体开发语言类型,采用抽象语法树构建工具构建对应的抽象语法树。也即,该步骤为对每一个源代码文件建立抽象语法树,得到对应的抽象语法树。该步骤根据源代码的不同开发语言选择合适的抽象语法树构建工具,如C语言使用Antlr;Java则使用Java parser;JavaScript则使用JavaScript Parser。在构建所得抽象语法树中,每个节点都表示源代码中的一种结构,可以包括函数声明、函数调用、变量声明和变量赋值等。
在应用场景中,源代码可以如下所示:
function test( ) {
var a =http://test.com;
function visit(x) {
//visit the website
Return 0;
}
Visit(a)
}。
该源代码为JavaScript,可以采用JavaScript Parser构建抽象语法树。对应得到的抽象语法树可以如图3所示。其中Function literal模块为函数显式定义;Functioncall模块为函数调用;Variable declaration模块为变量声明;Return statement模块为返回语句;Assignment和Literal组合即是为变量a赋值为“http://test.com”。
本公开一个或多个实施例中,步骤S300中,通过遍历抽象语法树种的所有节点,能够读取到源代码中的各个API (Application Programming Interface:应用程序接口)的调用流程、变量的各种操作等。其中,API可以为在Web上发挥功能的Web-API。Web-API包括编程语言内置的utl访问函数,也包括常见的第三方网络库。
本公开一个或多个实施例中,步骤S400中,对于每个Web-API,根据Web-API调用模块的信息,解析Web-API依赖的节点,得到调用方法所依赖的对象及对象的参数,即得目标参数。其中,节点可以为调用方法。也即,根据Web-API的不同类型,提取特定位置的参数或对象。
本公开一个或多个实施例中,步骤S500中,通过再次遍历抽象语法树,能够确定目标参数是否存在于源代码文件中。
请参阅图4,本公开一个或多个实施例中,步骤S600中,根据目标参数的存储位置,进行对应的处理。具体包括:若是,进行第一处理,得到URL;若否,进行第二提取,得到URL。也即,若目标参数存在于源代码文件中,进行第一处理,得到URL;若目标参数存在于外部资源文件中,进行第二提取,得到URL。
本公开一个或多个实施例中,第一处理包括:根据目标参数的赋值类型,进行对应的提取处理。其中,所述目标参数的赋值类型包括常量赋值、函数赋值和用户输入。
本公开一个或多个实施例中,当目标参数为常量赋值时,进行第一提取处理。第一提取处理包括:直接提取目标参数对应的常量字符串。
在应用场景中,例如Java中,当Web-API为openStream()时,其调用方式为url.openStream(),其中url即为目标参数。然后对变量url进行分析,若其赋值操作为url= new URL("http://www.baidu.com"),则该url的值为常量字符串“http://www.baidu.com”,即为要提取的URL。
本公开一个或多个实施例中,当目标参数为用户输入时,进行第二提取处理,第二提取处理包括:设定用户输入,提取设定用户输入对应的的常量字符串。在应用场景种,用户输入可以设定为“USER INPUT URL”。
本公开一个或多个实施例中,当目标参数为函数赋值时,进行第三提取处理。函数赋值可以为依赖于字符串连接或者依赖其他的函数构造,如使用字符串构建的字符串生成器.append()方法字符串.concat()方法和“+”运算符的方法。
本公开一个或多个实施例中,第三提取处理包括:
跟踪目标参数依赖的构造函数对应的参数的赋值和方法调用构造,解析目标参数的值,获得常量字符串;
按照构造函数执行所得常量字符串,得到完整常量字符串。
本公开一个或多个实施例中,跟踪目标参数依赖的构造函数对应的参数的赋值和方法调用构造,解析目标参数的值,获得常量字符串具体可以包括:
判断提取目标参数时依赖的构造函数对应的参数的赋值类型;
根据参数的赋值类型,进行对应的提取处理。其中,所述参数的赋值类型包括常量赋值、函数赋值和用户输入。
当参数为常量赋值时,进行所述第一提取处理。所述第一处理与前述相同,此处不再赘述。当参数为用户输入时,进行所述第二提取处理,所述第二提取处理与前述相同,此处不再赘述。当参数为函数输入时,进行所述第三提取处理,所述第三提取处理与前述相同,此处不再赘述。
在应用场景中,例如Java中,当Web-API为openStream()时,其调用方式为url.openStream(),其中url即为目标参数。然后对变量url进行分析,若其赋值操作为url=a.append("baidu.com"),则继续分析参数a的值,若参数a为常量字符串,则参数a和“baidu.com”连接得到完整常量字符串,即为提取出的URL;若参数a为用户输入,则设定其为“USER INPUT URL”,将“USER INPUT URL”与“baidu.com”连接得到完整常量字符串,即为提取出的URL;若参数a为函数赋值,则重复参数分析,直至得到常量字符串,并与“baidu.com”连接得到完整常量字符串,即为提取出的URL。
本公开一个或多个实施例中,第二处理包括:根据源代码文件引入的外部资源文件的类型,进行对应的提取处理。引入的外部资源文件可以包括include<>、import,也包括常见的文件读写函数,如File()、fopen()等。
具体包括:当外部资源文件的类型为源代码型时,循环基于源代码文件构建抽象语法树至得到URL的步骤;当外部资源文件的类型为非源代码型时,搜索目标参数的值,得到常量字符串。应当理解的是,此处基于源代码文件构建抽象语法树,指的是,基于源代码型的外部资源文件,构建抽象语法树。
本公开一个或多个实施例中,还包括,存储URL至文件中,并输出URL及URL所在的文件路径。
本公开实施例还提供如下的URL提取方法:
以前述的源代码为例,该段源代码对应的抽象语法图如图3所示。通过遍历语法树,读取函数定义模块Function literal模块,确定Web-API为visit()。分析函数调用模块Function call,即visit()的调用模块,得到目标参数a。再次遍历语法树,从变量声明Variable declaration模块和赋值模块Assignment模块和Literal模块的组合,分析变量a赋值为“http://test.com”,即成功提取该源代码中的URL。
本公开实施例提供的URL提取方法,通过提供保存待测源代码文件夹所在路径,读取源代码并对其进行URL提取。具体提取方法为首先对源代码文件创建抽象语法树(AST),再遍历抽象语法树,搜索通信相关的Web-API。针对找到的Web-API的调用,递归地解析API依赖的节点,分析调用方法所依赖的对象及其参数。跟踪调用方法中每个变量的所有赋值和方法调用构造。通过对这些Web-API对应的对象和参数进行提取和分析,即得源代码中存在的URL。并按照提取系统的输出结果,将每个被提取到的URL保存到文件中,输出包括该URL、URL所在文件路径。
本公开实施例提供的URL提取方法,从API调用URL的角度,在数据流中提取URL,URL的格式变换对提取方法没有影响,因此无需定期维护规则。能够避免正则匹配的检测目标单一,能涉及到的范围有限,导致的如果出现不同格式的URL就需要对其进行更新操作。从API调用URL的角度,在数据流中提取URL,还能避免考虑多种URL存在方式的不确定性,使得提取URL简单且高效。而且该方法对软件反编译后得到的源代码进行分析,调用关系更加完整,可以减少很多漏报,因此检测更全面。避免了正则匹配只能检测其设定的格式的URL,URL的格式更新和URL拼接等操作导致的提取效果不佳等。同时,该方法还能够灵活的应对新的URL,在实际使用中,达到人力、计算量、速度、效果等多方面因素的较好平衡。因此,具有很强的可实行性,避免规则匹配方法在维护规则时的困难。
需要说明的是,本公开一个或多个实施例的方法可以由单个设备执行,例如一台计算机或服务器等。本实施例的方法也可以应用于分布式场景下,由多台设备相互配合来完成。在这种分布式场景的情况下,这多台设备中的一台设备可以只执行本公开一个或多个实施例的方法中的某一个或多个步骤,这多台设备相互之间会进行交互以完成所述的方法。
需要说明的是,上述对本公开特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
基于同一发明构思,与上述任意实施例方法相对应的,本公开一个或多个实施例还提供了一种URL提取装置。
参考图5,所述URL提取装置700,包括:
源代码文件获取模块710,用于获取源代码文件;
抽象语法树构建模块720,用于基于源代码文件构建抽象语法树;
Web-API获取模块730,用于遍历所述抽象语法树,获取Web-API;
目标参数确定模块740,用于根据Web-API,确定目标参数;
目标参数位置判断模块750,用于再次遍历所述抽象语法树,判断目标参数是否存在于源代码文件中;
处理模块760,用于若目标参数存在于源代码文件中为是,进行第一处理;若目标参数存在于源代码文件中为否,进行第二处理,得到URL。
本公开一个或多个实施例中,所述处理模块760,在用于所述第一处理时,具体用于:根据目标参数的赋值类型,进行对应的提取处理;其中,所述目标参数的赋值类型包括常量赋值、函数赋值和用户输入。
本公开一个或多个实施例中,所述处理模块760,在用于所述第一处理时,具体用于:当目标参数为常量赋值时,进行第一提取处理:直接提取目标参数对应的常量字符串;当目标参数为用户输入时,进行第二提取处理:设定用户输入,提取设定用户输入对应的的常量字符串。
本公开一个或多个实施例中,所述处理模块760,具体用于:当目标参数为函数赋值时,进行第三提取处理;所述第三提取处理包括:
跟踪目标参数依赖的构造函数对应的参数的赋值和方法调用构造,解析目标参数的值,获得常量字符串;
按照构造函数执行所得常量字符串,得到完整常量字符串。
本公开一个或多个实施例中,所述处理模块760在用于跟踪目标参数依赖的构造函数对应的参数的赋值和方法调用构造,解析目标参数的值,获得常量字符串时,具体用于:
判断提取目标参数依赖的构造函数对应的参数的赋值类型;
当参数为常量赋值时,进行所述第一提取处理;当参数为用户输入时,进行所述第二提取处理;当参数为函数输入时,进行所述第三提取处理。
本公开一个或多个实施例中,所述处理模块760在用于所述第二处理时,包括:根据源代码文件引入的外部资源文件的类型,进行对应的提取处理。
本公开一个或多个实施例中,所述处理模块760在用于所述第二处理时,具体包括:当外部资源文件的类型为源代码文件时,循环基于源代码文件构建抽象语法树至得到URL的步骤;当外部资源文件的类型为非源代码文件时,搜索目标参数的值,得到常量字符串。
本公开一个或多个实施例中,所述目标参数确定模块740,在用于所述根据Web-API,确定目标参数时具体用于:
根据Web-API调用模块的信息,解析Web-API依赖的节点,得到调用方法所依赖的对象及其参数,即得目标参数。
本公开一个或多个实施例中,还包括,存储模块,用于:存储URL至文件中,并输出URL及URL所在的文件路径。
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本公开一个或多个实施例时可以把各模块的功能在同一个或多个软件和/或硬件中实现。
上述实施例的装置用于实现前述实施例中相应的方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
基于同一发明构思,与上述任意实施例方法相对应的,本公开一个或多个实施例还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上任意一实施例所述的URL提取方法。
图6示出了本公开实施例所提供的一种更为具体的电子设备硬件结构示意图,该设备可以包括:处理器1010、存储器1020、输入/输出接口1030、通信接口1040和总线 1050。其中处理器1010、存储器1020、输入/输出接口1030和通信接口1040通过总线1050实现彼此之间在设备内部的通信连接。
处理器1010可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本公开实施例所提供的技术方案。
存储器1020可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器1020可以存储操作系统和其他应用程序,在通过软件或者固件来实现本公开实施例所提供的技术方案时,相关的程序代码保存在存储器1020中,并由处理器1010来调用执行。
输入/输出接口1030用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
通信接口1040用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。
总线1050包括一通路,在设备的各个组件(例如处理器1010、存储器1020、输入/输出接口1030和通信接口1040)之间传输信息。
需要说明的是,尽管上述设备仅示出了处理器1010、存储器1020、输入/输出接口1030、通信接口1040以及总线1050,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本公开实施例方案所必需的组件,而不必包含图中所示的全部组件。
上述实施例的电子设备用于实现前述实施例中相应的方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
基于同一发明构思,与上述任意实施例方法相对应的,本公开一个或多个实施例还提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行如上任一实施例所述的URL提取方法。
本实施例的计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本公开的范围(包括权利要求)被限于这些例子;在本公开的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以以任意顺序实现,并存在如上所述的本公开一个或多个实施例的不同方面的许多其它变化,为了简明它们没有在细节中提供。
另外,为简化说明和讨论,并且为了不会使本公开一个或多个实施例难以理解,在所提供的附图中可以示出或可以不示出与集成电路(IC)芯片和其它部件的公知的电源/接地连接。此外,可以以框图的形式示出装置,以便避免使本公开一个或多个实施例难以理解,并且这也考虑了以下事实,即关于这些框图装置的实施方式的细节是高度取决于将要实施本公开一个或多个实施例的平台的(即,这些细节应当完全处于本领域技术人员的理解范围内)。在阐述了具体细节(例如,电路)以描述本公开的示例性实施例的情况下,对本领域技术人员来说显而易见的是,可以在没有这些具体细节的情况下或者这些具体细节有变化的情况下实施本公开一个或多个实施例。因此,这些描述应被认为是说明性的而不是限制性的。
尽管已经结合了本公开的具体实施例对本公开进行了描述,但是根据前面的描述,这些实施例的很多替换、修改和变型对本领域普通技术人员来说将是显而易见的。例如,其它存储器架构(例如,动态RAM(DRAM))可以使用所讨论的实施例。
本公开一个或多个实施例旨在涵盖落入所附权利要求的宽泛范围之内的所有这样的替换、修改和变型。因此,凡在本公开一个或多个实施例的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本公开的保护范围之内。
- URL提取方法及装置
- 统一资源定位符URL指纹特征的提取方法及装置