正则表达式的redos攻击

1.危害

书写不恰当的正则表达式有可能造成redos攻击(正则表达式拒绝服务攻击(Regular Expression Denial of Service)),攻击者可构造特殊的字符串,导致正则表达式运行会消耗大量的内存和cpu导致服务器资源被耗尽。无法继续响应,那为何不确定的正则表达式会导致redos攻击呢?这得从正则表达式的实现原理说起。

2.原理

正则表达式的实现一般分为2类。
Deterministic Finite Automaton (DFA) 和Nondeterministic Finite Automaton (NFA)
DFA:确定有穷自动机,即匹配的路径是确定的。所以时间空间复杂度是确定的。但是这类正则能实现的功能很有限。目前复杂点的正则使用的都是NFA。
NFA:不确定有穷自动机。匹配的路径是不确定的,如果在某一条路径能够完成匹配,则能够及时返回。如果没能匹配上,则会回溯,尝试其他的路径。直到把所有的路径走完。这就是NFA为什么可能会造成redos攻击的原因。不恰当的正则表达式对于输入的原字符串,即便多加一个字符,执行的时间可能会成倍的增长。
NFA的特性:
1.一个有限的状态集合S
2.一个输入符号集合sigma,空字符epsilon不属于Sigma
3.状态迁移函数F,对于特定的输入字符和状态,输出对应的变更状态集合
4.s0为初始状态
5.S子集为结束状态集
NFA的搜索类似于DFS,深度优先搜索。

我们看个会造成redos的正则 ^(a+)+$
在这里插入图片描述
对于简单的输入:aaaab,其可能的路径就能达到16种,在我们看来一目了然的匹配结果,会随着输入的字符数量越多,其执行的时间可能越长。尤其对于表达式包含许多分组,不恰当的通配符的使用,一些重叠的写法,都可能造成redos攻击。
正则表达式书写建议:
1.减少不必要的分组
2.降低正则的复杂性
3.匹配尽量精准,减少重叠的写法,减少回溯。如 (a|aa)+

对于不确定是否存在redos攻击的正则,可借助专门的工具检测。
请参考
https://blog.csdn.net/jiangdefu/article/details/123438498

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值