zoukankan      html  css  js  c++  java
  • .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”。正如下图所示,正则表达式将走六条路径。

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

    现在让我们把前面的表达式“^(d+)$”复杂化为“^(d+)+$”。如果你意识到了这个正则表达式写的非常复杂。而且我们想验证“123456x”。它将执行32条路径。 如果你再添加一个字符,它遍历的路径将变成64条。

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

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

    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-c38368823a01

  • 相关阅读:
    ObjecT4:On-line multiple instance learning (MIL)学习
    目标跟踪ObjectT综述介绍
    CV与IP:基础,经典以及最近发展
    PythonGIS可视化—Matplot basemap工具箱
    SciPy和Numpy处理能力
    mwArray与C++接口
    使用QT的一些小Tipster
    C++调用Matlab 注意事项
    Qwt--散点图/函数图
    **PCL:嵌入VTK/QT显示(Code^_^)
  • 原文地址:https://www.cnblogs.com/sky7034/p/3421716.html
Copyright © 2011-2022 走看看