2011-02-23 65 views
5

我试着PHP的内置功能:filter_input()PHP的内置filter_input工作正常吗?

var_dump(filter_var('[email protected]', FILTER_VALIDATE_EMAIL)); 

输出:

字符串(19) “john.doe @ gmail.com”

然后我尝试了最新版本的Zend Framework(1.11.3):

$validator = new Zend_Validate_EmailAddress(); 
if ($validator->isValid('[email protected]')) { 
    echo 'OK'; 
} else { 
    foreach ($validator->getMessages() as $message) { 
      echo "$message\n"; 
    } 
} 

输出:

'john.doe。'不能与点原子格式
'john.doe'匹配。无法与引用字符串格式匹配
'john.doe。'是没有有效的本地部分的电子邮件地址'john.doe。@ gmail.com'

内置函数应该返回FALSE或Zend方法'确定'。

我的中心问题是:
哪一个是对的?

+0

如果你想要最好的PHP电子邮件验证器去这里:http://www.dominicsayers.com/isemail/ – rojoca 2011-02-24 00:56:31

回答

2

http://framework.zend.com/manual/en/zend.validate.set.html并没有真正指出它们是否是RFC严格的,所以我们来看看源代码。

在源,_validateLocalPart()定义他们对匹配的EBNF:

// Dot-atom characters are: 1*atext *("." 1*atext) 
    // atext: ALPHA/DIGIT/and "!", "#", "$", "%", "&", "'", "*", 
    //  "+", "-", "/", "=", "?", "^", "_", "`", "{", "|", "}", "~" 
    if (preg_match('/^[' . $atext . ']+(\x2e+[' . $atext . ']+)*$/', $this->_localPart)) { 

看起来他们绝对不留严格到 - 所以当地部分不能开始或以点结束。

上面的图案是完全一样的,在RFC2822规范:http://www.ietf.org/rfc/rfc2822.txt - 和Zend公司/验证/ EmailAddress.php引用它的isValid的docblock如使用2822

所以,如果你想成为符合RFC2822 ,Zend_Validate_EmailAddress做得很对,很可能,filter_input是不符合规范的。

1

这可能只是Zend_Engine严格匹配RFC(对于电子邮件而言是3英里长)的情况。我怀疑,严格地说,句点是允许的字符,但是@位置之前的一段时间是不允许的,所以这可能是问题所在。

我打算假设gmail仍然允许发送john.doe。@ gmail.com。如果是这样的话,问题变得更多的是你是否真的想要严格匹配RFC,或者只是允许在允许的电子邮件地址中使用它,而不会损害你的系统。

如果你担心sql注入,绑定你的变量在sql &转义你的html,因为不能保证rfc严格匹配实际上可以防止这样的问题。

如果您担心电子邮件是可发送/可接收的,我建议您只需发送预期的收据,或者使用确认链接设置可选的电子邮件确认系统。

如果你担心电子邮件头注入,这是发送邮件时使用电子邮件库的一个很好的理由,我希望zend有一个强大的。

TooLongDidn'tRead;我的建议是:

  • 是宽容。 (所以使用哪一个选项更宽容,在这种情况下filter_input)
  • 测试电子邮件是否通过发送电子邮件工作,这几乎是唯一真正的考验。
  • HTML转义& SQL-绑定的一切,当它的时间在HTML或SQL使用它,也不要相信任何将来自危险的世界之外,只要你使用它。
  • 不要使用可利用的PHP邮件(),使用防止邮件头注入的库。
+1

虽然你没有给出一个确切的答案的问题,你肯定让我在正确的道路和你涵盖了所有可能有问题的领域。你说服了我,我的问题不够确切。它应该是:“**哪一个是正确的_a特定问题_?**”谢谢!我会投票,如果我可以:) – user523736 2011-02-23 17:01:04

0

这也取决于你的PHP版本。 PHP 5.2.14及更高版本(以及5.3)具有更新的正则表达式(请参阅the commit to the PHP source code)。 PHP 5.2.13RC2及以下版本具有旧的正则表达式。另见Bug #49576

+0

是的,对不起,因为想在我的开场白中失踪。 PHP版本5.3.1 – user523736 2011-02-24 07:22:42

+0

我的错误。看来更新的正则表达式在5.3.3RC1之前没有达到5.3分支。 – cmbuckley 2011-03-08 10:16:45