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

ASP.NET的电子邮件地址验证,asp.net,validation,email,Asp.net,Validation,Email,您使用什么来验证ASP.NET表单上的电子邮件地址。我想确保它不包含XSS漏洞 这是ASP.NET 1.1防止XSS与验证输入是不同的问题 关于XSS:您不应该尝试检查XSS或相关漏洞的输入。在将字符串插入到另一种语言(某些字符是“魔法”的)时,例如在HTML或SQL中插入字符串时,应正确转义,以防止XSS攻击、SQL注入等。例如,像O'Reilly这样的名称是完全有效的输入,但如果将其插入SQL,则可能会导致崩溃或更糟的情况。您无法通过验证输入来防止此类问题 验证用户输入有助于防止数据丢失或格

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


这是ASP.NET 1.1

防止XSS与验证输入是不同的问题

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


验证用户输入有助于防止数据丢失或格式错误,例如用户在邮政编码字段中写入“asdf”等。Wrt。电子邮件地址,语法非常复杂,使用正则表达式验证它没有多大好处。只需检查它是否包含“@”。

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

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

ASP.NET web表单上发布的任何脚本标记都将导致您的网站引发未经处理的异常

您可以使用asp正则表达式验证器来确认输入,只要确保使用if(IsValid)子句包装代码隐藏方法,以防绕过javascript。 如果绕过客户端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>

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


确认语法正确的正则表达式可能很长(参见示例)。确认电子邮件地址的最佳方法是向用户发送电子邮件,并通过单击链接验证用户是否收到电子邮件(大多数注册系统的工作方式)。

在我们的代码中,我们从BaseValidator类继承了一个特定的验证器

