Diskussion: E-Mailadressen überprüfen per Regulären Ausdrücken

Ayom-Team

Angesehenes Mitglied
Diskussion zum Artikel E-Mailadressen überprüfen per Regulären Ausdrücken
in der Kategorie
PHP, Mysql & Apache

Habe hier eine einfache "Funktion" (ich weiß, dass es keine wirkliche PHP Funktion ist ;-)), die die E-Mailadresse eines User überprüft.

emailadresse-ueberpruefen.php
CODE
<?php
if (isset($_POST[submit])){
/*
Wegen PHP- register_globals="on" / "off"
Bei Problemen $_POST[submit] durch $submit ersetzen
und die nachfolgende Zeile auch, das $text = ...
*/
$text = $_POST[text];

//Folgende Patter überprüft ob die E-Mailadressen korrekt ist.

if (ereg("[.a-z0-9_-]+(.[a-z0-9_-]+)*@([0-9a-z][0-9a-z]*[0-9a-z].)+([a-z]{2,4})", $text)) {

echo "$text n <br /><br /><br />";
echo "<a href="$_SERVER[PHP_SELF]">Zurück zum Formular</a> n <br />";
} else {
echo '<p>E-Mailadresse ist nicht korrekt!</p>';
}
} else {
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="text" name="text" /><br />
<input type="submit" value="Abschicken" name="submit"/>
<?php
}
?>
</form>


-------------------
Dieser Artikel steht unter der Creative Commons Lizenz.
 
Dazu faellt mir ein schoenes Zitat aus den "Programming-Quotations" ein:

Manche denken, wenn sie mit einem Problem konfrontiert werden, "Oh, ich kann das mit Regular-Expressions loesen". Dann haben sie zwei Probleme. (Jamie Zawinski)

Der obige Ausdruck wuerde auch folgende Zeichenkette akzeptieren:

team@bowling&liga?de

Beste Gruesse,
den.
 
Der Spruch kommt mir sehr bekannt vor, aber wer auch immer den Reguluren Ausdruck da oben geschrieben hat, der weiß zwei Saschen nicht, (1) wie Reguläre Ausdrücke richtig verwendet werden und (2) wie eine E-Mail aussehen darf.

Ich weiß bei diesen Problem nur zwei Sachen: (1) das es nicht so einfach zu lösen ist, wie die meistens denken und (2) das Reguläre Ausdrücke zur Lösung des Problems helfen können, aber wahrscheinlich nicht alleine die Lösung stellen können.
 
Wie wäre es denn mit:

"^[_a-zA-z0-9-](\.{0,1}[_a-zA-z0-9-])*@([a-zA-z0-9-]{2,}\.){0,}[a-zA-z0-9-]{2,}(\.[a-zA-Z]{2,4}){1,2}$"

Zumindest was den RegExp angeht sollte das sauberer sein.
Ob man sich bei der Prüfung einer Mail nur auf einen solchen verlassen sollte sei jetzt mal dahin gestellt.

Gruß,
Tom
 
Wenn man sich diesen Thread durchliest, wirkt die Idee, das mit einem regulaeren Ausdruck zu versuchen, irgendwie absurd.

Allerdings sollte man sich vielleicht fragen, was man wirklich will. Wenn die Adresse korrekt und erreichbar sein muss, braucht man ja eigentlich nur 'ne Nachricht an die Adresse zu schicken, so wie es bei der Anmeldung zum Forum zum Beispiel schon passiert.

den
 
QUOTE (TSc @ Do 17.05.2007, 10:59)"^[_a-zA-z0-9-](\.{0,1}[_a-zA-z0-9-])*@([a-zA-z0-9-]{2,}\.){0,}[a-zA-z0-9-]{2,}(\.[a-zA-Z]{2,4}){1,2}$"



Da kann ich solche E-Mail-Adressen nutzen:

1234567890123456789012345678901234567890123456789012345678901234567890@as.de
__@a--s--s.abcd

oder auch (als eine Mail-Adresse gesehen):


CODE __@a--s--s.abcd
__@a--s--s.abcd


= zu diesen String (als PHP-Code dargestellt):

CODE '__@a--s--s.abcd' . "\r\n" . '__@\na--s--s.abcd'



QUOTE local-part
      The maximum total length of a user name or other local-part is 64
      characters.

   domain
      The maximum total length of a domain name or number is 255
      characters.

Quelle: RFC 2821 - Simple Mail Transfer Protocol




Aber nicht diese gültigen Adresse:

user+extension@domain.de
test@a.test.de
test@test.museum



Außerdem ist der Wertebereich A-z ziemlich problematisch, ich wüsste nicht auf anhieb, welche Zeichen da alles zugehören. Nach ISO/IEC 8859-1 wären das die folgenden Zeichen:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z

Ein einzelnes "-" müsste - bei sauberer Schreibweise - in eckigen Klammern escaped werden, da dieses normalerweise Wertebereiche makiert


@bowling-liga
Einen Sinn macht die Überprüfung schon, und wenn es nur darum geht zu überprüfen, dass keine ungültigen Zeichen eingegeben werden. Die Filterung von Benutzereingaben ist (insbesondere bei Webanwendungen) eine grundlegene Sicherheitsstrategie.





