在php中的电子邮件地址验证(除filter_var)

问题描述:

嘿这是我的第二个问题,关于电子邮件地址过滤,但我真的偏执,我不喜欢人们仍然可以绕过默认的电子邮件地址验证在PHP中的事实。在php中的电子邮件地址验证(除filter_var)

一个例子:

$i = "[email protected][1.1.1.1]"; 
if (!filter_var($i, FILTER_VALIDATE_EMAIL)) { 
$msg = "Invalid email address"; 
} else { echo "valid email!"; } 

这回声 “有效的电子邮件!”,如果你想知道。

是否有解决方案可以防止它?我希望人们只能使用传统的电子邮件地址([email protected])进行注册。一个复杂的正则表达式?图书馆?我似乎无法找到解决方案。

再次感谢。

这是一个有效的电子邮件地址。所以......我没有看到问题。但是你可以做这样的事情(当然,这种利用所有的功能于一体的过滤器的方法,这样就可以缩短一个位):

function filtervariable($string,$type,$method) { 
    //function for sanitizing variables using PHPs built-in filter methods 
    $validEmail = false; 

    if ($method == 'sanitize') { 
     $filtermethod = 'FILTER_SANITIZE_'; 
    } elseif ($method == 'validate') { 
     $filtermethod = 'FILTER_VALIDATE_'; 
    } else { 
     return; 
    } 
    switch ($type) { 
     case 'email': 
     case 'string': 
     case 'number_int': 
     case 'int': 
     case 'special_chars': 
     case 'url': 
     $filtertype = $filtermethod.strtoupper($type); 
     break; 
    } 

    if ($filtertype == 'FILTER_VALIDATE_EMAIL' && !empty($string)) { 
     list($local,$domain) = explode('@',$string); 

     $localLength = strlen($local); 
     $domainLength = strlen($domain); 

     $checkLocal = explode('.',$domain); 

     if (($localLength > 0 && $localLength < 65) && ($domainLength > 3 && $domainLength < 256) && (checkdnsrr($domain,'MX') || checkdnsrr($domain,'A') || ($checkLocal[1] == 'loc' || $checkLocal[1] == 'dev' || $checkLocal[1] == 'srv'))) { // check for "loc, dev, srv" added to cater for specific problems with local setups 
      $validEmail = true; 
     } else { 
      $validEmail = false; 
     } 
    } 
    if (($filtertype == 'FILTER_VALIDATE_EMAIL' && $validEmail) || $filtertype != 'FILTER_VALIDATE_EMAIL') { 
     return filter_var($string, constant($filtertype)); 
    } else { 
     return false; 
    } 
} 
+0

是的,我知道这是根据标准有效的电子邮件地址,但没有人使用IP地址而不是域名,还有许多其他有效但奇怪的电子邮件通过过滤器的例子。我会看看你包含的功能,谢谢! – Hector

+0

@Hector特别是在['checkdnsrr'](http://php.net/manual/en/function.checkdnsrr.php#117880)看看。 –

+1

“无人”是有点绝对的。为IP提供电子邮件是完全有效的,虽然并不常见 - 但它是一种不太明显的电子邮件的方式 - 在IP上设置电子邮件服务器,只要该IP没有专门注册,跟踪它变得不那么容易,例如(不欺骗任何东西)。 – junkfoodjunkie