micha: Email-Validierung bei php-formmailern

Moin,

habe in meinem formmailer eine schöne Funktion zur Überprüfung der mail-Adressen auf Plausibilität aber leider werden die Domainendungen nicht mit einbezogen.

Wenn jemand weiss woran das liegen könnte wäre ich sehr erfreut
und interessiert zu wissen an welcher Stelle der Code fehlerhaft
ist.Die Prüfung auf Syntax geht,aber es kann  alles mögliche
an Domainendungen eingegeben werden,ohne das das Script meckert.

cu micha

function validate_email($email)
{
return preg_match("/[1]+(.[_a-z0-9-]+)*@([0-9a-z][0-9a-z-]*[0-9a-z].)+([a-z]{2}|com|edu|gov|int|mil|net|org|shop|aero|biz|coop|info|museum|name|pro)$/i",$email);
}

Variable ist dann dein Formularfeld.

if(validate_email($_REQUEST["email"])!=true)
{
  die("<br><font face="Verdana, Helvetica, sans-serif" size="2" color=darkgray>Geben Sie bitte Ihre richtige Emailadresse an.<br><b>
  <a href="javascript:history.back();">
  «« zurück ««</a>");


  1. _a-z0-9- ↩︎

  1. Hallo,
    ich benutze folgendes Muster
    [1](.{0,1}[_a-zA-Z0-9-])*@([a-zA-Z0-9-]{2,}.){0,}[a-zA-Z0-9-]{3,}(.[a-zA-Z]{2,4}){1,2}$
    aber auch da wird nicht auf Domainendungen geachtet (Bloß auf Zeichenanzahl und so).

    scorn


    1. _a-zA-Z0-9- ↩︎

  2. Moin!

    habe in meinem formmailer eine schöne Funktion zur Überprüfung der mail-Adressen auf Plausibilität aber leider werden die Domainendungen nicht mit einbezogen.

    Das liegt daran, dass dein regulärer Ausdruck falsch ist. Er ist außerdem nicht nur in diesem Punkt falsch, sondern er benötigt beispielsweise auch mindestens zweibuchstabige 2nd-Level-Domains. Hast du aber schon mal http://www.x.org besucht? Die 2nd-Level-Domain hat nur einen Buchstaben!

    Außerdem mußt du natürlich dran denken, alle neu hinzukommenden generischen Top-Level-Domains auch hinzuzufügen, sofern es wieder einen Schwung neue gibt. Sowas ist arbeitsaufwendig, weil man informiert bleiben muß: a) darüber, welche neuen TLDs es gibt, und b) wo man die Prüf-Funktion schon überall eingebaut hat und als Admin noch zuständig dafür ist - sonst vergißt man mit Sicherheit stellen.

    Summa summarum: Deine Prüfung ist so ziemlicher Quatsch. Wenn du Plausibilität prüfen willst, dann schau, ob ein @ enthalten ist, und nach dem @ noch mindestens ein Punkt. Das ist ein allgemeines, immer gültiges Kennzeichen für eine Mailadresse. Wenn du es komplizierter machst, schließt du mögliche gültige Mailadressen aus, hast immerwährenden Wartungsaufwand (wie oben erwähnt), und kriegst doch keine Garantie, dass die gültig aussehende Mailadresse tatsächlich existiert. Wenn ich z.B. eine Mailadresse angeben soll und ich das nicht will, nehme ich gerne "example@example.com". Die ist garantiert plausibel, den Server gibts sogar - leider ist die Domain example.com reserviert, um als Dummy-Domain z.B. in Literatur verwendet zu werden.

    - Sven Rautenberg

    --
    ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
    1. Ho!
      Dann ist mein Ausdruck auch falsch nicht wahr?
      Doll... ich hasse dieses Buch..
      Aber zu überprüfen, ob vor dem @ nur gültige Zeichen sind, macht doch Sinn, oder?

      --
      excuse me, I'm dumb

      1. Moin!

        Dann ist mein Ausdruck auch falsch nicht wahr?

        Er ist nicht besser, sondern schlechter, weil er z.B. .museum ausschließt, wenn ich es richtig gesehen habe. Er erlaubt 2 bis 4 Zeichen für die TLD, .museum ist länger.

        Doll... ich hasse dieses Buch..
        Aber zu überprüfen, ob vor dem @ nur gültige Zeichen sind, macht doch Sinn, oder?

        Ja klar, aber welche Zeichen sind gültig? Alle (ok, fast alle, zumindest alle, die man als sichtbares Zeichen auf der Tastatur eingeben kann). Ergo: Es bringt nichts. Wenn nämlich Anführungszeichen gesetzt werden, kann man in denen praktisch jedes Zeichen als Usermailbox-Bezeichner verwenden.

        - Sven Rautenberg

        --
        ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
        1. Hoi,

          Ja klar, aber welche Zeichen sind gültig? Alle (ok, fast alle, zumindest alle, die man als sichtbares Zeichen auf der Tastatur eingeben kann). Ergo: Es bringt nichts.

          was ist mit ü ä ö ^´` ~ ñ etc.?
          || Wenn nämlich Anführungszeichen gesetzt werden, kann man in denen praktisch jedes Zeichen als Usermailbox-Bezeichner verwenden.
          Wie meinst du das jetzt?

          1. Hallo scorn,

            was ist mit ü ä ö ^´` ~ ñ etc.?
            Wie meinst du das jetzt?

            "öñ§"@example.com ist eine gültige Emailadresse.

            Viele Grüße,
            Christian

            1. Hi

              "öñ§"@example.com ist eine gültige Emailadresse.

              Bei der Überprüfung aber nicht bei der Registrierung nich, oda?

              1. Hallo Scorn,

                "öñ§"@example.com ist eine gültige Emailadresse.
                Bei der Überprüfung aber nicht bei der Registrierung nich, oda?

                Nachdem ich Svens Posting gelesen habe, habe ich gesehen, dass ich nicht 100%ig richtig lag, "$%%&//()))$!!§%"@example.com ist eine gültige Emailadresse, die die ich angegeben hatte, nicht, weil ö und ñ nicht auftauchen dürfen.

                Die meisten Emailanbieter erlauben es Dir allerdings wirklich nicht, solche Monster zu registrieren.

                Viele Grüße,
                Christian

          2. Moin!

            Ja klar, aber welche Zeichen sind gültig? Alle (ok, fast alle, zumindest alle, die man als sichtbares Zeichen auf der Tastatur eingeben kann). Ergo: Es bringt nichts.
            was ist mit ü ä ö ^´` ~ ñ etc.?
            Wenn nämlich Anführungszeichen gesetzt werden, kann man in denen praktisch jedes Zeichen als Usermailbox-Bezeichner verwenden.
            Wie meinst du das jetzt?

            Es gibt Mailadressen in der bekannten Form:
            username@domain.tld

            Und es gibt Mailadressen in dieser Form:
            "Toller Username mit irgendwelchen @%$!#-Sonderzeichen"@domain.tld

            RFC 822 sagt über die Zusammensetzung (ich hab ein schönes, aber engliches Dokument gefunden: http://www.cs.tut.fi/~jkorpela/rfc/822addr.html):

            ---schnipp---

            addr-spec   =  local-part "@" domain        ; global address

            local-part  =  word *("." word)             ; uninterpreted
                                                             ; case-preserved

            An word is either an atom or a quoted string.

            An atom is a sequence of printable ASCII characters except space or any of the following:
            ()<>@,;:".[]
            Positively speaking, this means that the valid constituents of an atom are the following:

            !"#$%&'*+-/0123456789=?
            @ABCDEFGHIJKLMNOPQRSTUVWXYZ^_
            `abcdefghijklmnopqrstuvwxyz{|}~
            ---schnapp---

            Das letztgenannte sind also gültige Zeichen einer "normalen" Mailadresse. Das sind ziemlich viele, wie ich finde, und an etliche wird wohl nicht gedacht.

            Außerdem gibts noch den "quoted string" (die zweite Form):

            ---schnipp---
            A quoted string is formed by using normal ASCII quotation marks (") around a string, and it's a way of turning almost any string syntactically to a word. This means for example that a string containing a space (say, Jukka Korpela) becomes acceptable when quoted, in a context where the syntax requires a word. A quoted string may contain any ASCII character, but quotation mark (") or carriage return (CR control code) must be preceded by a reverse solidus (backslash, ), and the reverse solidus itself as a character must be written as doubled (\).

            Note that RFC 822 limits the character repertoire to ASCII. In practice, other characters (such as ä or é) usually work inside quoted strings used for commenting purposes (and comments), but they must not be used in addresses proper.
            ---schnapp---

            Mit anderen Worten: Alle ASCII-Zeichen (und das sind die, deren Code zwischen 0 und 127 liegt, sind akzeptable Zeichen, solange sie gequotet werden. Und das macht einfache Mailprüfungslösungen einfach unmöglich.

            Für Perl gibts ein Modul, was die Überprüfung gemäß RFC822 erledigt. Das zu verwenden ist durchaus keine schlechte Idee, weil man davon ausgehen kann, dass die Programmierer sich wirklich zu 100% an den Standard gehalten haben und es deshalb wirklich nur dann "ungültige" Mailadressen gibt, wenn sie tatsächlich ungültig sind. Außerdem hat so ein Perl-Modul den nicht zu vernachlässigenden Vorteil, dass es lediglich von extern eingebunden wird und sich problemlos updaten läßt.

            Der Vollständigkeit halber: Es gibt ein neues Dokument, RFC 2822, welches wohl einige kleine Änderungen am Standard vornimmt - das hab' ich jetzt nicht berücksichtig.

            - Sven Rautenberg

            --
            ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|