我应该使用filter_var来验证电子邮件吗?

Mar*_*leu 21 php validation

我有一个类在每次输入发送到数据库层之前验证它.请注意,我的问题不是逃避或任何事情.我的数据库层将处理SQL注入问题.我想要做的就是验证电子邮件是否有效,因为稍后该电子邮件可能被用作"发送到".例如,用户将通过发送到电子邮件的链接恢复对其帐户的访问.我读了很多filter_var,有很多人反对它,其他人也赞成.专注于'我只是想验证电子邮件而不是为数据库或html或XSS或其他任何'过滤它,是否存在使用问题filter_var

com*_*857 24

是的你应该.

使用标准库验证而不是家庭酿造有一个好处:

  1. 许多眼球已经看到了你将要使用的代码(好吧,至少有两个),希望在将它合并到一个版本之前就具有电子邮件验证方面的经验.
  2. 它是经过单元测试的.
  3. 其他人将使用相同的检查和报告错误,你可以免费获得这些修补程序的PHP更新.

但是,检查电子邮件地址的格式只是第一道防线,如果您真的想知道它是否真实,则必须向其发送消息.

  • 不幸的是,只有当某人真正维护并进一步改进这样的验证库时,才会这样.在这种情况下使用`filter_var`有一些危险:它在本地部分不支持UTF8,即使它已经有效一段时间了,你实际上必须自己用`idn_to_ascii`转换域名来验证国际域名,这不是很明显.如果使用`filter_var`,准备好许多失败的电子邮件地址,这些地址实际上是有效的,而且当unicode在电子邮件地址中被广泛使用时,这只会变得更糟. (5认同)

abs*_*frm 8

是的,你应该使用filter_var,这就是你如何融入它:

if( filter_var( $email ,FILTER_VALIDATE_EMAIL ) )
{
    /*
     * Rest of your code
     */
}
Run Code Online (Sandbox Code Playgroud)


ric*_*ane 7

是.但checkdnsrr()这里也值得一提.

filter_var()将批准似乎不完整的域,因为它可能在本地上下文中有效(例如某人@ localhost).这可能会导致人们错过TLD或域名中的点的误报(例如hattie.jacques@gmailcom)

通过checkdnsrr()在域上进行查找来捕获这些- 如果您可以找到域的MX记录并且地址有效,那么您已经完成了最多的工作.

示例代码:

if(filter_var($email, FILTER_VALIDATE_EMAIL)) 
{
    list($userName, $mailDomain) = explode("@", $email);
    if (!checkdnsrr($mailDomain, "MX"))
    {
        // Email is unreachable.
    }
}
else
{
    // Email is bad.
}
Run Code Online (Sandbox Code Playgroud)

checkdnsrr() 很简单(根据我的经验),我还没有找到一个不起作用的环境.