.Net4.5新特性:正则表达式超时介绍

“Regex” 在数据验证方面最受欢迎。考虑到您可能对“Regex”彻底陌生的。请参考我介绍Regex如何运做的视频。 But because of the typical parsing logic of regex it is exposed to DOS attacks. Let us try to understand in detail what I mean by that. 可是因为正则表达式典型的逻辑解析是暴露在DOS攻击之下的。让咱们尝试了解一下细节来明白我为何这么说。
例如,咱们来看一下这个规则表达式-“^(\d+)$”。这个正则表达式的规则是只有数字符合条件。你也能够看一看下面描述正则表达式如何评估输入信息的符号图。如今,假设咱们想要验证“123456x”。正以下图所示,正则表达式将走六条路径。正则表达式

可是若是咱们再扩展一位输入参数,它将有七条路径。也就是说,随着输入参数长度的增长,正则表达式的验证须要更多地时间来验证。即:验证所需时间和输入参数的长度为线型关系。c#

如今让咱们把前面的表达式“^(\d+)$”复杂化为“^(\d+)+$”。若是你意识到了这个正则表达式写的很是复杂。并且咱们想验证“123456x”。它将执行32条路径。 若是你再添加一个字符,它遍历的路径将变成64条。spa

也就是说,对上述正则表达式而言,验证输入参数的长度与消耗时间是指数关系。3d

如今,你可能会问:这些有关系吗?可是我要说的是:当正则表达式执行线性相关的验证时,这个特色可能被黑客利用,以实现DOS攻击。他们能够输入很是长的字符串,使你的应用永远处于挂起状态(始终处于正则验证状态)。
一个比较合适的解决方法是:设置正则操做的超时限制。好消息是,在.NET4.5中,你能够像下面所示代码那样,为正则验证添加一个超时属性。因此,若是你收到任何类型的恶意注入时,你的应用不会陷入死循环。code

1
2
3
4
5
6
7
8
9
try
{
   var regEx = new Regex(@”^(\d+)+$”, RegexOptions.Singleline, TimeSpan.FromSeconds(2));
   var match = regEx.Match(“123453109839109283090492309480329489812093809x”);
}
catch (RegexMatchTimeoutException ex)
{
   Console.WriteLine(“Regex Timeout”);
}

来自:视频

http://www.itstrike.cn/Question/10777f22-b683-45ee-a957-c38368823a01blog

相关文章
相关标签/搜索