2011-02-23 63 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