Sven Rautenberg: RegExp für Email Validierung - Diskussionsvorlage

Beitrag lesen

Moin!

Was ist "grober Schmutz" für dich?
Wenn sich jemand vertippt und dort ne URL eingibt....
Wie oft erlebe ich die Antwort auf "wie lautet Deine E-Mail-Adresse?": www.xyz.de

Email-Adressen enthalten ein "@" und danach irgendwo einen "." - das macht mein Regex, Mission erfüllt, Doofheitsfehler eliminiert.

Mit diesem Regex schließt du massenhaft gültige Mailadressen aus, weil es logischerweise viel mehr Top-Level-Domains gibt, als du annimmst.
Naja, eine Liste aller TLDs läßt sich mit mehr oder weniger Aufwand zusammenstellen. Diese hier sollen nur exemplarisch sein.

Die Liste der TLDs verändert sich aber regelmäßig, und ist obendrein schon jetzt ziemlich lang.

Außerdem habe ich noch nie erlebt, dass User sich bei der TLD vertippen - wohl aber bei der Second-Level-Domain.

Auf der anderen Seite lässt du z.B. ungültige Domainangaben durch. Der Regex ist also weder zum Filtern geeignet, noch zur Validierung.
Was müsste ich denn noch ausschließen?

Wenn du das nicht selbst herausfinden kannst, solltest du keine derartig strenge Filterung mit Regex programmieren. Lies die einschlägigen RFC zur Bildung von Mailadressen und Domainnamen. Denn das musst du, wenn dein Argument lautet, dass nur eine strenge Validierung gegen Tippfehler schützt.

"Gültig" und zur weiteren Verwendung freigegeben ist eine Mailadresse erst dann, wenn man an diese Adresse einen Validierungslink gesendet hat, und der vom Mailempfänger aktiv geklickt wurde. Solange das nicht der Fall ist, ist die Mailadresse invalide und nicht benutzbar.
Das ist wohl zu umständlich für die Filterung des "groben Schmutz". Es soll ja kein Newsletter-Login werden, sondern ein einfaches Kontakt-E-Mail-Formular.

Die Mailadressenangabe in einem Kontaktformular braucht keine Validierung. Bestenfalls einen Check, dass da sowas wie eine Mailadresse eingegeben wurde, also mit @ drin. Wenn das fehlt, ist es definitiv keine Mailadresse.

Alles andere hingegen bringt dir nichts. Spammer erfinden keine ungültige Domains und haben auch kein Problem, gültige Mailadressen anzugeben. Und selbst legitime User kriegen es perfekt hin, valide, aber dennoch unerreichbare Mailadressen einzutippen, weil der Fehler für dich unerkennbar irgendwo in der Domain bzw. der Postfachangabe steckt.

Als Regex: .+@.+..+
Ei der Daus. Das klingt logisch und sinnnvoll. Allerdings läßt das wiederum alles durch, was ich eben etwas einschränken möchte.
Zumindest die TLDs wären doch eine sinnvolle Erweiterung. Zulässige Zeichnen für Domains könnte man auch noch mit einbauen. Oder?
Und damit bin ich schon wieder sehr nahe an meiner Lösung oben.

Dieser Regex stellt grundlegende Anforderungen an die Mailangabe, die unabdingbar sind und die sich durch technische Veränderungen von RFCs mit sehr großer Wahrscheinlichkeit nicht ändern werden.

Dadurch ist dieser Regex vermutlich die nächsten zwanzig Jahre ohne Update-Notwendigkeit zur oberflächlichen Prüfung von Mailadressen einsetzbar.

Deine Lösung mit expliziter Angabe von TLDs hingegen muss regelmäßig, im Prinzip jeden Tag, aktualisiert werden, weil grundsätzlich jederzeit weitere TLDs definiert werden können. Und wie die Vergangenheit gezeigt hat, geschieht dies häufiger, als man glaubt, und auch mit Formaten, die man nicht vorhergesehen hat. Der Klassiker bei der TLD-Prüfung ist ja [a-z]{2,3} - hat toll funktioniert, bis man .info als TLD einführte. Das Update auf [a-z]{2,4} hat toll funktioniert, bis .museum eingeführt wurde. Und es "funktioniert" ja auch weiterhin toll, weil .museum nun wirklich nicht zu den alltäglichen Domains gehört.

Aber die Pläne der zuständigen Verwaltungsgremien gehen dahin, nicht nur ASCII-Domains zu erlauben, sondern auch Unicode-TLDs einzuführen. Womit deine Validierung direkt das nächste Problem kriegt: Im Prinzip müsstest du den Domain-Part vor deinem Check mit dem Regex erstmal in Punycode konvertieren, denn deine ganzen codierten Annahmen gehen davon aus, dass nur die im DNS-System erlaubten Zeichen eingegeben werden. Umlautdomains sind bei dir derzeit nicht möglich - was bei Mails derzeit aber auch noch kein so großes Problem ist, weil Mailclients Punycode auch noch nicht flächendeckend implementiert haben. Aber das wird sich ändern.

Dasselbe Problem mit Unicode-Zeichen im Mailbox-Part wird sich über kurz oder lang auch noch entwickeln. Hierzu gibt es noch kein fertiges RFC, das wird aber mit Sicherheit kommen.

Wenn du jetzt also mit deinem Regex extrem streng bist, unter Umständen sogar hartcodiert gültige TLDs einfügst, dann hast du dir damit die Verpflichtung auferlegt, deinen Code regelmäßig an die Fortschritte der Technik anzupassen. Kannst du das leisten? Willst du das leisten? Und kannst du garantieren, dass du auf alle Stellen, an denen dein Regex verwendet wird, im Updatefall noch Zugriff hast (sprich: irgendwelche Alt-Projekte, z.B. für Kunden - da ist irgendwann der Serverzugriff weg)?

- Sven Rautenberg