Ansicht:   

#365383 Fehler in Regular Expression zur E-Mail-Adress-Validierung (web.coding)

verfaßt von MudGuard zur Homepage von MudGuard, München, 13.05.2014, 07:37:29

> ich habe einen regulären Ausdruck gebastelt, um eine in ein Kontaktformular
> im Internet eingegebene E-Mail-Adresse auf Validität zu überprüfen. Das
> Pattern sieht folgendermaßen aus:
>

^[a-zA-Z0-9._-]+@[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*.[a-zA-Z0-9]{2-6}$


>
> Gedanken dahinter:
>

(Buchstabe, Zahle, Punkt, Unterstrich, Bindestrich)+@(Buchstabe,
> Zahl)((Buchstabe, Zahl, Bindestrich)*(Buchstabe, Zahl))?(.(Buchstabe,
> Zahl)((Buchstabe, Zahl, Bindestrich)*(Buchstabe,
> Zahl))?)+(Buchstabe){2-4}



> Der lokale Teil der Adresse muss aus mindenstens einem alphanumerischen,
> einem Punkt oder Bindestrich bestehen (wie mir gerade auffällt, gibt's da
> natürlich einige Unzulänglichkeiten - so wäre eine Adresse á la
> ".@mail.com" auch möglich). Nach dem @-Zeichen muss dann das erste Zeichen
> Buchstabe oder Zahl sein, mögliche weitere Zeichen dürfen auch Bindestriche
> sein, der letzte Buchstabe muss aber in jedem Fall wieder Buchstabe oder
> Zahl sein. Subdomains kann, muss es aber nicht geben. Die Toplevel-Domain
> kann aus zwei bis fünf Zeichen bestehen (gibt's da mit den ganzen
> Städte-TLDs überhaupt noch eine Grenze nach oben?).

Du hast jetzt 3 Varianten für die Länge der TLD (im Regex 2-6, in den Gedanken 2-4, in der Beschreibung 2-5).

Was versprichst Du Dir von der Validierung?

Wenn Du sicherstellen willst, daß die E-Mail-Adresse dazu geeignet ist, dem User eine E-Mail zu schicken, hilft es nicht, wenn Du sicherstellst, daß eine formal richtige Adresse vorliegt (blabla@example.org hält jeder formalen Prüfung stand, eine Mail dorthin wird aber den User nicht erreichen).
Das schaffst Du nur, wenn Du dem User auf die angegebene Adresse eine Mail schickst mit einem Code, den der User auf Deiner Seite wieder eingeben muß. Nur wenn der User den korrekten Code wieder eingibt (den er NUR per E-Mail erhalten darf), weißt Du, daß die Adresse zu diesem Zeitpunkt geeignet ist.

Dein Ausdruck läßt ungültige E-Mail-Adressen durch, lehnt dafür aber gültige Adressen ab.

Der Hostname (also der Teil nach dem @) darf aus theoretisch unendlich vielen Ebenen bestehen, aber dabei gilt:
1 bis 64 Zeichen pro Ebene, 256 Zeichen maximal, 2 Ebenen minimal.

Dein Ausdruck erlaubt für die TLD nur 6 Zeichen, es gibt viele deutlich längere TLDs, siehe Datenbank der TLDs, hier werden also gültige Adressen abgelehnt.
Dein Ausdruck erlaubt aber auch für jede Ebene (außer der TLD) beliebig viele Zeichen.

Im Local Part (dem Teil vor dem @) erlaubst Du nur einen Teil der erlaubten Zeichen, viele fehlen, z.B. das +
Der . darf weder als erstes noch als letztes Zeichen auftauchen.


Sinnvoller als der Regex-Kram ist m.E. dieses Vorgehen:

prüfen, ob genau ein @ vorkommt.
Hostname abspalten, und auf Existenz der Domain prüfen (DNS-Abfrage).
Falls existent, auch noch prüfen, ob es für die Domain Mailserver gibt (MX-Records, auch aus der DNS-Abfrage)
Und wenn's wirklich wichtig ist, Mail mit speziellem Code an die Adresse schicken, und den Code auf Deiner Seite wieder abfragen.

Daß Du IDN (internationalized domain names, also Domainnamen mit Umlauten oder kyrillischen, arabischen, chinesischen, ... Zeichen) mit Deinem Regex nicht zuläßt, ist Dir hoffentlich auch bewußt. Diese müßten bei Deiner Prüfung als Punycode, also als xn--... eingegeben werden.

--
[image]
MudGuard
O-o-ostern

 

gesamter Thread:

Ansicht:   
Auf unserer Web-Seite werden Cookies eingesetzt, um diverse Funktionalitäten zu gewährleisten. Hier erfährst du alles zum Datenschutz