Session Länge und CSRF Token

Tach,

wie haben das Problem, dass Fehlermeldungen erzeugt werden, wenn sich jemand in einen Newsletter einträgt. Das passiert nur dann, wenn man die Seite vor einiger Zeit geladen hatte und dann mit dieser geladenen Seite versucht sich z.B. zum Newsletter anzumelden. Das ist im moment noch nihct ganz Wasserfest, aber bisher die einige Erklärung, die ich gerade zur Hand habe, und mit der ich den Fehler bisher einmal reproduzieren konnte. Die Fehlermeldung im Frontend lautet dann  “503 Service Unavailable”. Die Error-Meldung per Mail sieht so aus:

ERROR

Message:

Shopware\Components\CSRFTokenValidationException: The provided X-CSRF-Token is invalid. Please go back, reload the page and try again. in /var/www/domain.de/public_html/engine/Shopware/Components/CSRFTokenValidator.php:161

Stack trace:

#0 /var/www/domain.de/public_html/engine/Library/Enlight/Event/Handler/Default.php(91): Shopware\Components\CSRFTokenValidator->checkFrontendTokenValidation(Object(Enlight_Controller_ActionEventArgs))

#1 /var/www/domain.de/public_html/engine/Library/Enlight/Event/EventManager.php(214): Enlight_Event_Handler_Default->execute(Object(Enlight_Controller_ActionEventArgs))

#2 /var/www/domain.de/public_html/engine/Library/Enlight/Controller/Action.php(141): Enlight_Event_EventManager->notify('Enlight_Control...', Object(Enlight_Controller_ActionEventArgs))

#3 /var/www/domain.de/public_html/engine/Library/Enlight/Controller/Dispatcher/Default.php(523): Enlight_Controller_Action->dispatch('indexAction')

#4 /var/www/domain.de/public_html/engine/Library/Enlight/Controller/Front.php(223): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp))

#5 /var/www/domain.de/public_html/engine/Shopware/Kernel.php(177): Enlight_Controller_Front->dispatch()

#6 /var/www/domain.de/public_html/vendor/symfony/http-kernel/HttpCache/HttpCache.php(487): Shopware\Kernel->handle(Object(Enlight_Controller_Request_RequestHttp), 1, true)

#7 /var/www/domain.de/public_html/engine/Shopware/Components/HttpCache/AppCache.php(255): Symfony\Component\HttpKernel\HttpCache\HttpCache->forward(Object(Symfony\Component\HttpFoundation\Request), true, NULL)

#8 /var/www/domain.de/public_html/vendor/symfony/http-kernel/HttpCache/HttpCache.php(258): Shopware\Components\HttpCache\AppCache->forward(Object(Symfony\Component\HttpFoundation\Request), true)

#9 /var/www/domain.de/public_html/vendor/symfony/http-kernel/HttpCache/HttpCache.php(275): Symfony\Component\HttpKernel\HttpCache\HttpCache->pass(Object(Symfony\Component\HttpFoundation\Request), true)

#10 /var/www/domain.de/public_html/engine/Shopware/Components/HttpCache/AppCache.php(133): Symfony\Component\HttpKernel\HttpCache\HttpCache->invalidate(Object(Symfony\Component\HttpFoundation\Request), true)

#11 /var/www/domain.de/public_html/vendor/symfony/http-kernel/HttpCache/HttpCache.php(206): Shopware\Components\HttpCache\AppCache->invalidate(Object(Symfony\Component\HttpFoundation\Request), true)

#12 /var/www/domain.de/public_html/engine/Shopware/Components/HttpCache/AppCache.php(114): Symfony\Component\HttpKernel\HttpCache\HttpCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)

#13 /var/www/domain.de/public_html/shopware.php(113): Shopware\Components\HttpCache\AppCache->handle(Object(Symfony\Component\HttpFoundation\Request))

#14 {main}

Time:

2016-10-10T15:39:36.927296+0200

Channel:

core

request:

{

    "uri": "/newsletter",

    "method": "POST",

    "query": {

        "module": "frontend",

        "controller": "newsletter",

        "action": "index"

    },

    "post": {

        "subscribeToNewsletter": "1",

        "newsletter": "email@gmx.de",

        "__csrf_token": "3HpDVKeVSdNRE29G6iycTcwNTCnmCi"

    }

}

session:

No session data available

shopId:

1

shopName:

domain

 

 

Hat das so jemand auch schon bemerkt? Für mich klingt das äußerst logisch, da ja ein Token sicherlich ablaufen wird und in der Session gespeichert wird? Kann man die Session Zeit und das Frontend so einstellen, dass sich die Seite nach Ablauf der Session einmal neu lädt?

Gruß
ellwe 

Also ein wirkliches Problem ist das nicht. Der Cookie hat die gleiche Laufzeit wie die Session. Wenn du also einen POST-Request (kein Aufruf einer Detailseite o.ä.) ausführst ohne Session/Token kommt der Fehler. Aber direkt dann wird auch ein neuer Token gesetzt. Wie lange habt ihr denn die Session Laufzeit eingestellt?

24 Minuten. Ich glaube das ist auch Standard.

Bei der Ablaufzeit des Cookies “__csrf_token-1” steht bei mir in Chrome “Beim Beenden der Browsersitzung”.

Gruß
ellwe

Ja, ich habe das Problem auch und dazu schon etliche Posts hier geschrieben. Da mir die Funktionsweise des Tokens nicht klar ist, wäre ich auf eine Zeitüberschreitung nicht gekommen.

Die Fehlermeldung kommt immer dann, wenn jemand sich für den Newsletter eintragen möchte. Gehe ich nach Erhalt der Fehlermail selbst in den Shop und gebe die Daten ein, kommt keine Fehlermeldung. Allerdings weiß ich auch nicht, ob die Kunden dann die Bestätigungsmails erhalten. Denn sie tauchen nie im Verteiler auf, also klicken offensichtlich den Bestätigungslink nicht.

Genausowenig wie die Newsletteranmeldung können die Kunden Bewerten oder ihr Passwort ändern/zurücksetzen. Fehler auch wg. Token

Ich habe zwei Shops gleichen Aufbaus und nur einer hat dieses Problem.

@Toric‍

Da ist bei dir aber grundlegender was falsch. Die Token Fehlermeldung ist ab und an in Ordnung, bspw. wenn ein Bot die Seite besucht oder wenn wie oben beschrieben die Session ausläuft. Bei den Bewertungen könnte ich mir das auch noch vorstellen, da man auf dieser Seite längere Zeit verbringt. Bei der Newsletter-Anmeldung oder anderen Formularen eher nicht. Da müsstest du schon Kunden haben die sich extrem lange mit dem Ausfüllen aufhalten - was ich nicht glaube. Um dein Problem kurzfristig zu lösen, kannst du den Token ja wie in der Dokumentation beschrieben über die config.php deaktivieren. Das sind einfach zwei Zeilen in der config.php nachtragen.

Das ist ein Sicherheitsmechanismus, der es verhindert, dass dir jemand anderes einen Link schickt und du durch anklicken eine Aktion im Shop ausführst. Genau dann soll der Token-Fehler kommen und das ist auch vollkommen korrekt. Wenn er ständig an anderen Stellen kommt, sind die Ursachen eher in folgenden Punkten zu suchen:

  • Template
  • Plugins
  • Hosting

Wenn der Shop sehr träge ist, kann es durchaus sein, dass es unter Umständen zu einer Race-Condition kommt. Das ist aber auch eher selten der Fall.

Dein Problem hat also erstmal nichts mit der Frage des Threaderstellers zu tun. Die Meldung bzgl. des CSRF-Tokens kann überall kommen. Bis auf die Meldung hat das aber überhaupt nichts gemein und auch die Ursache ist nicht zwangsweise die gleiche.

Typisch für die Meldung:

  • Kunde lässt keine Cookies zu und will sich registrieren/formular abschicken/newsletter anmelden…
  • Bot ist auf der Seite unterwegs

Genau dann ist die Meldung auch gewollt und richtig.

 

Die Session-Zeit kann man natürlich serverseitig erhöhen.
 

Zum deaktiveren des Token hat mir in einem Post schon jemand geraten. Ich weiß nicht, ob du es warst. Allerdings fand ich die nicht die richtige config.php, da gibt es ja mehrere. Ich fand den Eintrag den ich ändern sollte nicht. Inwelchem Verzeichnis muss ich suchen?

Die Fehler treten seit August auf. Am Template wurde schon seit Monaten nichts mehr verändert. Plugins sind quasi nicht vorhanden und auch keine neuen dazu gekommen. Hosting ist bei beiden Shops gleich. Das würde ich eher ausschließen.

Die Cookies hören sich interessant an. Das kann ich natürlich beim Kunden nicht nachprüfen. Bei mir sind sie zugelassen und ich bekomme zeitweise die gleiche Fehlermeldung.

Die Meldungen treten auf, seit ein Bot täglich massiv versucht, Bewertungen und Newslettereinträge zu starten. Zwei Wochen war es ganz extrem, dann kamen die Meldungen auch von Kunden.

Wenn ich den Token deaktiviere, öffne ich dem bot dann Tür und Tor?

 

LG

Im Moment kann ich das Problem nachvollziehen, indem ich das Throttling im Brwoser auf GPRS stelle. Das passiert vermutlich nur bei Besuchern, bei denen die Seite sehr langsam lädt, bzw das Javascript nicht ausgeführt wird um den Token zu holen, bevor das jeweilige Formular abgesendet wird.

Somit ist der momentane Lösungsansatz, zunächst einmal nur den Pageload zu verbessern.