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

  • #16
    Zitat von hausl Beitrag anzeigen
    ... eine minimalistische Prüfung im Sinne von [irgendwas]{3,}@[irgendwas]{3,}.[irgendwas]{2,} (auf die schnelle hingetippselt)...
    Ergänzend zu dem o.a. noch.. Der vermutlich ideale Regex für die "dumme/grobe" Rahmenprüfung wäre wohl dieser:

    PHP-Code:
    function isValidEmail($mail) {
        
    // http://www.rfc-editor.org/errata_search.php?rfc=3696&eid=1690
        
    if (strlen($mail) > 256) return false;
        
    /*
          Pattern:
          ^         Anker Line-Start
          \S{1,64}  kein Whitespace - 1 bis 64 mal (local part)
          @         @-Zeichen
          \S+       kein Whitespace - mind. einmal (second level Domain)
          \.        Punkt
          \S{2,6}   kein Whitespace, 2 bis 6 mal (top level domain)
          $         Anker Line-End
          i         Modifier: case-insensitive
        */
        
    $pattern '#^\S{1,64}@\S+\.\S{2,6}$#i';
        return (bool) 
    preg_match($pattern$mail);

    Ich persönlich würde diese grobe Prüfung verwenden, wenn ich zB die Funktion idn_to_ascii() nicht zur Verfügung habe, also bevor ich eine extene idna Klasse einsetze. Das mag aber Geschmackssache sein, aber schon/eben in Hinblick auf double-opt-in denk ich mal so verkehrt kann das nicht sein.

    LG
    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


    • #17
      Das Problem wird sein, dass idn_to_ascii() die intl-Erweiterung voraussetzt, welche wiederum die ICU-Bibliothek voraussetzt. Und diese wird nun mal nicht standardmäßig mit PHP ausgeliefert. Ganz anders bei filter_var(): standardmäßig aktiviert und keine zusätzlichen Anforderungen.

      Kommentar


      • #18
        Ja das ist leider richtig.. das wäre sonst eine feine Sache..

        by the way .. momentan aktuelle Version: https://github.com/php-de/Email/blob...-validation.md

        Falls es noch input dazu gibt.. gerne... einfach bescheid geben .. danke.

        LG
        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


        • #19
          /fixed
          [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


          • #20
            Bei der Regex-Variante müssten noch Punkte iwie ausgeschlossen werden, sonst gibt das hier nämlich auch true:

            PHP-Code:
            var_dump(isValidEmail("mail@................de")); 

            Kommentar


            • #21
              Aber:

              test@sub.mail.dot.anything.example.com ist valide... Da darfst du nicht generell alle Punkte ausschliessen!
              [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

              Kommentar


              • #22
                Ja das stimmt...

                Welche Zeichen sind denn valide da?

                Kommentar


                • #23
                  In der Länge der E-Mail-Adresse? Nun, ja, der längste erlaubte Domainname ist 63 Zeichen lang, also wird die E-Mail da mindestens etwas länger sein dürfen nehme ich an.
                  [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                  Kommentar


                  • #24
                    Zitat von alxy Beitrag anzeigen
                    Ja das stimmt...
                    Welche Zeichen sind denn valide da?
                    du meinst (laut den Testdumps zumindest) die "grobe Rahmen-Regex-Prüfung". Da sind alle Zeichen ausser Whitespaces erlaubt.. damit auch die IDN Domains erlaubt sind.

                    Ich hab das Pattern mal so abgeändert, schaut soweit ganz gut aus:

                    PHP-Code:
                    function isValidEmail($mail)

                        
                    // Gesamtlänge check
                        // http://de.wikipedia.org/wiki/E-Mail-Adresse#L.C3.A4nge_der_E-Mail-Adresse  
                        
                    if (strlen($mail) > 256) {
                            return 
                    false
                        }
                        
                    $pattern '#^\S+'
                                 
                    '@'
                                 
                    '(?:[^\s.](?:[^\s.]*[^\s.])?\\.)+[^\s.](?:[^\s.]*[^\s.])?'
                                 
                    '$#i';
                        return (bool) 
                    preg_match($pattern$mail); 
                    }  

                    var_dump(isValidEmail("test@.....com"));                                 // false 
                    var_dump(isValidEmail("test@sub.mail.dot.anything.example.com"));        // true 
                    var_dump(isValidEmail("test@übärdrübär.com"));                           // true  
                    var_dump(isValidEmail("test@übärdrübär.mail.dot.anything.example.com")); // true 
                    In der Länge der E-Mail-Adresse? Nun, ja, der längste erlaubte Domainname ist 63 Zeichen lang, also wird die E-Mail da mindestens etwas länger sein dürfen nehme ich an.
                    http://de.wikipedia.org/wiki/E-Mail-...E-Mail-Adresse

                    Ich muss hier explizit dazu sagen, mir ist es tausend mal lieber bei der Validierung einige falsche Adressen durchzulassen und es dann sowieso beim Double-Opt-In hochkommt als jemanden mit einer validen Adresse auszusperren und weil die Prüfung "zu Streng ist" .. und gem den RFC sind da ja irre Dinge erlaubt - zB KOmmentare in (..) etc.. und eine Latte von Zeichen die mir noch nie unterkommen sind..

                    http://de.wikipedia.org/wiki/E-Mail-...8Local_Part.29

                    Der Lokalteil muss eine bezüglich „domain“ eindeutige Zeichenkette sein. Diese Zeichenkette darf nach RFC 2822 nur Buchstaben und Zahlen sowie bestimmte weitere Zeichen enthalten: A-Za-z0-9.!#$%&'*+-/=?^_`{|}~. Andere Zeichen, wie zum Beispiel Leerzeichen, können benutzt werden, wenn local part in doppelte Anführungsstriche eingeschlossen wird oder das Zeichen durch einen umgekehrten Schrägstrich (\) maskiert ist (z. B. ", @, :, . Kommentare können innerhalb von runden Klammern ebenfalls eingefügt werden.
                    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


                    • #25
                      PHP-Code:
                      function isValidEmail($mail)

                          return (bool) 
                      filter_var($mailFILTER_VALIDATE_EMAIL);


                      var_dump(isValidEmail("...@example.com")); // false 
                      wäre interessant nach welchen Regeln filter_var() arbeitet, müsst ich vermultich in den PHP Sourcecode.. da hab ich jetzt aber keinen Bock drauf, ...
                      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


                      • #26
                        Ein kilometerlanger Regex und Überprüfung der Länge der Zeichenkette. Kommentare werden dort nicht akzeptiert.
                        https://github.com/php/php-src/blob/...ical_filters.c
                        PHP-Code:
                        void php_filter_validate_email(PHP_INPUT_FILTER_PARAM_DECL/* {{{ */
                        {
                        /*
                        * The regex below is based on a regex by Michael Rushton.
                        * However, it is not identical. I changed it to only consider routeable
                        * addresses as valid. Michael's regex considers a@b a valid address
                        * which conflicts with section 2.3.5 of RFC 5321 which states that:
                        *
                        * Only resolvable, fully-qualified domain names (FQDNs) are permitted
                        * when domain names are used in SMTP. In other words, names that can
                        * be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed
                        * in Section 5) are permitted, as are CNAME RRs whose targets can be
                        * resolved, in turn, to MX or address RRs. Local nicknames or
                        * unqualified names MUST NOT be used.
                        *
                        * This regex does not handle comments and folding whitespace. While
                        * this is technically valid in an email address, these parts aren't
                        * actually part of the address itself.
                        *
                        * Michael's regex carries this copyright:
                        *
                        * Copyright © Michael Rushton 2009-10
                        * http://squiloople.com/
                        * Feel free to use and redistribute this code. But please keep this copyright notice.
                        *
                        */
                            
                        const char regexp[] = "/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD";

                            
                        pcre *re NULL;
                            
                        pcre_extra *pcre_extra NULL;
                            
                        int preg_options 0;
                            
                        int ovector[150]; /* Needs to be a multiple of 3 */
                            
                        int matches;


                            
                        /* The maximum length of an e-mail address is 320 octets, per RFC 2821. */
                            
                        if (Z_STRLEN_P(value) > 320) {
                                
                        RETURN_VALIDATION_FAILED
                            
                        }

                            
                        re pcre_get_compiled_regex((char *)regexp, &pcre_extra, &preg_options TSRMLS_CC);
                            if (!
                        re) {
                                
                        RETURN_VALIDATION_FAILED
                            
                        }
                            
                        matches pcre_exec(reNULLZ_STRVAL_P(value), Z_STRLEN_P(value), 00ovector3);

                            
                        /* 0 means that the vector is too small to hold all the captured substring offsets */
                            
                        if (matches 0) {
                                
                        RETURN_VALIDATION_FAILED
                            
                        }


                        Crashkurs zum Thema Rechtschreibung: [COLOR="Green"]normalerweise[/COLOR] ([COLOR="Red"]normaler weise[/COLOR] oder [COLOR="Red"]normaler weiße[/COLOR]), [COLOR="DarkGreen"]Standard[/COLOR] ([COLOR="Red"]Standart[/COLOR]), [COLOR="DarkGreen"]eben[/COLOR] ([COLOR="Red"]ebend[/COLOR])

                        Kommentar


                        • #27
                          Hier gibt es noch einige Erklärungen/Erläuterungen/Kommentare zu der in PHP verwendeten Regex: http://squiloople.com/2009/12/20/ema...ss-validation/

                          Kommentar


                          • #28
                            @ Asterix...
                            @ Train...
                            Danke für die Links, die kann ich ev. nochmals gut gebrauchen
                            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


                            • #29
                              Hmm ... is sowas ernst zu nehmen? Das wäre mir noch als halb-variante eingefallen um auch mit Unicodezeichen filter_var() "bedienen" zu können...

                              PHP-Code:
                              function isValidEmail($email)
                              {
                                  
                              // ... länge prüfen 
                                  // ...
                                  
                              $pattern '#[^0-9a-zA-Z@._-]#i';
                                  
                              $replaceTo "x";
                                  
                              $modMail preg_replace($pattern$replaceTo$email );
                                  
                              // ... ev. ersetzen von "xx" -> "x" auf grund Unicode-Ersetzung 
                                  // ...
                                  
                              return (bool)filter_var($modMailFILTER_VALIDATE_EMAIL);
                              }

                              var_dump(isValidEmail('foo@example.com'));                 // true
                              var_dump(isValidEmail('bärbel.müller@schröder.de'));       // true 
                              var_dump(isValidEmail('чебурашка@ящик-с-апельсинами.рф')); // true

                              var_dump(isValidEmail('fooexample.com'));                  // false
                              var_dump(isValidEmail('foo@.com'));                        // false
                              var_dump(isValidEmail('foo@example...com'));               // false 
                              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


                              • #30
                                Wenn man etwas replaced verändert man die ursprünglichen Daten. Da kannst du auch gleich hingehen und die addresse gegen "foo@example.org" austauschen um sie dann mit filter_var zu validieren. Ergo: Nö, Schwachsinn.
                                [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

                                Lädt...
                                X