2010-08-04 58 views
9

我剛剛設置了表單的驗證,我決定嘗試使用filter_var函數來檢查我的電子郵件地址的有效性。我無法找到filter_var實際上允許的任何地方(因爲文檔非常簡單),並且我發現它允許像test @ test這樣的電子郵件地址。在域中不必有.com,.net等...嗎?

+8

從技術上講,'test'可能是本地網絡中的有效主機名,所以我認爲它是正確的。 – 2010-08-04 14:26:21

+1

您可以發佈您的代碼嗎? var_dump(filter_var('test @ test。',FILTER_VALIDATE_EMAIL)); 對我而言返回false! – Youssef 2010-08-04 14:31:52

+1

test @ test沒有點也返回false – Youssef 2010-08-04 14:33:19

回答

18

行爲在四月份左右發生了變化。見bug #49576revision 297350

這封電子郵件確實無效,至少這是PHP開發人員所理解的。該人士攜帶本通知:

/* 
* The regex below is based on a regex by Michael Rushton. 
* However, it is not identical. I changed it to only consider routeable 
* addresses as valid. Michael's regex considers [email protected] a valid address 
* which conflicts with section 2.3.5 of RFC 5321 which states that: 
* 
* Only resolvable, fully-qualified domain names (FQDNs) are permitted 
* when domain names are used in SMTP. In other words, names that can 
* be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed 
* in Section 5) are permitted, as are CNAME RRs whose targets can be 
* resolved, in turn, to MX or address RRs. Local nicknames or 
* unqualified names MUST NOT be used. 

changelog提到的PHP 5.3.3和PHP 5.2.14這個Bug修正。

+1

這個bug的票據被標記爲固定的PHP5.3.3和PHP5.2.14 – Gordon 2010-08-04 14:48:24

+0

很棒的Artefacto。所以我認爲規則已經改變了?這爲什麼改變了?我希望他們能解釋他們在filter_var文檔中檢查的內容。那麼這會在5.3.3之前返回true,在5.3.3之後會返回false?我使用的系統是5.2.12 – Metropolis 2010-08-04 14:49:31

+0

@Metro它檢查電子郵件是否符合Internet標準。 「測試@測試」之前被允許的事實是一個錯誤。 – Artefacto 2010-08-04 14:52:56

5

這是一個有效的電子郵件地址。它不會在互聯網上工作(至少不是在今天),但是對於本地地址來說,這沒問題。

我會假設開發人員正在採取明智的方法來檢查電子郵件地址,而不是建立自己的系統,只要引入新的TLD就會保證系統過時。我們有足夠的電子郵件地址語法檢查程序,拒絕[email protected]原樣。

+1

您是否認爲RFC 5321的第2.3.5節不適用? – Artefacto 2010-08-04 14:43:59

1

不,test可以是本地/內部網絡域,這樣就可以工作。我喜歡它在開發時正確驗證[email protected]

正常的nonexistentdomain.foo會有同樣的問題。如果您想測試是否有東西可以交給主機,請使用getmxrr(並且它失敗時會回退到gethostbyname())。

+0

那麼最好是允許本地地址?或者,如果我不想允許像test @ test這樣的東西,我應該使用getmxrr嗎? – Metropolis 2010-08-04 14:41:11

+0

不是使用checkdnsrr檢查會更好嗎?因爲如果他們的服務器關閉了,或者其他的東西,那麼getmxrr將返回false。對? – Metropolis 2010-08-04 14:44:25

+1

如果您希望/希望處理這些地址,您將允許本地地址(主要在已知的IP範圍內)。你確實可以使用checkdnsrr('hostname','ANY'),對我來說不會發生(儘管檢查MX或A記錄(如果沒有定義MX,應該是後備)將更加可靠:註冊的域可能沒有A&MX記錄,導致它們無法投遞)。 checkdnsrr/gethostbyname/getmxrr都使用相同的機制afaik,所以如果DNS服務器關閉或速度慢,它將失敗/對所有選項都很慢。 – Wrikken 2010-08-04 15:03:38

3

test @ test在語法上是有效的。

從RFC 5321:

在電子郵件地址是單獨使用一個頂級域的情況下,一個單一的字符串用於沒有任何點。

只有在此之後它說:

只有解析,完全限定域名(FQDN)被允許 當域名在SMTP使用。換句話說,可以解析爲MX RR或地址(即A或AAAA)RR的名稱(如第5節中討論的 ),因爲CNAME RR的目標可以是 ,然後依次解析爲MX或地址RR。不得使用本地暱稱或 不合格名稱。

這並不一定排除只有TLD的域名。事實上,運行下面的代碼:

checkdnsrr('ua', 'MX') // Returns true

getmxrr('ua', $array) // Returns true

只TLD-域名(罐)有MX記錄和使用:http://www.to/就是一個例子。下面是一些有效的唯一TLD的域名的電子郵件地址:

文斯@人工智能

保羅@ IO

根@公里

Joost的@ TK

管理員@ TT

hostmaster @ ua

示例電子郵件地址的來源s:Tony Finch – TLDs with MXs

相關問題