Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Sinnvolle Standard-Verfahren zur E-Mail-Validierung

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Sinnvolle Standard-Verfahren zur E-Mail-Validierung

    Mir ist in letzter Zeit immer wieder mal aufgefallen, das bzgl. Anfragen betreffend der E-Mail-Adressen Validierung die "Antworterei" immer wieder von vorne und in allen Richtungen losgeht.

    Die einen User hier haben Links in der Signatur zum einzig wahren 3-Tonnen-Regex, die anderen schwören auf filter_var(..., FILTER_VALIDATE_EMAIL), die anderen wiederrum plädieren im Sinne von KISS auf eine minimalistische Prüfung im Sinne von [irgendwas]{3,}@[irgendwas]{3,}.[irgendwas]{2,} (auf die schnelle hingetippselt), andere wiederrum wollen sogar vorher den dns abfragen in Bezug auf die Existenz der Domin etc..

    Wäre das nicht ev. ein Grund darüber einen Artikel im Wiki zu verfassen, der zumindest die üblichen Wege und die Vor- und Nachteile beschreibt.. zB das filter_var(..., FILTER_VALIDATE_EMAIL) keine Umlaute mag, das es dafür aber eine punycode Konvertierung gäbe - mit fertigen Klassen im Web etc... oder das oft weniger mehr ist, weil man die echte Existenz von Konten (nicht Domain!) eh nicht prüfen kann, weil Umlaut-Domains immer mehr kommen weil nur die Umlaute alleine nicht als Sonderzeichen reichen (https://de.wikipedia.org/wiki/Intern...chens.C3.A4tze), etc.. etc..

    Was meint ihr dazu?
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

  • #2
    Ja, mach doch mal.
    [COLOR="#F5F5FF"]--[/COLOR]
    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
    [COLOR="#F5F5FF"]
    --[/COLOR]

    Kommentar


    • #3
      Dafür ein Tutorial oder FAQ zu bauen halte ich für Sinnvoll, ja. Allerdings macht es aus meiner Sicht weniger Sinn das ins PHP.de-Wiki zu packen. Ich hatte überlegt meinen Composer-Guide auch direkt ins Wiki zu parken, allerdings ist die Frequenz in der das Wiki weiterentwickelt wird und die Frequenz in der das Wiki auch aktiv genutzt wird so gering, das es sich aus meiner Sicht nicht lohnt das zu tun.

      Es wurde im PHP.de-Stammtisch auch schon vorgeschlagen alles aus dem Wiki inkl. neuer Beiträge mit geringerer Erweiterungsschwelle außerhalb von PHP.de zu veröffentlichen ( Github ist hier die wohl beste Wahl, meiner Meinung nach.. )
      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

      Kommentar


      • #4
        @nikosch
        dann werde ich mal alles mir bekannte sammeln und melde mich wieder.

        @tr0y
        Ich wollte diesen Beitrag zuerst auch im Off-Topic-Bereich schreiben, aber mir kam es dann im Sinne von "mach mal Pause vom Programmieren" irgendwie off-topic vor

        Ansonsten... Wenn es bei einer Anfrage im Board dazu im Wiki ein Thema gibt, dann verlinke ich auch da drauf wo nur möglich.. ich bin der ".. der Vollständigkeit halber noch hier dieser und jener Link ..." Typ ... Ich finde die Idee des Wikis als IMHO *sehr* ausführliche FAQ Sammlung super, die etwas - ja wie soll ich sagen - Einbettung ins Forum ist eine andere Sache.. Ev. ist es wirklich einfacher da was externes zu machen wie tr0y sagt, als das ins vBulletin reinzu-pressen... Ich meine ja auch schonmal gelesen zu haben das es u.a. auch ein Grund ist das das Board hier kein Update bekommt, weil eben die "Integration" des Wikis so mühsam ist.. sollte man ev. echt drüber nachdenken ...
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          ... das Board upzudaten und das Wiki wegzuwerfen ... Ja.
          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

          Kommentar


          • #6
            ... und das Wiki wegzuwerfen ...
            ... das Wiki auszulagern
            The string "()()" is not palindrom but the String "())(" is.

            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              Zitat von hausl Beitrag anzeigen
              ... das Wiki auszulagern
              Okay, jetzt ein alles erschlagenes Argument: Wiki muss man warten, Github nicht.
              [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

              Kommentar


              • #8
                Dann so: ... das Wiki "inhaltlich" nach Github auslagern und nicht killen...

                Übrigens - da wars was ich mal gelesen hatte.. u.a.(!)

                http://www.php.de/board-support/8268...tml#post613689

                Zitat von dsmcg Beitrag anzeigen
                Gibt es eigentlich einen speziellen Grund warum das Board noch auf Version 3.7.2 läuft? Aktuell ist doch die Version 4.1.4 oder? Kenn mich mit vBulletin nicht gut aus daher werfe ich die Frage mal in den Raum
                Zitat von Manko10 Beitrag anzeigen
                Jup, gibt es.
                a) vB 3 wird noch supportet (hoffentlich auch noch ein bisschen länger).
                b) ein Update wird kompliziert (insbesondere mit dem Wiki etc.)
                c) vB 4 ist noch unsäglicher als es vB 3 es eh schon ist.
                ...
                D.h. wenn man das "Wiki etc." alles auslagern würde, wäre zumindest/generell diese Hürde vom Tisch!?
                The string "()()" is not palindrom but the String "())(" is.

                Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                PHP.de Wissenssammlung | Kein Support per PN

                Kommentar


                • #9
                  So, ich fasse hier mal zusammen, was ich bisher gesammelt habe bzw. in Erfahrung gebracht habe.

                  Da es für die Prüfungen der einzelnen Verfahren meiner Ansicht nach ein relevanter Punkt zu dieser Thematik war, habe ich als Testdomain nicht die übliche example.com (ff) verwendet sondern die hierzulande gültige oeamtc.at oder auch öamtc.at (die gelben Engel des Alpenvorlandes ) Mir ist sonst keine internationalisierte Test-Domain bekannt.

                  Zuerst einmal die bisher mir bekannten Varianten der formellen Prüfung:


                  1. Formelle Prüfung mittels Regulären ausdrücken (regex)

                  Problem: Mit dem hier [4] zur RFC 2822 empfohlenen Pattern werden jedoch leider Internationalisierte Domains (zB müller.de) nicht korrekt erkannt. Erst nach Kürzung des Patterns auf einen groben Rahmen (siehe weiter unten) funktioniert es.

                  -- EDIT --
                  Für die "dumme/grobe" Rahmenprüfung gibt es hier weiter unten das aktualisierte Pattern / die Funktion.
                  ----------

                  Die alternative für Regex und Internationalisierte Domains wäre die vorherige Umwandung in Punycode [2]. Dafür gibt es fertige Klassen im Web.

                  PHP-Code:

                  // Die Testfunktion
                  function isEmailOkByPregMatch($mailAdr$pattern) {
                      return (bool) 
                  preg_match($pattern$mailAdr);
                  }

                  // Pattern 1: Gem. Empfehlung von [4]
                  // habe es als NOWDOC angegeben, so war nur das @ zu escapen da ich es auch als delimiter verwendet habe
                  $pattern = <<<'REGEX'
                  @[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*\@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?@Ui
                  REGEX;

                  // TESTS mit Pattern 1

                  $mailAdr "mail@oeamtc.at";
                  var_dump(isEmailOkByPregMatch($mailAdr$pattern));
                  // true

                  $mailAdr "mail@öamtc.at";
                  var_dump(isEmailOkByPregMatch($mailAdr$pattern));
                  // false

                  // nach Punycode-Umwandlung
                  $mailAdr "mail@xn--amtc-4qa.at";
                  var_dump(isEmailOkByPregMatch($mailAdr$pattern));
                  // true


                  // Pattern 2: Einfache/Dumme Prüfung der Rahmenbedingungen
                  $pattern '#\b.+@.+\..{2,6}\b#Ui'// ev. alternativ ^ und $ statt \b  ???

                  // TESTS mit Pattern 2

                  $mailAdr "mail@oeamtc.at";
                  var_dump(isEmailOkByPregMatch($mailAdr$pattern));
                  // true

                  $mailAdr "mail@öamtc.at";
                  var_dump(isEmailOkByPregMatch($mailAdr$pattern));
                  // true 

                  2. Formelle Prüfung mittels filter_var()

                  Ähnlich wie 1. jedoch spart man sich die Geschiche mit den regulären Ausdrücken etc.. Gleiches Problem wie oben, internationalisierte Domains funktionieren erst nach vorheriger Umwandung in Punycode [2].


                  PHP-Code:

                  // die Testfunktion
                  function isEmailOkByFilterVar($mailAdr) {
                      return (
                  false !== filter_var($mailAdrFILTER_VALIDATE_EMAIL));
                  }

                  // TESTS

                  $mailAdr "mail@oeamtc.at";
                  var_dump(isEmailOkByFilterVar($mailAdr));
                  // true

                  $mailAdr "mail@öamtc.at";
                  var_dump(isEmailOkByFilterVar($mailAdr));
                  // false

                  // Und mit punycode-Umwandlung von öamtc.at
                  $mailAdr "mail@xn--amtc-4qa.at";
                  var_dump(isEmailOkByFilterVar($mailAdr));
                  // true 

                  3. Prüfung auf die Domain in der E-Mail-Adresse

                  Auch hier funktioniert eine direkte Angabe von öamtc.at als Domain nicht, nach Umwandlung in Punycode jedoch ist alles in Ordnung. Hier habe ich jedoch keine Erfahrungswerte in wie fern die DNS Abfragen stabil etc.. erreichbar sind.

                  PHP-Code:
                  function isEmailOkByDNS($mailAdr) {
                      list(
                  $mailUser$mailDomain) = explode('@'$mailAdr);    
                      return (
                  checkdnsrr($mailDomain"MX") or checkdnsrr($mailDomain"A"));
                  }

                  // normaler check
                  $mailAdr "mail@oeamtc.at";
                  var_dump(isEmailOkByDNS($mailAdr));
                  // true

                  // check internat. domain
                  $mailAdr "mail@öamtc.at";
                  var_dump(isEmailOkByDNS($mailAdr));
                  // false

                  // mit/nach punycode umwandlung
                  $mailAdr "mail@xn--amtc-4qa.at";
                  var_dump(isEmailOkByDNS($mailAdr));
                  // true 

                  Natürlich können obige Beispiele auch Kombiniert eingesetzt werden.


                  Mein persönliches Fazit:

                  Oft ist weniger mehr. Man kann vor dem Versand keine E-Mail-Adresse 100%ig prüfen. Daher denke ich im Sinne von K.I.S.S. (= keep it stupid simple) ist die dumme/grobe regex Rahmenprüfung und "double opt in" (was mittlerweile sowieso üblich bzw. was ich gehört habe auch gesetzlich vorgegeben ist) der richtige Weg. Damit spare ich mir auch die nötige extern punycode Klasse.

                  Denn selbst die beste formelle Prüfung inkl. DNS Abfrage garantiert mir nicht das es schlussendlich den Benutzeraccount beim Empfänger überhaupt gibt.


                  By the Way - Fakten aus der Praxis:

                  GMX und WEB.DE: "Mindestens 3 Zeichen (auch . _ -)"
                  GMAIL: "Bitte verwenden Sie nur Buchstaben (a bis z), Ziffern und Punkte"
                  Mein Hoster: "Ihre E-Mail Adresse muss aus mindestens einem Zeichen bestehen und darf nur Buchstaben, Zahlen sowie die Sonderzeichen - und _ und % sowie Punkte enthalten. Sonderzeichen dürfen nicht am Anfang oder am Ende der E-Mail Adresse stehen."


                  Quellen - Resourcen:

                  [1]
                  http://de.wikipedia.org/wiki/E-Mail-Adresse

                  [2]
                  Internationalisierte Domainnamen
                  http://de.wikipedia.org/wiki/Interna...chens.C3.A4tze
                  Für die Punycodeumwandlung gibt es fertige Klassen im Web, fragt Tante G.

                  [3]
                  RFC 2822 http://tools.ietf.org/html/rfc2822#section-3.4.1

                  [4]
                  http://www.regular-expressions.info/email.html
                  The string "()()" is not palindrom but the String "())(" is.

                  Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                  PHP.de Wissenssammlung | Kein Support per PN

                  Kommentar


                  • #10
                    Bei Punycode kannst du vielleicht noch drauf hinweisen, wie man da ( einfach ) rankommt:

                    PHP-Code:
                    function validate_email($mail)
                    {
                        if ( ! 
                    filter_var($mailFILTER_VALIDATE_EMAIL) ) {
                            
                    $in explode('@'$mail);
                            
                    $in[1] = idn_to_ascii($in[1]);
                            return (bool) 
                    filter_var(join('@'$in), FILTER_VALIDATE_EMAIL);
                        }

                        return 
                    true;
                    }

                    $mail "foo@müller.de";

                    var_dumpvalidate_email($mail) ); 
                    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                    Kommentar


                    • #11
                      Hmm.. Danke, ja ... Die sieht aus wie eine einerlegende Wollmilchsau ab 5.3 für (zumindest) formelle checks.. und dann noch als optonaler Parameter dran die dns Sache und der Kuchen wär gegessen.
                      The string "()()" is not palindrom but the String "())(" is.

                      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                      PHP.de Wissenssammlung | Kein Support per PN

                      Kommentar


                      • #12
                        Zitat von hausl Beitrag anzeigen
                        Hmm.. Danke, ja ... Die sieht aus wie eine einerlegende Wollmilchsau ab 5.3 für (zumindest) formelle checks.. und dann noch als optonaler Parameter dran die dns Sache und der Kuchen wär gegessen.
                        Ja was allerdings fehlt ab 5.3 ist eine FILTER_VALIDATE_EMAIL-Option ala FILTER_EMAIL_AS_CONVERTED_IDN, die das gefummel selbst macht. Die Filter-Option da nachträglich einzubauen, ist wohl kaum das Problem.
                        [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                        Kommentar


                        • #13
                          Keine Ahnung, aber bringt es was, wenn man sowas direkt bei PHP "anfordert"? Lesen die dann das überhaupt? Das das wäre schon dann eine feine Sache... Gibt's da Erfahrungen mit solchen "Wünschen" gegenüber "PHP" - ich kenn nur https://bugs.php.net/ aber das als Bug aufzumachen wäre das nicht richtig
                          The string "()()" is not palindrom but the String "())(" is.

                          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                          PHP.de Wissenssammlung | Kein Support per PN

                          Kommentar


                          • #14
                            Die Bugs haben "Bug Types" unter anderem "Feature Request".
                            [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                            Kommentar


                            • #15
                              Hab das mal dort deponiert, ohne konkreten Parameter-Lösungsvorschlag, denke das kann man denen überlassen.

                              https://bugs.php.net/bug.php?id=65385

                              Habe mir erlaubt deinen Codeschnipsel dort zu posten... danke im Namen aller "E-Mail-Checker"
                              The string "()()" is not palindrom but the String "())(" is.

                              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                              PHP.de Wissenssammlung | Kein Support per PN

                              Kommentar

                              Lädt...
                              X