Shopware Backend 101 | CSRF Whitelisting

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)

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert