本发明涉及互联网技术领域,一种多模式下匹配字符串的方法及系统。
背景技术:
字符串匹配算法在入侵检测,短消息过滤,信息查询等领域尤其是入侵检测方面均有重要的应用。随着网络技术的发展和Internet的普及,网络信息安全越来越受到人们的重视,现在社会是信息社会,保障信息的安全已成为刻不容缓的重要课题。入侵检测技术就是为保证信息系统的安全而设计的一种能够及时发现并报告系统中未授权或者异常信息的技术,具有主动安全防范的特性,表现出良好的发展前景。而入侵检测系统检测引擎的核心即基于字符串匹配的特征匹配算法,这种检测方法可以在主机或网络数据中,通过准确的字符串模式匹配查找攻击签名,从而判断是否出现入侵。随着网络攻击技术的发展和攻击的多样化,如何改进字符串匹配算法,提高检测效率,已成为入侵检测系统研究的核心内容。字符串匹配算法有很多,目前较常用的单模式字符串匹配算法是BM算法和KMP算法。应用广泛的入侵检测系统snort就采用了BM算法,但它是一种单模式的字符串匹配算法,在单一模式的字符串匹配算法中,BM算法一般被认为是性能最佳的。但在多模式字符串匹配过程中,BM算法需要对每一种模式分别进行匹配,因此BM算法的性能就大大降低了。目前的多模式匹配算法,比较高效的有CW算法,AC-BM算法,SBMP算法等。其中,CW算法的思路是首先用模式集构建一棵搜索树,然后在文本中用搜索树对模式进行跳跃搜索,在构建搜索树时,将模式从右边对齐,从右往左进行构建,树上相同的分支节点进行合并。在进行搜索时,以搜索树中模式的最短长度为匹配窗长度,文本从左往右匹配,在匹配窗内搜索树从右往左进行匹配。如果在匹配过程中一旦出现不匹配,则整个匹配树往右移动。匹配树往右移动的位移表可以预先通过线性算法构建。AC-BM算法非常类似于CW算法,采用了“坏字符”和“好后缀”两种启发式规则来进行跳跃。SBMP算法也非常类似于CW算法,但只采用了“坏字符”启发式规则来进行跳跃。
技术实现要素:
本发明所要解决的技术问题是,提供一种多模式下匹配字符串的方法及系统,以解决提高字符串匹配效率的问题。为了解决上述技术问题,本发明公开了一种多模式下匹配字符串的方法,包括:存储模式集信息,所述模式集信息至少包括各关键字的长度和其首字母序号;当接收到字符串时,从所接收的字符串中提取出待匹配字,然后从所存储的模式集信息中查找长度和首字母序号与所述待匹配字的长度和首字母序号均相同的关键字,将所查找到的关键字与待匹配字比较,若比较结果一致,则此待匹配字匹配成功,否则匹配失败。较佳地,上述方法中,通过一个数组存储所述模式集信息,该用于存储模式集信息的数组至少包括关键字长度、关键字首字母序号以及关键字在模式集中可容忍冲突数,其中,关键字在模式集中可容忍冲突数为模式集中关键字长度以及关键字首字母序号均相同的关键字总数,所述数组的值为关键字在模式集中的位置序号。较佳地,上述方法中,从所存储的模式集信息中查找关键字长度和关键字首字母序号与所述待匹配字的长度和首字母序号均相同的关键字为多个时,将所查找到的多个关键字依次与待匹配字进行比较。较佳地,上述方法中,从所存储的模式集信息中查找长度和首字母序号与所述待匹配字的长度和首字母序号均相同的关键字,将所查找到的关键字与待匹配字比较的过程如下:获取所述待匹配字的长度L及其首字母序号M,从用于存储模式集信息的数组中查找长度为L,首字母序号M、可容忍冲突数的值为0的数组元素,比较将所查找到的数组元素对应的关键字与所述待匹配字是否一致,若比较结果一致,则匹配成功,若比较结果不一致,则更新数组元素的可容忍冲突数再从用于存储模式集信息的数组中查找长度为L,首字母序号M、可容忍冲突数为更新值的数组元素,比较所查找到的数组元素对应的关键字与所述待匹配字是否一致,其中,所述数组元素的可容忍冲突数的更新值为上一个所要查找的数组元素的可容忍冲突数的值加1。较佳地,上述方法中,更新所要查找的数组元素时,若更新操作次数达到设定次数时,所提取出的关键字与所述待匹配字仍不一致时,结束本方法的操作。本发明还公开了一种多模式下匹配字符串的系统,包括:存储单元,存储模式集信息,所述模式集信息至少包括各关键字的长度和其首字母序号;匹配单元,当接收到字符串时,从所述字符串中提取出待匹配字,从所述存储单元所存储的模式集信息中查找长度和首字母序号与所述待匹配字的长度和首字母序号均相同的关键字,将所查找到的关键字与待匹配字比较,若比较结果一致,则所述待匹配字匹配成功,否则匹配失败。较佳地,上述系统中,所述存储单元,通过一个数组存储模式集信息,该用于存储模式集信息的数组至少包括关键字长度、关键字首字母序号以及关键字在模式集中可容忍冲突数,其中,关键字在模式集中可容忍冲突数为模式集中关键字长度以及关键字首字母序号均相同的关键字总数,所述数组的值等于关键字在模式集中的位置序号。较佳地,上述系统中,所述匹配单元从所述存储单元所存储的模式集信息中查找关键字长度和关键字首字母序号与所述待匹配字的长度和首字母序号均相同的关键字为多个时,将所查找到的多个关键字依次与待匹配字进行比较。较佳地,上述系统中,所述匹配单元包括处理模块和更新模块:所述处理模块,获取所述待匹配字的长度L及其首字母序号M,从用于存储模式集信息的数组Array中查找长度为L,首字母序号M、可容忍冲突数的值为0的数据元素,比较所查找到数组元素对应的关键字与所述待匹配字是否一致,若比较结果一致,则匹配成功,若当比较结果不一致,向所述更新模块发送更新通知,并从用于存储模式集信息的数组中找出所述更新模块更新的数据元素,若比较所查找到的数据元素对应的关键字与所述待匹配字是否一致;所述更新模块,按照所述处理模块发送的更新通知,更新所要查找的数组元素,其中,更新的所要查找的数组元素的长度保持为L、首字母序号保持为M,可容忍冲突数的值为上一个所要查找的数组元素的可容忍冲突数的值加1。较佳地,上述系统中,所述更新模块,更新所要查找的数组元素时,若更新操作次数达到设定次数时,则不再进行更新操作。本申请技术方案通过构建hash表提供了一种快速匹配字符串的匹配方案,尤其针对小规模的模式集,通过对欲匹配字符串进行筛选,可以用极少的匹配次数完成字符串准确匹配。附图说明图1为本实施例中提取待匹配字后进行匹配的流程图。具体实施方式为使本发明的目的、技术方案和优点更加清楚明白,下文将结合附图对本发明技术方案作进一步详细说明。需要说明的是,在不冲突的情况下,本申请的实施例和实施例中的特征可以任意相互组合。实施例1本案申请人考虑到可以按照模式集中关键字的长度和首字母对所要匹配的字符串先进行一次筛选,再对筛选后的字符串进行具体匹配,这样就避免了所要匹配的字符串与每一个模式都进行匹配,大大减少了匹配次数,缩短了匹配时间即提高了匹配效率。基于上述思想,本实施例提供一种模式下匹配字符串的方法,包括:事先存储模式集信息,该模式集信息至少包括各关键字的长度和其首字母序号;具体地,可通过一个三维的数组来存储模式集信息,该用于存储模式集信息的数组至少包括关键字长度、关键字首字母序号以及关键字在模式集中可容忍冲突数,这三个信息可以分别体现为数组的三个下标,即下标的值分别表示关键字长度、关键字首字母序号以及关键字在模式集中可容忍冲突数。其中,关键字在模式集中可容忍冲突数为模式集中关键字长度以及关键字首字母序号均相同的关键字总数,而每个数组元素的值等于关键字在模式集中的位置序号。本实施例中,假设模式集为{“NULL”,“image”,“img”,“input”,“style”},则用于存放模式集信息的三维数组中第一维指示模式长度,例如模式“image”的长度为5,第二维是关键字的首字母“i”的序号,第三维为可容忍的冲突数,如“image”与“input”的长度都是5,首字母也都是“i”,则第一个出现的关键字“image”冲突值设为0,再次出现的依次加1,“input”冲突值为1。而数组值等于存储序号即关键字在模式集中的位置,如“image”的序号为2。当需要匹配字符串时,从所收到的字符串中提取出待匹配字,再从事先存储的模式集信息中查找长度和首字母序号与待匹配字的长度和首字母序号均相同的关键字,将所查找到的关键字与待匹配字比较,若比较结果一致,即待匹配字匹配成功,反之则匹配失败。其中,从需要匹配字符串中提取待匹配字时,可以空格或标点为分隔符为界提取待匹配字,所提取的待匹配字可能是某个文件的名字,也可能是某个Web页面的脚本,具体根据使用者的要求所定。需要说明的是,从所存储的模式集信息中查找长度和首字母序号与所述待匹配字的长度和首字母序号均相同的关键字为多个时,要将所查找到的多个关键字依次与待匹配字进行比较。具体操作是,获取所述待匹配字的长度L及其首字母序号M,从用于存储模式集信息的数组Array中查找长度为L,首字母序号M、可容忍冲突数的值为0的数据元素,即提取Array[L][M][0],若Array[L][M][0]为-1(本实施例中设置数据元素的初始值为-1,即表示该数组中不存在长度L、首字母序号M的关键字),说明长度或首字母序号不匹配,结束此匹配过程,否则根据所查找到的数组元素的值从模式集中提取出对应的关键字,比较所提取出的关键字与所述待匹配字是否一致,当比较结果不一致时,则更新所要查找的数组元素的下标,查找更新后的数组元素,若更新的数据元素的值不为-1,则根据所查找到的数组元素的值从模式集中提取出对应的关键字,比较所提取出的关键字与所述待匹配字是否一致,其中,更新后的数组元素的下标中长度保持为L、首字母序号保持为M,可容忍冲突数的值为上一个所要查找的数组元素下标中可容忍冲突数的值加1。为了避免重复进行的更新操作对匹配效率有所影响,故优选方案中提出,更新数组下标时,若更新操作次数达到设定次数(本实施例设定次数为3)时,所提取出的关键字与所述待匹配字仍不一致时,就结束整个流程。下面以模式集{“NULL”,“image”,“img”,“input”,“style”}、待匹配字符串“fragment”,“ice”,“inner”为例,说明按照上述方法匹配字符串的具体过程,如图1所示,该过程包括如下步骤:步骤100、构建数组;该步骤中先初始化关键字的匹配数据缓冲区,对要筛选的关键字的数据按照如下条件进行预处理:第一维,字符串长度:<=20*第二维,字母序号:0-25*第三维,可容忍冲突数:0-2*将预处理后的数据存入一数组中,针对模式集{“NULL”,“image”,“img”,“input”,“style”}所构建的数组初始化如下:hash[4][13][0]=1,hash[5][8][0]=2,hash[3][8][0]=3,hash[5][8][1]=4,hash[5][18][0]=5;其他的数组元素值全部预设为-1。步骤200、接收待匹配字符串,从中提取待匹配字;从所接收到的字符串中提取出的待匹配字可能是某个文件的名字,也可能是某个Web页面的脚本,具体根据使用者的要求所定。步骤300,从数组中查找待匹配字对应的数组元素,再将待匹配字与所查找到的数组元素对应的关键字进行比较,若比较结果一致,则匹配,否则匹配失败。该步骤中,按照待匹配字长度和首字母序号进行预处理,从预处理的数组中获得对应的相同长度,相同首字母的关键字序号,如果取得的关键字序号不为-1,则继续比较字符串和提取出的关键字,最多比较设定次数(例如3次),就可以判断本字符串是否是特殊字符串。以欲匹配字符串“fragment”,“ice”,“inner”为例。“fragment”长度为8,首字母“f”对应于5,获取hash[8][5][0],在数组中hash[8][5][0]=-1,不符合模式集中的任一模式的长度和首字母,所以“fragment”匹配不成功。“ice”长度为3,首字母“i”对应于8,获取hash[3][8][0]的值为3,从模式集中取得序号为3的模式为“img”,比较两个字符串“img”与“ice”,不相等,再获取hash[3][8][1]的值,为-1说明没有其他符合这个长度和首字母的模式,所以“ice”匹配不成功。“inner”长度为5,首字母对应于8,获取hash[5][8][0]的值为2,从模式集中取得序号为2的模式为“image”,比较“image”与“inner”,不相等,再获取hash[5][8][1]的值为4,从模式集中取序号为4的模式为“input”,比较“input”与“inner”,不相等,再次获取hash[5][8][2]的值,发现为-1,所以“inner”匹配不成功。从上述例子来看,由于每个字符串最多比较3次,就可以判断本字符串是否能与模式集中的某一模式匹配,对小规模的模式集来说,这是非常高效的。实施例2本实施例提供一种多模式下匹配字符串的系统,可实现上述实施例1的匹配方法,该系统包括存储单元和匹配单元。存储单元,存储模式集信息,模式集信息至少包括各关键字的长度和其首字母序号;其中,存储单元,可以通过一个数组存储模式集信息,该用于存储模式集信息的数组至少包括关键字长度、关键字首字母序号以及关键字在模式集中可容忍冲突数。其中,hash数组的值等于关键字在模式集中的位置序号。关键字在模式集中可容忍冲突数为模式集中关键字长度以及关键字首字母序号均相同的关键字总数。匹配单元,当接收到字符串时,从中提取出待匹配字,从存储单元所存储的模式集信息中查找长度和首字母序号与所述待匹配字的长度和首字母序号均相同的关键字,将所查找到的关键字与待匹配字比较,若比较结果一致,则所接收到的字符串匹配成功,否则匹配失败。需要说明的是匹配单元从存储单元所存储的模式集信息中查找长度和首字母序号与待匹配字的长度和首字母序号均相同的关键字可能是一个也可能是多个,当是多个时,将所查找到的多个关键字依次与待匹配字进行比较。考虑到从所存储的模式集信息中查找长度和首字母序号与待匹配字的长度和首字母序号均相同的关键字可能是多个,故另有一些方案中提出,匹配单元可以分为处理模块和更新模块。处理模块,获取所述待匹配字的长度L及其首字母序号M,从用于存储模式集信息的数组Array中查找长度为L,首字母序号M、可容忍冲突数的值为0的数据元素,即提取Array[L][M][0],若Array[L][M][0]为-1说明长度或首字母序号不匹配,结束此匹配过程,否则根据所查找到的元素值从模式集中提取出对应的关键字,比较所提取出的关键字与所述待匹配字是否一致,当比较结果不一致时,向所述更新模块发送更新通知,并从用于存储模式集信息的数组中找出所述更新模块更新的数据元素,若该数组元素的值不为-1,则根据所查找到的数据元素的值从模式集中提取出对应的关键字,比较所提取出的关键字与所述待匹配字是否一致;更新模块,按照所述更新模块发送的更新通知,更新所要查找的数组元素的可容忍冲突数据的值,更新后的数组元素中长度保持为L、首字母序号保持为M,可容忍冲突数的值为上一个所要查找的数组元素中可容忍冲突数的值加1。本实施例中,可以通过三个下标来指示各数组元素的关键字长度、关键字首字母序号,可容忍冲突数的值。这样,更新模块,更新所要查找的数据元素时,保持两个下标值不变,仅更新一个下标的值即可。也就是保持关键字长度和关键字首字母序号不变,更新可容忍冲突数的值。由于更新操作过多可能会影响到匹配效率以及资源利用率,故优选方案中,更新模块更新所要查找的数组元素时,若更新操作次数达到设定次数时,则不再进行更新操作。本领域普通技术人员可以理解上述方法中的全部或部分步骤可通过程序来指令相关硬件完成,所述程序可以存储于计算机可读存储介质中,如只读存储器、磁盘或光盘等。可选地,上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现。相应地,上述实施例中的各模块/单元可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。本申请不限制于任何特定形式的硬件和软件的结合。从上述实施例可以看出,本申请技术方案在数组中添加了模式长度和模式首字母这一变量,与一般的匹配方案不同,在匹配字符串时先对这个字符串做一次筛选,按照字符串的长度和字符串的首字母,获得对应的数组元素值,也就是模式集中相同长度相同首字母的模式的序号,也就是按照长度和首字母先进行一次筛选,只有通过筛选的才继续进行匹配,这样就避免了字符串与每一个模式都进行匹配,大大减少了匹配次数,缩短了匹配时间。尤其针对小规模的模式集,采用该方案进行匹配效果极佳。以上所述,仅为本发明的较佳实例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。