【问题标题】:Regex timelimit in a model模型中的正则表达式时间限制
【发布时间】:2015-05-03 22:58:38
【问题描述】:

我有一个带有正则表达式的注册模型,但在 C# 中我们有 Regex.ValidateMatchTimeout 来防止 DDoS 攻击。 问题是,如何在模型中实现带时间限制的正则表达式?

我的模型中的普通正则表达式:

[DataType(DataType.EmailAddress)]
[Required]
[Display(Name = "Email")]
[StringLength(80, ErrorMessage = "Email too large.")]
[RegularExpression(@"^([a-zA-Z0-9_.-]+)@(outlook|hotmail|yahoo)\.\w{2,}$", ErrorMessage = "Invalid email.")]
public string Email { get; set; }

【问题讨论】:

  • 您的示例正则表达式不容易出现catastrophic backtracking,并且是锚定的,这意味着它快速。您对此有任何实际用例吗?
  • @LucasTrzesniewski 嗯?你是说我的正则表达式做得很好,不是吗?
  • 是的,没错,这意味着这个特定的模式永远不会超时。 :)

标签: regex asp.net-mvc


【解决方案1】:

RegularExpression attribute 不允许您以任何方式指定超时。另一方面,您可以设置全局默认超时。如果什么都不配置,超时时间是无限的。

AppDomain.CurrentDomain.SetData("REGEX_DEFAULT_MATCH_TIMEOUT", TimeSpan.FromSeconds(1));

更多信息:

另一种方法是根据reference source 创建您自己的属性。

【讨论】:

  • 我必须将 AppDomain.Curre... 放在什么文件中?
  • 在您的 Startup.cs 文件中,或在第一次正则表达式匹配之前运行的某个位置。
  • 然后我可以在方法中重新定义 MATCH_TIMEOUT,不是吗?示例:我在启动时放了 5 秒,但我在自己的方法中放了 20 秒。这将影响所有程序(所有客户端)还是仅影响一个客户端??
  • 你可以通过在某些页面上输出new Regex("").MatchTimeout来测试它。
  • 是的。 REGEX_DEFAULT_MATCH_TIMEOUT 对您的应用程序来说是全局的。
【解决方案2】:

接受的答案是错误的(或者可能是过时的),因为您可以使用 MatchTimeoutInMilliseconds 属性,存在于 RegularExpressionAttribute 中

[RegularExpression(@"^([a-zA-Z0-9_.-]+)@(outlook|hotmail|yahoo)\.\w{2,}$", MatchTimeoutInMilliseconds = 1000, ErrorMessage = "Invalid email.")]

https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.regularexpressionattribute.matchtimeoutinmilliseconds

顺便说一句,即使您认为您的正则表达式超级聪明、令人敬畏且速度极快,您仍然可能会祈祷恶意制作的输入会影响您的正则表达式。在规模上,这最终会导致您的系统崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多