PHP';s内置过滤器\输入是否正常工作?

PHP';s内置过滤器\输入是否正常工作?,php,zend-framework,filtering,Php,Zend Framework,Filtering,我尝试了PHP的内置函数:filter\u input() 输出: 字符串(19)“john.doe.@gmail.com” 然后我尝试了Zend Framework的最新版本(1.11.3): 输出: “john.doe.”无法与点原子格式匹配 “john.doe.”不能与带引号的字符串格式匹配 “john.doe.”不是电子邮件地址“john.doe.@gmail.com”的有效本地部分 内置函数应返回FALSE或Zend方法“OK” 我的哈姆莱问题是: 哪一个是正确的?可能只是Zend_引

我尝试了PHP的内置函数:filter\u input()

输出:

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

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

输出:

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

内置函数应返回FALSE或Zend方法“OK”

我的哈姆莱问题是:

哪一个是正确的?

可能只是Zend_引擎严格匹配RFC的情况(对于电子邮件,RFC的长度为3英里)。严格地说,我怀疑句点是允许的字符,但不允许在@position前面加句点,所以这可能就是问题所在

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

如果您担心sql注入,请在sql中绑定您的变量并转义您的html,因为不能保证严格匹配rfc实际上可以防止此类问题

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

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

toolong没有脚步声我的建议是:

  • 要宽容。(因此,请使用更允许的选项,在本例中为filter_输入)
  • 通过发送电子邮件来测试电子邮件是否有效,这几乎是唯一正确的测试
  • html escape&sql在html或sql中使用时绑定所有内容,并且不要相信任何来自危险世界之外的东西,无论何时使用它
  • 不要使用可利用的php mail(),请使用可防止邮件头插入的库
    • 并不能真正表明他们是否严格要求RFC,所以让我们看看来源

      在源代码中,_validateLocalPart()定义了它们所匹配的EBNF:

          // Dot-atom characters are: 1*atext *("." 1*atext)
          // atext: ALPHA / DIGIT / and "!", "#", "$", "%", "&", "'", "*",
          //        "+", "-", "/", "=", "?", "^", "_", "`", "{", "|", "}", "~"
          if (preg_match('/^[' . $atext . ']+(\x2e+[' . $atext . ']+)*$/', $this->_localPart)) {
      
      看起来他们确实严格遵守了这一点,所以局部部分不能以点开始或结束

      上面的模式与rfc2822规范中的模式完全相同:-并且Zend/Validate/EmailAddress.php中的isValid docblock使用2822引用它


      因此,如果您想与rfc2822兼容,Zend_Validate_EmailAddress做得很好,而且过滤器输入可能不符合规范。

      这还取决于您拥有的PHP版本。PHP5.2.14及以上版本(以及5.3)有一个更新的正则表达式(请参阅)。PHP 5.2.13RC2及以下版本具有旧的正则表达式。另请参见。

      虽然您没有给出问题的确切答案,但您确实让我走上了正确的道路,您涵盖了所有可能存在问题的领域。你说服了我,我的问题不够精确。应该是:“哪一个适合某个特定问题?”谢谢!如果我可以,我会投票:)如果你想要最好的php电子邮件验证器,请点击这里:是的,很抱歉在我的开场白中遗漏了这一点。PHP版本5.3.1我错了。更新后的正则表达式似乎直到5.3.3RC1才到达5.3分支。
      $validator = new Zend_Validate_EmailAddress();  
      if ($validator->isValid('john.doe.@gmail.com')) {
          echo 'OK';
      } else {
          foreach ($validator->getMessages() as $message) {
                  echo "$message\n";
          }
      }
      
          // Dot-atom characters are: 1*atext *("." 1*atext)
          // atext: ALPHA / DIGIT / and "!", "#", "$", "%", "&", "'", "*",
          //        "+", "-", "/", "=", "?", "^", "_", "`", "{", "|", "}", "~"
          if (preg_match('/^[' . $atext . ']+(\x2e+[' . $atext . ']+)*$/', $this->_localPart)) {