一种带通配符正则表达式的有穷自动机生成方法

文档序号:6632447阅读:309来源:国知局
一种带通配符正则表达式的有穷自动机生成方法
【专利摘要】本发明涉及一种带通配符正则表达式的有穷自动机生成方法,其特征在于,按照如下步骤实现:S1:根据带通配符正则表达式生成抽象语法树,并对该抽象语法树的每个节点编号;S2:根据抽象语法树计算每个节点的nullable(n)和每个节点的三个位置集合;S3:将抽象语法树根节点的firstpos(n0)作为第一个状态,存储到到状态集合中;遍历状态集合,若在遍历过程中产生新的状态,则将新的状态加入到状态集合中,记录转换关系;在遍历每个状态时,计算该状态中的每个字符的跟随状态,并根据条件存放到状态集合中。本发明所提出的一种带通配符正则表达式的有穷自动机生成方法,有效的提高了编译的效率,降低了对内存的消耗。
【专利说明】一种带通配符正则表达式的有穷自动机生成方法

【技术领域】
[0001] 本发明涉及网络入侵检测【技术领域】,特别是一种带通配符正则表达式的有穷自动 机生成方法。

【背景技术】
[0002] 现在网络入侵越来越复杂,在网络应用层的漏洞成为了黑客的重点攻击目标,利 用网络应用层的漏洞进行攻击时,攻击者的数据都是隐藏在正常的数据通道中的,传统的 基于状态的检测方式对正常的通道是允许通过的,很难检测这种应用层的攻击,所以对于 应用层的攻击检测一般都需要检查网络通路中的数据内容,看是否具有攻击特征。由于正 则表达式具有很高的灵活性,因此基于内容的检测方法中,攻击的规则大都使用正则表达 式来表75。
[0003] 通配符是正则表达式中应用非常广泛的一项特性,使得正则表达式可以表现的非 常灵活。在正则表达式中,一般的通配符有"、"\?"、"\(1"、"\,等。"."表示所有字符, 即256个ASCII字符,"\w"代表单词字符,即字母、数字和下划线,"\d"表示数字,"\s"代 表空格字符串,包括空格,tab键等。在网络入侵中,匹配的规则一般使用正则表达式表示, 正则中一般都包含有各种通配符,例如可以使用select\scount (*) \sfrom\s\w*正则表达 式来判断是否存在某种sql注入的可能。
[0004] 正则表达式的解析有NFA和DFA两种方式。其中NFA称为非确定的有穷状态自动 机,DFA称为确定的有穷自动机,NFA采用回溯的机制,所以可以支持较多的通配符等,但是 由于采用了回溯的机制,所以效率不高。DFA采用的是状态转移的方式,效率非常高,非常适 合性能要求高的入侵检测方法,但是DFA也有一个缺陷是不能很好的支持通配符。DFA在 对包含有通配符的正则表达式编译时,编译时间非常长,会生成大量的状态,消耗尽主机内 存,同时会消耗大量的编译时间。当前一般的入侵检测为了利用DFA的效率,一般都是采用 DFA和NFA结合的方式,比如采用拆分表达式的方式,对aaa. *bbb,拆分为两个不含通配符 的子表达式aaa和bbb,然后使用DFA分别判断aaa和bbb是否符合要求,再判断bbb是否 在aaa之后,如果符合了这些子表达式的要求,再使用NFA的方式对aaa. *bbb进行第二遍 扫描。


【发明内容】

[0005] 本发明的目的在于提供一种带通配符正则表达式的有穷自动机生成方法,以克服 现有编译中存在的缺陷,高效的生成DFA的状态,同时减小内存消耗。
[0006] 为实现上述目的,本发明的技术方案是:一种带通配符正则表达式的有穷自动机 生成方法,其特征在于,按照如下步骤实现: 51 :根据带通配符正则表达式生成抽象语法树(T),并对该抽象语法树(T)的每个节点 编号; 52 :根据步骤Sl中所生成的所述抽象语法树(T)计算每个节点的nullable(n)和每个 节点的三个位置集合;其中,nullable (n)表示节点n代表的子表达式是否可以为空;三个 位置集合分别表示为:firstpos(n)、lastpos(n)和 followpos(p),且 firstpos(n)表示节点 n代表的子树的开始字符的位置集合,lastpost (n)表示节点n代表的子树的结束字符的 位置集合,followpos (p)表示节点p之后的可以跟随的节点的位置集合; S3 :根据步骤Sl和步骤S2中得到的结果,生成有穷自动机(DFA),并将输出的有穷自 动机(DFA)表示为D ;将所述抽象语法树(T)根节点的firstp〇s(n0)作为第一个状态,并 存储到有穷自动机(DFA)的状态集合(Dstates)中,然后开始遍历状态集合(Dstates), 直到状态集合(Dstates)中的所有状态都完成遍历;若在遍历过程中产生新状态,且在 状态集合(Dstates)中不存在该新状态,则该新状态存储到状态集合(Dstates)中,若 在状态集合(Dstates)中存在该新状态,则不将该新状态存储到状态集合(Dstates) 中;在判断该新状态过程中,不论该新状态是否存在于状态集合(Dstates)中,均记 录转换关系,并将该转换关系存储到有穷自动机(DFA)的状态之间的转换关系集合 (Dtrans)中;其中,在遍历状态集合(Dstates)中每个状态时,计算该状态中的每个字符 Gfl的跟随状态,并根据条件存放到状态集合(Dstates)中。
[0007] 进一步的,在所述步骤S3中,在计算每个状态中的每个字符Gfl的跟随状态的过程 中,还包括如下步骤: 531 :判断状态§字符(^是否还有剩余字符计算,若有,则转到步骤S32,否则返回到遍 历状态集合中状态; 532 :将状态§中和字符€^对应的所有位置p的followpos (p)的并集表示为U ; 533 :判断并状态集合(Dstates)是否还有下一状态;若是,则转到步骤S34,否则转到 步骤S36 ; 534 :取状态集合(Dstates)中的下一个状态Sl0 ; 535 :调用集合比较算法比较状态Si与并集U,判断状态^与并集U是否相等;若相等, 则转到步骤S36,否则转到步骤S33 ; 536 :将并集U作为未标记的状态存储到状态集合(Dstates)中; 537 :记录对应的转换关系,将该转换关系存储到转换关系集合(Dtrans)中。
[0008] 在本发明一实施例中,还包括一预设扩展ASCII码表,该预设扩展ASCII码表在基 本的ASCII码表中增加整数"256"的通配符整数"257"的通配符"\w"、整数"258"的 通配符" \d"和整数" 259 "的通配符" \s "。
[0009] 相较于现有技术,本发明具有以下有益效果: 本发明所提出的一种带通配符正则表达式的有穷自动机生成方法,可以很好的直接将 带通配符正则表达式编译为DFA,编译的时间将和通配符的个数成线性关系,而非指数关 系,大大提高编译的效率,可以一次性的编译带通配符的正则表达式,不需要采用将正则表 达式拆分为多个子表达式的方式和在应用入侵检测系统中做多次匹配的方式,从而有效地 提高整体的处理效率。在应用到入侵检测系统中时,该方法在入侵检测系统启动时可以对 入侵检测规则立即进行编译,不用提前编译,如果用户添加了规则,那么这些规则可以和预 先定义的规则一起重新再编译,从而有效的解决了入侵检测的规则的统一性,减少了传统 编译方式中存在的预先编译时间的消耗以及对于用户自行添加入侵检测规则时产生的多 次匹配问题。

【专利附图】

【附图说明】
[0010] 图1为本发明中一种带通配符正则表达式的有穷自动机生成方法中生成DFA的流 程图。
[0011] 图2为本发明中生成DFA过程中对每个字符的跟随状态的处理的流程图。
[0012] 图3为本发明一实施例中利用直接展开通配符的编译方式生成的抽象语法树。
[0013] 图4为本发明一实施例中利用一种带通配符正则表达式的有穷自动机生成方法 生成的抽象语法树。
[0014] 图5为本发明一实施例中正则表达式应用在入侵检测系统中的结构图。

【具体实施方式】
[0015] 下面结合附图,对本发明的技术方案进行具体说明。
[0016] 本发明提供一种带通配符正则表达式的有穷自动机生成方法,其特征在于,按照 如下步骤实现: 51 :根据带通配符正则表达式生成抽象语法树T,并对该抽象语法树T的每个节点编 号; 52 :根据步骤Sl中所生成的所述抽象语法树T计算每个节点的nullable (n)和每个 节点的三个位置集合,位置集合就对应的是语法树中节点编号的集合,其中,nullable (n) 表示节点n代表的子表达式是否可以为空;三个位置集合分别表示为:firstp〇S(n)、 lastpos(n)和followpos(p),且firstpos(n)表示节点n代表的子树的开始字符的位置集 合,lastpost (n)表示节点n代表的子树的结束字符的位置集合,followpos (p)表示节点 P之后的可以跟随的节点的位置集合; 53 :如图1所示,根据步骤Sl和步骤S2所得到的结果,即步骤Sl中的抽象语法树以 及步骤S2中的位置集合,生成有穷自动机DFA,并将输出的有穷自动机DFA表示为D ;将所 述抽象语法树T根节点的firstpos (n0)作为第一个状态,并存储到有穷自动机DFA的状态 集合Dstates中,然后开始遍历状态集合Dstates,直到状态集合Dstates中的所有状态都 完成遍历;若在遍历过程中产生新状态,且在状态集合Dstates中不存在该新状态,则该新 状态存储到状态集合Dstates中,若在状态集合Dstates中存在该新状态,则不将该新状态 存储到状态集合Dstates中;在判断该新状态过程中,不论该新状态是否存在于状态集合 Dstates中,均记录转换关系,并将该转换关系存储到有穷自动机DFA的状态之间的转换关 系集合Dtrans中;其中,在遍历状态集合Dstates中每个状态时,计算该状态中的每个字符 Gfl的跟随状态,并根据条件存放到状态集合Dstates中;在遍历过程完成后,D的接受状态 集合包括在正则表达式最后位置插入的特殊结束标记的位置状态;在本实施例中,接受状 态指匹配成功的状态,接受状态集合表示的是匹配成功的状态集合,由于该特殊结束标记 在语法树中有一个位置编号,故其存在对应的位置状态。
[0017] 进一步的,在所述步骤S3中,如图2所示,在计算每个状态中的每个字符Glj的跟 随状态的过程中,还包括如下步骤: 531 :判断状态g字符Gfl是否还有剩余字符计算,若有,则转到步骤S32,否则返回到遍 历状态集合中状态; 532 :将状态g中和字符(^对应的所有位置p的followpos (p)的并集表示为U ; 533 :判断并状态集合(Dstates)是否还有下一状态;若是,则转到步骤S34,否则转到 步骤S36 ; 534 :取状态集合(Dstates)中的下一个状态Sy ; 535 :调用集合比较算法比较状态与并集U,判断状态|_与并集U是否相等;若相等, 则转到步骤S36,否则转到步骤S33 ; 536 :将并集U作为未标记的状态存储到状态集合(Dstates)中; 537 :记录对应的转换关系,将该转换关系存储到转换关系集合(Dtrans)中。
[0018] 为了让本领域技术人员更了解本发明所提出的一种带通配符正则表达式的有穷 自动机生成方法,下面结合传统的直接展开通配符的编译方式,对本发明中所提出的方法 进行具体描述。
[0019] 以表达式:a. *b为例描述带通配符的正则表达式的编译处理流程,其中表示 无限多的字符。
[0020] 首先,按照步骤Sl建立抽象语法树,如图3所示,其中,"〇"表示连接运算符,每个 节点的右边的数字表示的是位置编号。
[0021] 其次,按照步骤 S2 生成相应的 nullable (n)、firstpos (n)、lastpos (n)和 followpos (p),如下表表1示:

【权利要求】
1. 一种带通配符正则表达式的有穷自动机生成方法,其特征在于,按照如下步骤实 现: 51 :根据带通配符正则表达式生成抽象语法树(T),并对该抽象语法树(T)的每个节点 编号; 52 :根据步骤S1中所生成的所述抽象语法树(T)计算每个节点的nullable(n)和每个 节点的三个位置集合;其中,nullable(n)表示节点n代表的子表达式是否可以为空;三个 位置集合分别表示为:firstpos(n)、lastpos(n)和followpos(p),且firstpos(n)表示节点 n代表的子树的开始字符的位置集合,lastpost(n)表示节点n代表的子树的结束字符的 位置集合,followpos(p)表示节点p之后的可以跟随的节点的位置集合; 53 :根据步骤S1和步骤S2中得到的结果,生成有穷自动机(DFA),并将输出的有穷自 动机(DFA)表示为D ;将所述抽象语法树(T)根节点的firstp〇s(n0)作为第一个状态,并 存储到有穷自动机(DFA)的状态集合(Dstates)中,然后开始遍历状态集合(Dstates), 直到状态集合(Dstates)中的所有状态都完成遍历;若在遍历过程中产生新状态,且在 状态集合(Dstates)中不存在该新状态,则该新状态存储到状态集合(Dstates)中,若 在状态集合(Dstates)中存在该新状态,则不将该新状态存储到状态集合(Dstates) 中;在判断该新状态过程中,不论该新状态是否存在于状态集合(Dstates)中,均记 录转换关系,并将该转换关系存储到有穷自动机(DFA)的状态之间的转换关系集合 (Dtrans)中;其中,在遍历状态集合(Dstates)中每个状态时,计算该状态中的每个字符 的跟随状态,并根据条件存放到状态集合(Dstates)中。
2. 根据权利要求1所述的一种带通配符正则表达式的有穷自动机生成方法,其特征在 于:在所述步骤S3中,在计算每个状态中的每个字符Gfl的跟随状态的过程中,还包括如下 步骤: 531 :判断状态g字符是否还有剩余字符计算,若有,则转到步骤S32,否则返回到遍 历状态集合中状态; 532 :将状态§中和字符(^对应的所有位置p的followpos(p)的并集表示为U; 533 :判断并状态集合(Dstates)是否还有下一状态;若是,则转到步骤S34,否则转到 步骤S36 ; 534 :取状态集合(Dstates)中的下一个状态; 535 :调用集合比较算法比较状态S>fl与并集U,判断状态§8与并集U是否相等;若相等, 则转到步骤S36,否则转到步骤S33 ; 536 :将并集U作为未标记的状态存储到状态集合(Dstates)中; 537 :记录对应的转换关系,将该转换关系存储到转换关系集合(Dtrans)中。
3. 根据权利要求1所述的一种带通配符正则表达式的有穷自动机生成方法,其特征在 于:还包括一预设扩展ASCII码表,该预设扩展ASCII码表在基本的ASCII码表中增加整数 "256"的通配符整数"257"的通配符"V'、整数"258"的通配符"\d"和整数"259"的 通配符"\s"。
【文档编号】G06F21/55GK104407849SQ201410599232
【公开日】2015年3月11日 申请日期:2014年10月31日 优先权日:2014年10月31日
【发明者】王 琦, 刘坤朋, 张木连, 张冬青 申请人:福建六壬网安股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1