为啥 EmailAddressAttribute.IsValid 和 MailAddress 认为包含“ª”的电子邮件是有效的? [复制]

Posted

技术标签:

【中文标题】为啥 EmailAddressAttribute.IsValid 和 MailAddress 认为包含“ª”的电子邮件是有效的? [复制]【英文标题】:Why does EmailAddressAttribute.IsValid and MailAddress think that emails which contain "ª" are valid? [duplicate]为什么 EmailAddressAttribute.IsValid 和 MailAddress 认为包含“ª”的电子邮件是有效的? [复制] 【发布时间】:2022-01-09 07:31:43 【问题描述】:

我有这个 C# 代码:

void Main()

    // method 1 - using MailAddress
    var email = "fooªbar@cander.com";
    Console.WriteLine(IsValidEmail(email));
    
    // method 2 - using EmailAddressAttribute
    var validator = new System.ComponentModel.DataAnnotations.EmailAddressAttribute();
    Console.WriteLine(validator.IsValid(email));


bool IsValidEmail(string email)

    try
    
        var addr = new System.Net.Mail.MailAddress(email);
        return addr.Address == email;
    
    catch
    
        return false;
    

这验证了 fooªbar@cander.com 电子邮件地址。并且......它验证了它,尽管它有“ª”符号。为什么?根据:What characters are allowed in an email address? 应该是无效的

【问题讨论】:

我不确定,但可能是正则表达式字符串的问题:***.com/questions/201323/… 是的,它使用了更复杂的正则表达式。 github.com/microsoft/referencesource/blob/master/… 具体来说,ª 是"letter, other" 的成员。 我对问题文本进行了彻底的调整,希望我认为您在谈论为什么特别是内置类以它们的方式执行,而不是您的自定义正则表达式。跨度> 有可能是valid email 【参考方案1】:

它会验证它,尽管它有“ª”符号。为什么?

因为您的正则表达式允许在 @ 之前使用“一个或多个 \word 字符”,而 ª 是一个单词字符:

RegexStorm 使用 .net 引擎:您可以看到 \w 模式(单个单词字符)已成功匹配 ª(一个匹配)

根据:电子邮件地址中允许使用哪些字符?它不应该是有效的

唉,你使用的正则表达式没有准确地实现链接问题中给出的规范

在验证电子邮件地址时,我真的认为您不应该尝试将其控制到非常精细的程度 - 形成和维护一个考虑所有变化的复杂正则表达式是一件令人头疼的事情,但它并没有真正带来好处多多,它只会为那些因为您的正则表达式中的错误而无法验证有效电子邮件的用户产生一个痛点。

当我们测试电子邮件的有效性时,我们基本上只检查它是否包含@..如果用户输入错误会发生什么最糟糕的情况?

(如果图片看起来很大,请道歉;在手机上看起来很合理,但我记得 iPhone 屏幕截图有时在网络上看起来有点过大)

【讨论】:

以上是关于为啥 EmailAddressAttribute.IsValid 和 MailAddress 认为包含“ª”的电子邮件是有效的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

EmailAddressAttribute 错误地将法国电子邮件地址分类为无效

允许 EmailAddressAttribute 为空字符串

EmailAddressAttribute 允许在末尾添加点

针对无效字符验证电子邮件地址

你应该同步运行方法吗?为啥或者为啥不?

为啥使用 glTranslatef?为啥不直接更改渲染坐标?