簡體   English   中英

為什么filter_var($ email,FILTER_VALIDATE_EMAIL)允許test @ test?

[英]Why does filter_var($email, FILTER_VALIDATE_EMAIL) allow test@test?

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

這種行為在四月左右發生了變化。 請參閱錯誤#49576修訂版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 a@b 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.

更改日志提到了PHP 5.3.3和PHP 5.2.14的此錯誤修復。

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

我認為開發人員正在采取明智的方法來檢查電子郵件地址,而不是建立自己的系統,一旦引入新的TLD,該系統就會保證過時。 我們有足夠的電子郵件地址語法檢查程序,拒絕foo@example.museum

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

來自RFC 5321:

如果在電子郵件地址中使用頂級域名,則使用單個字符串而不使用任何點。

只有在這之后它才會說:

在SMTP中使用域名時,僅允許可解析的完全限定域名(FQDN)。 換句話說,允許解析為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域名電子郵件地址:

文斯@ AI

保羅@ IO

根@公里

Joost的@ TK

管理員@ TT

hostmaster @ UA

示例電子郵件地址的來源: Tony Finch - 帶有MX的TLD

不, test可以是本地/內部網絡域,因此可以工作。 我喜歡它在開發時正確驗證了wrikken@localhost

正常的nonexistentdomain.foo會有同樣的問題。 如果要測試某些東西是否可以被主機getmxrr ,請使用getmxrr (並且它將失敗回到gethostbyname() )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM