2010-08-04 7 views
9

Ich habe gerade die Validierung für ein Formular eingerichtet, in dem ich mich entschieden habe, die Funktion filter_var zu verwenden, um die Gültigkeit meiner E-Mail-Adresse zu überprüfen. Ich kann nicht herausfinden, was filter_var tatsächlich erlaubt (obwohl die Dokumentation sehr einfach ist) und ich habe herausgefunden, dass es eine E-Mail-Adresse wie test @ test erlaubt. Muss es keine .com, .net etc ... in der Domain geben?

+8

Technisch könnte 'test' ein gültiger Hostname in einem lokalen Netzwerk sein, also nehme ich an, dass es korrekt ist. –

+1

Können Sie bitte Ihren Code posten? var_dump (filter_var ('test @ test.', FILTER_VALIDATE_EMAIL)); gibt false für mich zurück! – Youssef

+1

test @ test ohne den dot returns false too – Youssef

Antwort

18

Das Verhalten hat sich irgendwo etwa im April geändert. Siehe bug #49576 und revision 297350.

Diese E-Mail tatsächlich ungültig ist, oder zumindest das ist, was der PHP-Entwickler zu verstehen. Die Quelle trägt diese Mitteilung:

/* 
* 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. 

Die changelog erwähnt diesen Bug-Fix für PHP 5.3.3 und PHP 5.2.14.

+1

Das Ticket für diesen Bug ist ab PHP5.3.3 und PHP5.2.14 – Gordon

+0

fest markiert. Großer Fang Artefacto. Ich nehme an, die Regeln haben sich geändert? Warum hat sich das geändert? Ich wünschte, sie würden erklären, was sie in der filter_var-Dokumentation überprüfen. Also wird diese Rückkehr vor 5.3.3 und falsch nach 5.3.3 wahr sein? Das System, das ich verwende, ist 5.2.12 – Metropolis

+0

@Metro Es prüft die E-Mail auf Übereinstimmung mit Internet-Standards. Die Tatsache, dass "test @ test" zuvor erlaubt war, war ein Fehler. – Artefacto

5

Es ist eine gültige E-Mail-Adresse. Es wird nicht im Internet funktionieren (zumindest nicht heute), aber es ist in Ordnung für eine lokale Adresse.

Ich würde davon ausgehen, dass die Entwickler den vernünftigste Ansatz nehmen E-Mail-Adressen zu prüfen und nicht selbst ein System bauen, das als eine neue TLD eingeführt wird, veraltet zu gehen, sobald sichergestellt ist. Wir haben genug E-Mail-Adressen-Syntax-Checker, die [email protected] zurückweisen, wie es ist.

+1

Glauben Sie, dass Abschnitt 2.3.5 von RFC 5321 nicht gilt? – Artefacto

1

Nein, test kann eine lokale/interne Netzwerk-Domäne sein, damit funktionieren würde. Ich mag es, dass es [email protected] bei der Entwicklung zum Beispiel richtig validiert.

A normal nonexistentdomain.foo würde das gleiche Problem haben. Wenn Sie testen möchten, ob etwas an einen Host delibarable ist, verwenden Sie (und es fällt nicht zurück auf gethostbyname()).

+0

Also ist es am besten, lokale Adressen zuzulassen? Oder sollte ich getmxrr mit nutzen, wenn ich sowas wie test @ test nicht zulassen will? – Metropolis

+0

Wäre es nicht besser, checkdnsrr zu überprüfen? Wenn der Server heruntergefahren ist oder etwas anderes, gibt getmxrr false zurück. Recht? – Metropolis

+1

Sie würden lokale Adressen erlauben (meistens in bekannten IP-Bereichen), wenn Sie diese handhaben wollen/erwarten. Du könntest tatsächlich checkdnsrr ('hostname', 'ANY') verwenden, ist mir nicht aufgefallen (obwohl das Überprüfen auf MX oder A Datensatz (was der Fallback sein sollte, wenn kein MX definiert wurde) wäre zuverlässiger: eine registrierte Domäne möglicherweise keine A & MX-Datensätze, wodurch sie nicht zustellbar sind). checkdnsrr/gethostbyname/getmxrr verwenden alle den gleichen Mechanismus afaik, wenn also ein DNS-Server ausgefallen oder langsam ist, würde es für alle Optionen scheitern. – Wrikken

3

Test @ test ist syntaktisch gültig.

Von RFC 5321:

Im Fall einer Top-Level-Domain für sich in einer E-Mail-Adresse verwendet wird, eine einzelne Zeichenfolge wird ohne Punkte verwendet.

Erst danach heißt es:

Nur auflösbar, vollständig qualifizierte Domänennamen (FQDNs) zulässig sind, wenn Domain-Namen in SMTP verwendet werden. Mit anderen Worten, Namen, die zu MX RRs oder Adresse (dh A oder AAAA) RRs (wie diskutiert in Abschnitt 5 diskutiert werden können) sind erlaubt, ebenso wie CNAME RRs, deren Ziele wiederum aufgelöst werden können, um MX oder Adress-RRs. Lokale Spitznamen oder nicht qualifizierte Namen dürfen nicht verwendet werden.

Dies schließt nicht unbedingt nur Domänennamen mit TLD aus. In der Tat, führen Sie den folgenden Code ein:

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

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

TLD-only Domain-Namen haben (können) MX-Datensätze und sind im Einsatz: http://www.to/ ein Beispiel.Und hier einige gültige TLD-only Domain-Namen E-Mail-Adressen:

vince @ ai

paul @ io

root @ km

joost @ tk

admin @ tt

hostmaster @ ua

Quelle des Beispiels email addr sses: Tony Finch – TLDs with MXs