CSRFTokenValidationException bei Shopware Systemen in Verbindung mit Outlook Autodiscover

Schloss Security

Solltest Du für Deine Shopdomain auf Outlook und seine Autodiscover Funktionalität setzen, kann es sein, dass Du im Log Deines Shopware-Systems (hier in Version 5.2.2) regelmäßig folgende Exception findest:

Test

exception 'Shopware\Components\CSRFTokenValidationException' with message 'The provided X-CSRF-Token is invalid. Please go back, reload the page and try again.' in /var/www/vhosts/domain.com/httpdocs/shopware/engine/Shopware/Components/CSRFTokenValidator.php:151
Stack trace:
#0 [internal function]: Shopware\Components\CSRFTokenValidator->checkFrontendTokenValidation(Object(Enlight_Controller_ActionEventArgs))
#1 /var/www/vhosts/domain.com/httpdocs/shopware/engine/Library/Enlight/Event/Handler/Default.php(91): call_user_func(Array, Object(Enlight_Controller_ActionEventArgs))
#2 /var/www/vhosts/domain.com/httpdocs/shopware/engine/Library/Enlight/Event/EventManager.php(214): Enlight_Event_Handler_Default->execute(Object(Enlight_Controller_ActionEventArgs))
#3 /var/www/vhosts/domain.com/httpdocs/shopware/engine/Library/Enlight/Controller/Action.php(143): Enlight_Event_EventManager->notify('Enlight_Control...', Object(Enlight_Controller_ActionEventArgs))
#4 /var/www/vhosts/domain.com/httpdocs/shopware/engine/Library/Enlight/Controller/Dispatcher/Default.php(523): Enlight_Controller_Action->dispatch('indexAction')
#5 /var/www/vhosts/domain.com/httpdocs/shopware/engine/Library/Enlight/Controller/Front.php(226): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp))
#6 /var/www/vhosts/domain.com/httpdocs/shopware/engine/Shopware/Kernel.php(176): Enlight_Controller_Front->dispatch()
#7 /var/www/vhosts/domain.com/httpdocs/shopware/vendor/symfony/http-kernel/HttpCache/HttpCache.php(487): Shopware\Kernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#8 /var/www/vhosts/domain.com/httpdocs/shopware/engine/Shopware/Components/HttpCache/AppCache.php(255): Symfony\Component\HttpKernel\HttpCache\HttpCache->forward(Object(Symfony\Component\HttpFoundation\Request), true, NULL)
#9 /var/www/vhosts/domain.com/httpdocs/shopware/vendor/symfony/http-kernel/HttpCache/HttpCache.php(258): Shopware\Components\HttpCache\AppCache->forward(Object(Symfony\Component\HttpFoundation\Request), true)
#10 /var/www/vhosts/domain.com/httpdocs/shopware/vendor/symfony/http-kernel/HttpCache/HttpCache.php(275): Symfony\Component\HttpKernel\HttpCache\HttpCache->pass(Object(Symfony\Component\HttpFoundation\Request), true)
#11 /var/www/vhosts/domain.com/httpdocs/shopware/engine/Shopware/Components/HttpCache/AppCache.php(133): Symfony\Component\HttpKernel\HttpCache\HttpCache->invalidate(Object(Symfony\Component\HttpFoundation\Request), true)
#12 /var/www/vhosts/domain.com/httpdocs/shopware/vendor/symfony/http-kernel/HttpCache/HttpCache.php(206): Shopware\Components\HttpCache\AppCache->invalidate(Object(Symfony\Component\HttpFoundation\Request), true)
#13 /var/www/vhosts/domain.com/httpdocs/shopware/engine/Shopware/Components/HttpCache/AppCache.php(114): Symfony\Component\HttpKernel\HttpCache\HttpCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#14 /var/www/vhosts/domain.com/httpdocs/shopware/shopware.php(101): Shopware\Components\HttpCache\AppCache->handle(Object(Symfony\Component\HttpFoundation\Request))
#15 {main}

Diese Exception wird durch folgenden Request ausgelöst:

{
    "uri": "/autodiscover/autodiscover.xml",
    "method": "POST",
    "query": {
        "module": "frontend",
        "controller": "autodiscover",
        "action": "autodiscover.xml"
    },
    "post": []
}

Wie der Request zeigt, versucht ein Client den Controller autodiscover und die Action autodiscover.xml auszuführen. Dieser Controller und auch die Action existieren in Shopware allerdings nicht.

Die Ursache der Exception versteckt sich im Prozessablauf der Autodiscover Funktion von Outlook (Danke an @aixpro). Diese versucht nämlich den zuständigen Mailserver auf folgende Arten zu ermitteln:

  1. Service Connection Point (SCP) aus dem AD
  2. Abfrage URL https://domäne/autodiscover/autodiscover.xml
  3. Abfrage URL https://autodiscover.domäne/autodiscover/autodiscover.xml
  4. Abfrage URL http://autodiscover.domäne/autodiscover/autodiscover.xml
  5. SRV Record _autodiscover._tcp.domäne
  6. Lokale autodiscover.xml

Im zweiten Schritt ist das Problem ersichtlich: Wenn Du für Deine E-Mail Adressen die Domain shopdomain.com verwendest (z.B. [email protected]) unter der auch Dein Shop läuft (z.B. www.shopdomain.com) – was sehr häufig der Fall sein dürfte – versucht Outlook die Datei autodiscover.xml auf Deinem Server unter der Domain shopdomain.com zu finden. Dieser Request führt dann zur genannten Exception.

Lösung: Weiterleiten des Autodiscover Requests

Als Lösung bietet sich eine automatische Weiterleitung des Outlook-Client Requests an, damit dieser gar nicht erst bei der Shopware-Applikation ankommt. Das kannst Du zum Beispiel über Deine Server-Firewall machen oder über eine mod_rewrite Regel in Deiner .htaccess bzw. Webserverkonfiguration:

# Weiterleitung zu Office365 Autodiscover
Redirect /autodiscover/autodiscover.xml https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml

2 Kommentare

In diesem Beitrag kannst Du Kommentare verfassen.


  • Vielen Dank für die Zusammenfassung. Und auch danke für die Mithilfe bei der Fehlersuche.
    Hat genug Nerven gekostet das herauszufinden. 🙂

    Manuel Schefthaler 2 Jahren ago Antworten


    • Gerne – ist ja auch eine recht kuriose Sache….

      synonymous 2 Jahren ago Antworten


Kommentar verfassen

Folge mir auf Twitter

Hol Dir kostenlos Tipps und Tricks zu Shopware, E-Commerce und andere Open-Source Produkte.

Folge @synonymousrocks