basti_p: Timeout bei preg_match

Hallo,

bei einem Bekannten streikt der Onlineshop, genauer gesagt, die Benutzerregistrierung- und anmeldung.

Ich habe das Problem auf den Swiftmailer eingrenzen können; dieser wirft nach dem Versuch, die Mailadresse nach RFC 2822 zu validieren, einen Timeout-Error (Fatal error:  Maximum execution time of 30 seconds exceeded in ...).

Die betroffenen Zeile:

if (!preg_match('/^'.$this->getGrammar()->getDefinition('addr-spec').'$/D',   $address)) {...}

Der regex ist knapp 3000 Zeichen lang und sieht so aus:

/^(?:(?:(?:(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))|(?:(?:[ \t](?:\r\n))?[ \t])))?(?:[a-zA-Z0-9!#$%&'*+-/=?^\{\}\|~]+(\.[a-zA-Z0-9!#\$%&'\*\+\-\/=\?\^_{}|~]+))+(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))|(?:(?:[ \t](?:\r\n))?[ \t])))?)|(?:(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))|(?:(?:[ \t](?:\r\n))?[ \t])))?"((?:(?:[ \t](?:\r\n))?[ \t])?(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21\x23-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])))(?:(?:[ \t](?:\r\n))?[ \t])?"(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))|(?:(?:[ \t](?:\r\n))?[ \t])))?))@(?:(?:(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))|(?:(?:[ \t](?:\r\n))?[ \t])))?(?:[a-zA-Z0-9!#$%&'*+-/=?^\{\}\|~]+(\.[a-zA-Z0-9!#\$%&'\*\+\-\/=\?\^_{}|~]+))+(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))|(?:(?:[ \t](?:\r\n))?[ \t])))?)|(?:(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))|(?:(?:[ \t](?:\r\n))?[ \t])))?[((?:(?:[ \t](?:\r\n))?[ \t])?(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x5A\x5E-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])))?(?:(?:[ \t](?:\r\n))?[ \t])?](?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))(?:(?:(?:(?:[ \t](?:\r\n))?[ \t])?(((?:(?:(?:[ \t](?:\r\n))?[ \t])|(?:(?:[\x01-\x08\x0B\x0C\x0E-\x19\x7F]|[\x21-\x27\x2A-\x5B\x5D-\x7E])|(?:\[\x00-\x08\x0B\x0C\x0E-\x7F])|(?1)))(?:(?:[ \t](?:\r\n))?[ \t])?)))|(?:(?:[ \t](?:\r\n))?[ \t])))?)))$/D

Kann es sein, dass der preg_match-Vergleich über 30 Sekunden dauert=

Vielen Dank, Grüße Basti

  1. Tach!

    Ich habe das Problem auf den Swiftmailer eingrenzen können; dieser wirft nach dem Versuch, die Mailadresse nach RFC 2822 zu validieren, einen Timeout-Error (Fatal error:  Maximum execution time of 30 seconds exceeded in ...). Der regex ist knapp 3000 Zeichen lang und sieht so aus:

    Was für eine Verschwendung an Energie, diesen Ausdruck zu erstellen. Und dann funktioniert er prinzipbedingt nichtmal. Was nützt es denn, wenn eine Adresse syntaktisch superkorrekt ist, und trotzdem kein Postfach dazu existiert? Erwarte jetzt bitte nicht, dass sich irgendjemand die Mühe macht, den Ausdruck zu analysieren und auf Fehler zu untersuchen. Tausch das lieber mal aus gegen das da:

    if (filter_var($address, FILTER_VALIDATE_EMAIL)) {...}

    dedlfix.

    1. Tausch das lieber mal aus gegen das da:

      if (filter_var($address, FILTER_VALIDATE_EMAIL)) {...}

      Wenn du dir alleine schon den ersten und zweiten Kommentar dazu durchliest, möchtest du diesen Scheiss auch nicht mehr benutzen.

    2. Hallo dedlfix,

      Was für eine Verschwendung an Energie, diesen Ausdruck zu erstellen. Und dann funktioniert er prinzipbedingt nichtmal. Was nützt es denn, wenn eine Adresse syntaktisch superkorrekt ist, und trotzdem kein Postfach dazu existiert? Erwarte jetzt bitte nicht, dass sich irgendjemand die Mühe macht, den Ausdruck zu analysieren und auf Fehler zu untersuchen.

      Ganz Deiner Meinung; die Ausdrücke sind in der genannten Mailer-Library http://swiftmailer.org/ definiert und nicht auf meinem Mist gewachsen.

      Ich habe weitergetestet: wenn ich den genannten Regex auf meinem XAMPP teste, gibt es keine Probleme; wenn er auf dem Webserver aufgerufen wird (ich habe den Code nachgebaut, andere Funktionen spielen also keine Rolle), gibt es den erwähnten Timeout-Error. Auf dem Webserver läuft PHP 5.2.17 mit Suhosin-Patch als Apache-Modul - evtl. liegt es daran.

      Vielen Dank, Grüße Basti

      1. Tach!

        Auf dem Webserver läuft PHP 5.2.17 mit Suhosin-Patch als Apache-Modul - evtl. liegt es daran.

        Über diese Version müssen wir nicht weiter diskutieren, die ist bereits seit 4 Jahren tot.

        dedlfix.

        1. Hallo,

          Über diese Version müssen wir nicht weiter diskutieren, die ist bereits seit 4 Jahren tot.

          Ich habe die PHP-Version auf 5.6 CGI umgestellt und siehe da: alles OK!

          Viele Grüße Basti

  2. Ich habe das Problem auf den Swiftmailer eingrenzen können; dieser wirft nach dem Versuch, die Mailadresse nach RFC 2822 zu validieren, einen Timeout-Error (Fatal error:  Maximum execution time of 30 seconds exceeded in ...).

    Der regex ist knapp 3000 Zeichen lang und sieht so aus:

    Kann es sein, dass der preg_match-Vergleich über 30 Sekunden dauert=

    Wenn PHP sagt, dass die Funktion länger als eine halbe Minute läuft, dann wird das wohl so sein, angesichts des Umfangs ist das zumindest auch denkbar. Noch weitaus denkbarer ist es, dass das Muster Fehler enthält, denn, mal ehrlich: Hältst du das für übersichtlich? Hättest du Lust, es auf Korrektheit zu prüfen? Sicher nicht.

    Hinzu kommt, dass es vergebene Liebesmüh' ist, eine Mailadresse auf mehr zu prüfen, als dass sie ein Zeichen, gefolgt von einem Klammeraffen und hintendran einen Punkt mit was davor und was dahinter enthält. Die meisten Fehler, das sind vergessene Zeichen und Zeichendreher, passen so gut wie immer in die seitens der Technik vorgebenene Schablone.

    Der Aufstand, den dieser Mailer da veranstaltet, ist dementsprechend hanebüchen, das ist Technokraten-Schwachsinn. Sowas macht mehr kaputt, als dass es irgendwem hilft.

    Sicher ist alleine eine Bestätigungsmail.

    1. Om nah hoo pez nyeetz, Mattes!

      Sicher ist alleine eine Bestätigungsmail.

      Und auch die nicht.

      Matthias

      --
      Das einzig sichere Anzeichen für eine Schwangerschaft ist die Geburt. http://www.billiger-im-urlaub.de/kreis_sw.gif
      1. Sicher ist alleine eine Bestätigungsmail.

        Und auch die nicht.

        Wenn man unter Bestätigungsmail versteht, dass die Mail mit Einmalcode und Passwort bestätigt werden muss, möchte ich meinen, dass man davon ausgehen darf, dass die Adresse tatsächlich zu demjenigen gehört, der das Konto einrichten möchte.

        1. Moin Mattes,

          Sicher ist alleine eine Bestätigungsmail.

          Und auch die nicht.

          Wenn man unter Bestätigungsmail versteht, dass die Mail mit Einmalcode und Passwort bestätigt werden muss, möchte ich meinen, dass man davon ausgehen darf, dass die Adresse tatsächlich zu demjenigen gehört, der das Konto einrichten möchte.

          https://www.byom.de/

          LG,  CK

          1. Wenn man unter Bestätigungsmail versteht, dass die Mail mit Einmalcode und Passwort bestätigt werden muss, möchte ich meinen, dass man davon ausgehen darf, dass die Adresse tatsächlich zu demjenigen gehört, der das Konto einrichten möchte.

            [Wegwerfadressen]

            Bei der Adressprüfung per Muster geht es darum, dass der Benutzer seinen Wunsch erfüllt bekommt, per Mail erreichbar zu sein. Da dies per Musterprüfung nicht sicher möglich ist, muss eine praktische Prüfung her.

            Dass er möglicherweise nicht erreichbar sein will (oder noch öfter: nicht erreichbar sein muss), ist eine gänzlich andere Geschichte, die mit der Frage hier nix zu tun hat.

            1. Moin Mattes,

              Wenn man unter Bestätigungsmail versteht, dass die Mail mit Einmalcode und Passwort bestätigt werden muss, möchte ich meinen, dass man davon ausgehen darf, dass die Adresse tatsächlich zu demjenigen gehört, der das Konto einrichten möchte.

              [Wegwerfadressen]

              Bei der Adressprüfung per Muster geht es darum, dass der Benutzer seinen Wunsch erfüllt bekommt, per Mail erreichbar zu sein.

              Eigentlich geht es idR darum, dass das System den Nutzer erreichen kann. Der Nutzer hat oft kein grosses Interesse daran, die Betreiber dagegen schon (Stichwort Passwort-Reset). Das ist meistens auch im Interesse der Nutzer, aber das sehen die halt durchaus auch schonmal anders.

              Dass er möglicherweise nicht erreichbar sein will (oder noch öfter: nicht erreichbar sein muss), ist eine gänzlich andere Geschichte, die mit der Frage hier nix zu tun hat.

              Hat natürlich nichts mit der Fragestellung zu tun, aber deine These aus dem Vorposting ist halt damit widerlegt ;)

              LG,  CK

              1. deine These aus dem Vorposting ist halt damit widerlegt ;)

                Folgen mag ich deiner verqueren Argumentationskette zwar nicht, aber wenn es dich glücklich macht, dann sei es halt so.

                1. Moin Mattes,

                  deine These aus dem Vorposting ist halt damit widerlegt ;)

                  Folgen mag ich deiner verqueren Argumentationskette zwar nicht, aber wenn es dich glücklich macht, dann sei es halt so.

                  Es geht ja nicht um „glücklich machen.“ Es geht mir nicht darum recht zu haben - mir geht es um Erkenntnisgewinn. Möglichst auf beiden Seiten.

                  LG,  CK