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?
Antwort
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.
Das Ticket für diesen Bug ist ab PHP5.3.3 und PHP5.2.14 – Gordon
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
@Metro Es prüft die E-Mail auf Übereinstimmung mit Internet-Standards. Die Tatsache, dass "test @ test" zuvor erlaubt war, war ein Fehler. – Artefacto
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.
Glauben Sie, dass Abschnitt 2.3.5 von RFC 5321 nicht gilt? – Artefacto
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()
).
Also ist es am besten, lokale Adressen zuzulassen? Oder sollte ich getmxrr mit nutzen, wenn ich sowas wie test @ test nicht zulassen will? – Metropolis
Wäre es nicht besser, checkdnsrr zu überprüfen? Wenn der Server heruntergefahren ist oder etwas anderes, gibt getmxrr false zurück. Recht? – Metropolis
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
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
Technisch könnte 'test' ein gültiger Hostname in einem lokalen Netzwerk sein, also nehme ich an, dass es korrekt ist. –
Können Sie bitte Ihren Code posten? var_dump (filter_var ('test @ test.', FILTER_VALIDATE_EMAIL)); gibt false für mich zurück! – Youssef
test @ test ohne den dot returns false too – Youssef