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

Bri*_*n G 65 asp.net email validation

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

这是ASP.NET 1.1

Web*_*ude 119

在ASP.NET Web表单上发布的任何脚本标记都将导致您的站点抛出和未处理的异常.

您可以使用asp regex验证器来确认输入,只需确保使用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>
Run Code Online (Sandbox Code Playgroud)

  • 请记住,这不包括一些有效的电子邮件地址. (3认同)
  • 我使用这个表达式,但奇怪的是它似乎允许空的电子邮件......?我还必须添加一个必需的字段验证器. (2认同)
  • 这接受""空白.我们如何设置它需要字段. (2认同)

Joh*_*hn_ 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;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 请记住,这不包括一些有效的电子邮件地址. (5认同)
  • 字符类`[az | 0-9 |]`中的`|`似乎错了.你知道这会匹配`|`字符而不能作为替代吗?除此之外我的电子邮件地址失败了(用1a@a.com或a@1.com测试),所以这显然是错误的. (2认同)

Mar*_*own 7

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

\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
Run Code Online (Sandbox Code Playgroud)

  • 请记住,这不包括一些有效的电子邮件地址. (2认同)

VDW*_*WWD 6

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

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

更新

您还可以使用EmailAddressAttributein System.ComponentModel.DataAnnotations. 那么就不需要 try-catch 了,这是一个更干净的解决方案。

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

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


RB.*_*RB. 5

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

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


Sim*_*son 5

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

该类执行以下操作:

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

这是您最接近验证而不实际向该人发送电子邮件确认链接.

  • 你如何在实践中发现这一点.你不觉得做DNS查找是一个触摸慢吗? (4认同)