Почему filter_var ($ email, FILTER_VALIDATE_EMAIL) разрешает test @ test? - PullRequest
9 голосов
/ 04 августа 2010

Я только настраивал проверку формы, в которой я решил попробовать использовать функцию filter_var для проверки правильности моего адреса электронной почты. Хотя я не могу выяснить, что на самом деле позволяет filter_var (поскольку документация очень проста), и я обнаружил, что он разрешает использование адреса электронной почты, такого как test @ test. Разве в домене не должно быть .com, .net и т. Д.?

Ответы [ 4 ]

18 голосов
/ 04 августа 2010

Поведение изменилось где-то в апреле.См. ошибка # 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.

В changelog упоминается это исправление ошибки для PHP 5.3.3 и PHP 5.2.14.

5 голосов
/ 04 августа 2010

Это действующий адрес электронной почты.Он не будет работать в Интернете (по крайней мере, не сегодня), но это хорошо для локального адреса.

Я бы предположил, что разработчики используют разумный подход к проверке адресов электронной почты, а несоздание системы, которая гарантированно устареет, как только будет введен новый TLD.У нас достаточно средств проверки синтаксиса адресов электронной почты, которые отклоняют foo@example.museum как есть.

4 голосов
/ 14 августа 2010

test @ test является синтаксически действительным.

Из RFC 5321:

В случае использования домена верхнего уровня, используемого в адресе электронной почты, одна строкаиспользуется без каких-либо точек.

Только после этого он говорит:

Разрешаются только полностью разрешаемые доменные имена (FQDN), когда доменные имена используются в SMTP,Другими словами, разрешены имена, которые могут быть разрешены в записи MX RR или адреса (т. Е. A или AAAA) (как обсуждено в разделе 5), а также записи CNAME, цели которых, в свою очередь, могут быть разрешены в MX или адреса RR.,НЕ ДОЛЖНЫ использоваться локальные псевдонимы или неквалифицированные имена.

Это не обязательно исключает доменные имена только для TLD.Фактически, запустите следующий код:

checkdnsrr('ua', 'MX') // Returns true</p> <p>getmxrr('ua', $array) // Returns true

доменные имена только для TLD (могут) иметь записи MX и используются : http://www.to/ это пример.И вот некоторые действительные адреса электронной почты для доменных имен только для TLD:

vince @ ai

paul @ io

root @ km

joost @ tk

admin @ tt

hostmaster @ ua

Источник примеров адресов электронной почты: Tony Finch - TLD с MX

1 голос
/ 04 августа 2010

Нет, test может быть доменом локальной / внутренней сети, чтобы это работало. Мне нравится, что он правильно проверяет wrikken@localhost при разработке, например.

Обычный nonexistentdomain.foo будет иметь такую ​​же проблему. Если вы хотите проверить, является ли что-то доступным для хоста, используйте getmxrr (а если это не удается, вернитесь к gethostbyname()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...