Marc Reichelt: E-Mail-Validierung: Neuer Ansatz

Beitrag lesen

Hallo Alexander,

»» Hierbei möchte ich ausdrücklich NICHT prüfen, ob die E-Mail-Adresse logisch korrekt ist, sondern größeren Schaden verhindern.

Was für Schäden?

Schäden der Form, wie ich sie beschrieben habe: Header Injections, Angabe mehrerer E-Mails auf ein Mal und Angabe mehrerer Strings, die alle eigentlich die selbe E-Mail-Adresse sind.

»» 2. Die Benutzung in der Funktion mail() soll möglich sein ohne Schaden anzurichten (Injenction).

Wenn PHP selbst nicht vernünftig escapen kann, mußt Du es vorher machen.

Eben genau das ist mein Vorhaben.

»» 4. Die E-Mail-Adresse soll eindeutig identifizierbar sein, damit nicht mehrfach die gleiche Adresse als Ziel verwendet wird.

Welche der folgenden Adressen sind mit joe@example.com identisch? Welche füllen garantiert die selbe Mailbox?

joe@example.com.

Das ist in der Tat eine interessante Angabe - eine einfache Regel hierfür wäre das Ausschließen von Punkten am Ende.

Joe@example.com
JOE@example.com
JOE@EXAMPLE.COM
joe@EXAMPLE.COM

Dies hätte mich sogar gar nicht betroffen, da ich MySQL zur Abfrage verwende. Dennoch ist dies ein wichtiger Punkt, falls Groß- und Kleinschreibung unterschieden wird.

joe+ipv6@example.com
joe-ipv6@example.com
joe@ipv6.example.com
joe@example.org
josef-maria.doe@example.com

Soweit ich das sehe sind dies alles unterschiedliche Adressen, die eventuell später auf die gleiche Mailbox verwaisen können - so etwas soll die Funktion nicht prüfen können. Und außerdem ist das praktisch nicht möglich.

»» - Es muss mindestens ein "@" vorkommen.

  • Nach dem letzten @ muß mindestens ein Punkt vorkommen, der nicht direkt am @ hängen darf.

Gute Regel - kann direkt aufgenommen werden, allerdings fehlt mir hier die Angriffsmöglichkeit.

  • Ein abschließender "." ist zwar selten, aber technisch korrekt.

Eben deshalb könnte ich ihn in meiner E-Mail-Validierung ausschließen.

»» - Die Gesamtlänge darf 255 nicht überschreiten (willkürlich gewählt, um ein Limit zu setzen).

Naja, gut, das kannst Du machen. Aber ein Limit ist in den RFCs nicht drin, soweit ich mich erinnere. Hostnamen haben eine Längenbegrenzung, Mail-Accounts nicht.

Meine Tabellenspalte in der Datenbank aber schon. ;)
Und: Solche langen E-Mail-Adressen können allein schon deshalb ausgeschlossen werden, weil sie so selten vorkommen. Und wenn sie vorkommen, ist das in 99,9% der Fälle Absicht.

»» - zu 4.) Die Zeichen "<" und ">" müssen ausgeschlossen werden, sonst sind Mehrfachnennungen der Form "Eva Mustermann 123@example.com" und "Adam Mustermann 123@example.com" möglich.

s/^(.+)\s+<([^<>]+)>$/$2/;

Ich könnte natürlich auch einfach das Vorkommen jeglicher "<" und ">" in der Adresse verbieten - das würde meine Regel (1) erfüllen. So ein regulärer Ausdruck ist zwar auch ganz schick und schnell geschrieben, jedoch später schwer nachzuvollziehen wenn man sich länger nicht damit beschäftigt hat.

Alles in allem hast du noch einige Dinge gefunden, die ich in meine Funktion mit aufnehmen sollte. Sehr gut!

Grüße

Marc Reichelt || http://www.marcreichelt.de/

--
DPRINTK("Last time you were disconnected, how about now?");
        linux-2.6.6/drivers/net/tokenring/ibmtr.c
Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)