该类执行以下操作:

  • 根据正则表达式验证电子邮件地址
  • 对域的MX记录进行查找,以确保至少有一台服务器要交付

  • 这是最接近验证的方法,无需向此人发送电子邮件确认链接。

    这是我根据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;
            }
    
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用System.Linq;
    使用系统文本;
    使用System.Web.UI.WebControl;
    使用System.Text.RegularExpressions;
    使用System.Web.UI;
    命名空间CompanyName.Library.Web.Controls
    {
    [ToolboxData(“”)
    公共类EmailValidator:BaseValidator
    {
    受保护的重写bool EvaluateIsValid()
    {
    字符串val=this.GetControlValidationValue(this.ControlToValidate);
    字符串模式=“^[a-z][a-z|0-9|]*([a-z][a-z|0-9]+)*([.][a-z|0-9]+([a-z][a-z|0-9]*)?[a-z][a-z|0-9]*。([a-z][a-z|a-0-9]*(\.[a-z][a-z][a-z]0-9]*)”;
    Match Match=Regex.Match(val.Trim(),pattern,RegexOptions.IgnoreCase);
    如果(匹配成功)
    返回true;
    其他的
    返回false;
    }
    }
    }
    

    更新:请不要使用原始正则表达式。寻找一个更新的更完整的示例。

    您也应该始终进行服务器端验证

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

    您还可以在
    System.ComponentModel.DataAnnotations
    中使用
    EmailAddressAttribute
    。那么就不需要尝试捕捉,因为它是一种更清洁的解决方案

    public bool IsValidEmailAddress(string email)
    {
        if (!string.IsNullOrEmpty(email) && new EmailAddressAttribute().IsValid(email))
            return true;
        else
            return false;
    }
    
    请注意,还需要检查
    IsNullOrEmpty
    复选框,否则
    null
    值将返回true。

    快速简单的代码

    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);
    }
    
    public static bool IsValidEmail(此字符串电子邮件)
    {
    常量字符串模式=@“^(?!\)(([^”“\r\\]\\\\\\[”“\r\\])*“\\”+@”([-a-z0-9!$%&'*+/=?^ `{124;}~)(?
    使用系统;
    使用System.Collections.Generic;
    使用System.Linq;
    使用System.Web;
    利用制度全球化;
    使用System.Text.RegularExpressions;
    /// 
    ///RegexUtilities的摘要说明
    /// 
    公营部门
    {
    bool无效=错误;
    公共bool IsValidEmail(string strIn)
    {
    无效=错误;
    if(String.IsNullOrEmpty(strIn))
    返回false;
    //使用IdnMapping类转换Unicode域名。
    strIn=Regex.Replace(strIn,@“(@)(.+)$”,this.DomainMapper);
    如果(无效)
    返回false;
    //如果strIn为有效的电子邮件格式,则返回true。
    
    返回Regex.IsMatch(strIn,“^(?”(“[^”]+?”@)([0-9a-z]((\.(?!\))[124;[-!\$%和“\*\+/=\?\^\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\(?你觉得这在实践中是如何工作的。你不觉得DNS查找有点慢吗?他说是ASP.NET 1.1,该版本支持验证控件吗?ASP.NET 1.1中提供RegularExpressionValidator。我使用这个表达式,但奇怪的是它似乎允许空电子邮件……?我还必须添加一个必需的字段验证程序。P请记住,这会排除一些有效的电子邮件地址。请记住,这会排除一些有效的电子邮件地址。字符类
    [a-z | 0-9 |]中的
    似乎是错误的。您是否知道这将与
    |
    字符匹配,并且不能作为替代字符使用?此外,我的电子邮件地址已失败(使用测试)1a@a.com或a@1.com),所以这显然是错误的。请记住,这排除了一些有效的电子邮件地址。此按钮在哪里?至少在Visual Studio 2017中找不到它。
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Globalization;
    using System.Text.RegularExpressions;
    
    /// <summary>
    /// Summary description for RegexUtilities
    /// </summary>
    public class RegexUtilities
    {
        bool InValid = false;
    
        public bool IsValidEmail(string strIn)
        {
            InValid = false;
            if (String.IsNullOrEmpty(strIn))
                return false;
    
            // Use IdnMapping class to convert Unicode domain names.
            strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper);
            if (InValid)
                return false;
    
            // Return true if strIn is in valid e-mail format. 
            return Regex.IsMatch(strIn, @"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" + @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,17}))$",
                   RegexOptions.IgnoreCase);
        }
    
        private string DomainMapper(Match match)
        {
            // IdnMapping class with default property values.
            IdnMapping idn = new IdnMapping();
    
            string domainName = match.Groups[2].Value;
            try
            {
                domainName = idn.GetAscii(domainName);
            }
            catch (ArgumentException)
            {
                InValid = true;
            }
            return match.Groups[1].Value + domainName;
        }
    
    }
    
    
    
    
    
    RegexUtilities EmailRegex = new RegexUtilities();
    
           if (txtEmail.Value != "")
                    {
                        string[] SplitClients_Email = txtEmail.Value.Split(',');
                        string Send_Email, Hold_Email;
                        Send_Email = Hold_Email = "";
        
                        int CountEmail;/**Region For Count Total Email**/
                        CountEmail = 0;/**First Time Email Counts Zero**/
                        bool EmaiValid = false;
                        Hold_Email = SplitClients_Email[0].ToString().Trim().TrimEnd().TrimStart().ToString();
                        if (SplitClients_Email[0].ToString() != "")
                        {
                            if (EmailRegex.IsValidEmail(Hold_Email))
                            {
                                Send_Email = Hold_Email;
                                CountEmail = 1;
                                EmaiValid = true;
                            }
                            else
                            {
                                EmaiValid = false;
                            }
                        }
        
                        if (EmaiValid == false)
                        {
                            divStatusMsg.Style.Add("display", "");
                            divStatusMsg.Attributes.Add("class", "alert alert-danger alert-dismissable");
                            divStatusMsg.InnerText = "ERROR !!...Please Enter A Valid Email ID.";
                            txtEmail.Focus();
                            txtEmail.Value = null;
                            ScriptManager.RegisterStartupScript(Page, this.GetType(), "SmoothScroll", "SmoothScroll();", true);
                            divStatusMsg.Visible = true;
                            ClientScript.RegisterStartupScript(this.GetType(), "alert", "HideLabel();", true);
                            return false;
                        }
                    }