ASP.NET的电子邮件地址验证


67

您使用什么来验证ASP.NET表单上的电子邮件地址。我想确保它不包含XSS漏洞。

这是ASP.NET 1.1

Answers:


122

在ASP.NET Web窗体上发布的任何脚本标签都将导致您的网站引发未处理的异常。

您可以使用asp regex验证程序来确认输入,只要确保在绕过JavaScript的情况下,使用if(IsValid)子句将代码包装在方法后面即可。如果绕过您的客户端javascript并将脚本标记发布到asp.net表单,则asp.net将引发未处理的异常。

您可以使用类似:

<asp:RegularExpressionValidator ID="regexEmailValid" runat="server" ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ControlToValidate="tbEmail" ErrorMessage="Invalid Email Format"></asp:RegularExpressionValidator>

1
他说它是ASP.NET 1.1,该版本是否支持验证控件?
Shimmy Weitzhandler,2009年

在ASP.NET 1.1中可以使用RegularExpressionValidators msdn.microsoft.com/zh-cn/library/eahwtc9e%28v=VS.71%29.aspx
Diskdrive

2
我使用此表达式,但奇怪的是它似乎允许空电子邮件......?我还必须添加一个必需的字段验证器。
UmaN 2012年

3
请记住,这不包括某些有效的电子邮件地址。
山姆

19

这是我刚根据Simon Johnson的想法创建的一个基本电子邮件验证程序。如果需要,它仅需要添加DNS查找的额外功能。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using System.Text.RegularExpressions;
using System.Web.UI;

namespace CompanyName.Library.Web.Controls
{
    [ToolboxData("<{0}:EmailValidator runat=server></{0}:EmailValidator>")]
    public class EmailValidator : BaseValidator
    {

        protected override bool EvaluateIsValid()
        {
            string val = this.GetControlValidationValue(this.ControlToValidate);
            string pattern = @"^[a-z][a-z|0-9|]*([_][a-z|0-9]+)*([.][a-z|0-9]+([_][a-z|0-9]+)*)?@[a-z][a-z|0-9|]*\.([a-z][a-z|0-9]*(\.[a-z][a-z|0-9]*)?)$";
            Match match = Regex.Match(val.Trim(), pattern, RegexOptions.IgnoreCase);

            if (match.Success)
                return true;
            else
                return false;
        }

    }
}

更新:请不要使用原始正则表达式。寻找更新的更完整的样本。


5
请记住,这不包括某些有效的电子邮件地址。
山姆

2
|在字符类[a-z|0-9|]似乎是错误的。您是否知道这将与|角色匹配并且无法替代?除此之外,我的电子邮件地址(使用1a@a.com或a@1.com进行测试)失败了,所以显然是错误的。
ygoe 16/09/17

7

您可以使用RegularExpression验证器。ValidationExpression属性具有一个按钮,您可以在Visual Studio的属性面板中按此按钮,该按钮将列出许多有用的表达式。他们用于电子邮件地址的是:

\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

2
请记住,这不包括某些有效的电子邮件地址。
山姆

该按钮在哪里?至少在Visual Studio 2017中找不到它。
保护者

6

您还应该始终执行服务器端验证。

public bool IsValidEmailAddress(string email)
{
    try
    {
        var emailChecked = new System.Net.Mail.MailAddress(email);
        return true;
    }
    catch
    {
        return false;
    }
}

更新

您也可以使用EmailAddressAttributein System.ComponentModel.DataAnnotations。然后,无需尝试即可获得更干净的解决方案。

public bool IsValidEmailAddress(string email)
{
    if (!string.IsNullOrEmpty(email) && new EmailAddressAttribute().IsValid(email))
        return true;
    else
        return false;
}

请注意,IsNullOrEmpty还需要进行检查,否则null值将返回true。


5

验证它是否是真实的电子邮件地址要困难得多。

用于确认语法正确的正则表达式可能会很长(例如,请参见http://www.regular-expressions.info/email.html)。确认电子邮件地址的最佳方法是给用户发送电子邮件,然后通过单击链接以确认用户已收到电子邮件来使用户回复(大多数注册系统的工作方式)。


5

在我们的代码中,我们有一个继承自BaseValidator类的特定验证器。

此类执行以下操作:

  1. 根据正则表达式验证电子邮件地址。
  2. 在域的MX记录上进行查找,以确保至少有一个服务器要传递给该服务器。

这是最接近验证而无需实际向用户发送电子邮件确认链接的方法。


4
您如何看待这在实践中起作用。您是否发现进行DNS查找很慢?
马丁·布朗

4

防止XSS是验证输入的另一个问题。

关于XSS:您不应尝试检查XSS或相关漏洞的输入。在将字符串插入某些字符具有“魔力”的其他语言时(例如,在HTML或SQL中插入字符串时),请正确转义,以防止XSS攻击,SQL注入等。例如,像O'Reilly这样的名称是完全有效的输入,但是如果不转义插入SQL可能会导致崩溃甚至更糟。您无法通过验证输入来防止此类问题。

验证用户输入对于防止数据丢失或格式错误很有用。用户在邮政编码字段中写“ asdf”,依此类推。Wrt。在电子邮件地址中,语法是如此复杂,以至于使用正则表达式对其进行验证并没有太大的好处。只需检查它是否包含“ @”。


1

快速简单的代码

public static bool IsValidEmail(this string email)
{
    const string pattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|" + @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)" + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";    
    var regex = new Regex(pattern, RegexOptions.IgnoreCase);    
    return regex.IsMatch(email);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.