Ich würde eine grundlegende Überprüfung durchführen, sprich die E-Mail-Adresse zerlegen, auf die richtige länge prüfen, prüfen ob nur erlaube Zeichen in einen Teilbereich verwendent werden (dazu müssen alle gültigen Zeichen bekannt sein), ob die Adresse einen FQDN besitzt und ob auch entsprechende A-/MX-Record aufzufinden sind. Und was sonst noch im Bereich des Möglichen liegt.
 
QUOTE (Sascha Ahlers @ Do 17.05.2007, 13:03)
QUOTE (TSc @ Do 17.05.2007, 10:59)"^[_a-zA-z0-9-](\.{0,1}[_a-zA-z0-9-])*@([a-zA-z0-9-]{2,}\.){0,}[a-zA-z0-9-]{2,}(\.[a-zA-Z]{2,4}){1,2}$"



Da kann ich solche E-Mail-Adressen nutzen:

1234567890123456789012345678901234567890123456789012345678901234567890@as.de
__@a--s--s.abcd


Nicht ganz, es kann nur ein @ verwendet werden. Der Rest der Adresse wäre ja auch theoretisch möglich und daher ok das die durch die Prüfung geht



QUOTE (Sascha Ahlers @ Do 17.05.2007, 13:03)
oder auch (als eine Mail-Adresse gesehen):


CODE __@a--s--s.abcd
__@a--s--s.abcd


= zu diesen String (als PHP-Code dargestellt):

CODE '__@a--s--s.abcd' . "\r\n" . '__@\na--s--s.abcd'



QUOTE local-part
The maximum total length of a user name or other local-part is 64
characters.

domain
The maximum total length of a domain name or number is 255
characters.

Quelle: RFC 2821 - Simple Mail Transfer Protocol




Aber nicht diese gültigen Adresse:

user+extension@domain.de
test@a.test.de
test@test.museum



Stimmt, hier besteht noch Nachbesserungsbedarf.


QUOTE (Sascha Ahlers @ Do 17.05.2007, 13:03)
Außerdem ist der Wertebereich A-z ziemlich problematisch, ich wüsste nicht auf anhieb, welche Zeichen da alles zugehören. Nach ISO/IEC 8859-1 wären das die folgenden Zeichen:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z



Stimmt, das war ein Tippfehler von mir.
Müsste natürlich an allen Stellen heissen a-zA-Z0-9
Das kommt davon wenn man sowas "mal eben so" tippt...
 
Ich hatte obigen Thread eingelinkt, weil darin schon eine aehnliche Diskussion angestossen wurde. Ein gueltiger local-part enthaelt eben nicht nur Buchstaben von a-z, Zahlen, .-+ usw., sondern kann auch weitere Sonderzeichen und Leerzeichen enthalten, die dann entsprechend gequotet sind. Was eben bedeutet das " user !!! "@irgendeine_domain.de auch gueltig ist. Der domain-part ist mit Sicherheit einfacher zu parsen.

@Sascha Ahlers:
Allerdings glaube ich eben nicht daran, dass hier das Sicherheitsproblem so praesent ist, wenn man die ueblichen Vorsichtsmassnahmen beachtet, falls Du auf MySQL-Injection hinaus willst. Die Adresse zu zerlegen und die Laengen zu pruefen, halte ich auch fuer sinnvoll. Allerdings ist die Idee mit der DNS-Abfrage in der Praxis nicht so ganz ohne Probleme.

den
 
QUOTE (bowling-liga @ Do 17.05.2007, 13:48)[...] Was eben bedeutet das " user !!! "@irgendeine_domain.de auch gueltig ist. [...]

Die scheint nicht gültig zu sein (siehe rote Makierung), dieses Zeichen im nicht von der DeNIC erlaubt ist.
 
Danke fuer die Korrektur ...
wink.gif


Cheers,
den.
 
QUOTE (TSc @ Do 17.05.2007, 13:43)
QUOTE (Sascha Ahlers @ Do 17.05.2007, 13:03)
QUOTE (TSc @ Do 17.05.2007, 10:59)"^[_a-zA-z0-9-](\.{0,1}[_a-zA-z0-9-])*@([a-zA-z0-9-]{2,}\.){0,}[a-zA-z0-9-]{2,}(\.[a-zA-Z]{2,4}){1,2}$"



Da kann ich solche E-Mail-Adressen nutzen:

1234567890123456789012345678901234567890123456789012345678901234567890@as.de
__@a--s--s.abcd


Nicht ganz, es kann nur ein @ verwendet werden. Der Rest der Adresse wäre ja auch theoretisch möglich und daher ok das die durch die Prüfung geht

Es wird doch nur jeweils ein @ verwendet, aber der Local-Part ist bei der oberen Adresse 70 Zeichen lang und in der unteren hat der Domain-Part 2x zwei aufeinanderfolgende Bindestriche, was nicht erlaubt ist.
 
Wobei die IDNs natuerlich mit xn-- anfangen koennen, falls man xn--mller-kva heisst ...
biggrin.gif
 
Zurück
Oben