Es gibt gerade im Backend einige Actions die kein CSRF-Protection benötigen um diese aber dennoch ausführen zu können müsst Ihr folgende Dinge wissen…
CSRF Token
Eine Cross-Site-Request-Forgery (meist CSRF oder XSRF abgekürzt, deutsch etwa Website-übergreifende Anfragenfälschung) ist ein Angriff auf ein Computersystem, bei dem der Angreifer eine Transaktion in einer Webanwendung durchführt. (Quelle: Wikipedia)
Kurz um, es sorgt für die Sicherheit eurer Aufrufe. Ich bin vor kurzem über folgende Fehlermeldung gestoßen:
Ups! Ein Fehler ist aufgetreten! Die nachfolgenden Hinweise sollten Ihnen weiterhelfen. The provided CSRF-Token is invalid. If you're sure that the request to path "/backend/BugExport/all" should be valid, the called controller action needs to be whitelisted using the CSRFWhitelistAware interface. in engine/Shopware/Components/CSRFTokenValidator.php on line 118 Stack trace: #0 engine/Library/Enlight/Event/Handler/Default.php(91): Shopware\Components\CSRFTokenValidator->checkBackendTokenValidation(Object(Enlight_Controller_ActionEventArgs)) #1 engine/Library/Enlight/Event/EventManager.php(214): Enlight_Event_Handler_Default->execute(Object(Enlight_Controller_ActionEventArgs)) #2 engine/Library/Enlight/Controller/Action.php(142): Enlight_Event_EventManager->notify('Enlight_Control...', Object(Enlight_Controller_ActionEventArgs)) #3 engine/Library/Enlight/Controller/Dispatcher/Default.php(523): Enlight_Controller_Action->dispatch('allAction') #4 engine/Library/Enlight/Controller/Front.php(223): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp)) #5 engine/Shopware/Kernel.php(179): Enlight_Controller_Front->dispatch() #6 vendor/symfony/http-kernel/HttpCache/HttpCache.php(487): Shopware\Kernel->handle(Object(Enlight_Controller_Request_RequestHttp), 1, true) #7 engine/Shopware/Components/HttpCache/AppCache.php(255): Symfony\Component\HttpKernel\HttpCache\HttpCache->forward(Object(Symfony\Component\HttpFoundation\Request), true, NULL) #8 vendor/symfony/http-kernel/HttpCache/HttpCache.php(258): Shopware\Components\HttpCache\AppCache->forward(Object(Symfony\Component\HttpFoundation\Request), true) #9 engine/Shopware/Components/HttpCache/AppCache.php(103): Symfony\Component\HttpKernel\HttpCache\HttpCache->pass(Object(Symfony\Component\HttpFoundation\Request), true) #10 shopware.php(117): Shopware\Components\HttpCache\AppCache->handle(Object(Symfony\Component\HttpFoundation\Request)) #11 {main}
Das passierte als ich eine Action aus meinem Backendcontroller aufrufen wollte. Man kann nun einfach hergehen und diese Prüfung in der config.php abschalten:
'csrfProtection' => [ 'frontend' => true, 'backend' => false ],
aber wir möchten ja im besten Fall sauber arbeiten und lassen es daher aktiv und passen unseren Controller entsprechend an.
Controller erweitern
Als erstes binden wir die SW Komponenten CSRFWhitelistAware ein
use Shopware\Components\CSRFWhitelistAware;
danach implementieren wir das Interface mit implements CSRFWhitelistAware
class Shopware_Controllers_Backend_DeinController extends Shopware_Controllers_Backend_ExtJs implements CSRFWhitelistAware
jetzt müssen wir nur noch unsere actions (ohne Action ) als return über die Methode getWhitelistedCSRFActions() übergeben.
public function getWhitelistedCSRFActions() { return [ 'all', 'delta' ]; }
Wenn es nicht sofort greift müsst Ihr eventuell mal den Cache leeren und prüft vorab ob eure config.php passt.
Vorsicht
Wenn Ihr einen Backendcontroller anlegt und diesen von
Shopware_Controllers_Backend_Application
statt
Shopware_Controllers_Backend_ExtJs
extenden könnt Ihr auch ohne Login auf die Action zugreifen.
Ihr könnt das ganze auch mit einem Frontend Controller machen, da aber Vorsicht, das ist definitiv kritischer als das Backend. An die meisten Funktionen kommt man ja dort ohne Login nicht ran (außer wie oben beschrieben)