【问题标题】:How to set match timeout of regex in route attribute of asp.net core如何在asp.net核心的路由属性中设置正则表达式的匹配超时
【发布时间】:2021-05-20 06:04:09
【问题描述】:

MSDN 建议在所有正则表达式模式匹配操作中设置一个超时值。
我们如何在asp.net核心项目的路由属性中设置匹配超时

[Route("[controller]/[action]/{test:regex(^(\\w+$)}")]
public string Get(string test)
{
    //...
}

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core .net-core ddos


    【解决方案1】:

    您可以参考下面的示例create a custom route constraint,然后设置超时。

    Public class MyCustomConstraint : IRouteConstraint
    {
        private Regex _regex;
    
        public MyCustomConstraint()
        {
            _regex = new Regex(@"^[1-9]*$",
                                RegexOptions.CultureInvariant | RegexOptions.IgnoreCase,
                                TimeSpan.FromMilliseconds(100));
        }
        public bool Match(HttpContext httpContext, IRouter route, string routeKey,
                          RouteValueDictionary values, RouteDirection routeDirection)
        {
            if (values.TryGetValue(routeKey, out object value))
            {
                var parameterValueString = Convert.ToString(value,
                                                            CultureInfo.InvariantCulture);
                if (parameterValueString == null)
                {
                    return false;
                }
    
                return _regex.IsMatch(parameterValueString);
            }
    
            return false;
        }
    }
    

    然后,在 Startup.ConfigureServices 方法中注册上述约束:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
    
        services.AddRouting(options =>
        {
            options.ConstraintMap.Add("customName", typeof(MyCustomConstraint));
        });
    }
    

    然后,在 action 方法中应用约束,如下所示:

    // GET /api/test/my/3
    [HttpGet("my/{id:customName}")]
    public IActionResult Get(int id)
    {
        return ControllerContext.MyDisplayRouteInfo(id);
    }
    

    调试截图如下:

    此外,您还可以通过调用 Program.cs 文件中的 AppDomain.SetData method 代码来设置应用程序域中所有正则表达式匹配操作的超时值:

        public static void Main(string[] args)
        {
            AppDomain domain = AppDomain.CurrentDomain;
            // Set a timeout interval of 200 milliseconds.
            domain.SetData("REGEX_DEFAULT_MATCH_TIMEOUT", TimeSpan.FromMilliseconds(200));
    
            CreateHostBuilder(args).Build().Run();
        }
    

    那么,就不需要在自定义路由约束中设置超时了,看看这个截图:

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多