CSRF Frontend Controller

Hallo,

ich komme nicht weiter…

Ich habe einen Frontendcontroller mit 2 Actions, welche per AJAX / Einkaufswelten Widget aufgerufen werden. Ich habe zum Test in der config.php CSRF deaktiviert und somit funktioniert es.
Mein Plan war dann den CSRF Token in den AJAX Request zu integrieren. Daran scheitere ich im Moment. In der Doku ist immer nur von Formularen die rede.
Was muss ich bei einem AJAX Request tun, wie bekomme ich den Token rein?

 $.fn.getCategoryByParentId = function(labels, labelcolor) {

        var id = $(this).val();

        return $.ajax({
            'type': "POST",
            'data': {'parentId': id, 'token': CCC},
            'url': '/test/getCategoryByParentId',
            'async': false,
            'cache': false,
            'beforeSend': function(){
                $('.ajaxBusy').show();
            }
        });

    }

Alternativ habe ich wie beschrieben versucht die Actions auf die Whitelist zu setzen. Siehe unten.
Das geht aber auch nicht.

 

Hat jemand einen Tipp?

 

Danke & Gruß
Ottscho

 

 

 

Hi Ottscho,

grundsätzlich ist das ein Automatismus über themes/Frontend/Responsive/frontend/_public/src/js/jquery.csrf-protection.js - dort werden Ajax-Requests mit den entsprechenden Tokens versehen. Hast du dein jQuery-Plugin vll. zu früh registriert, bspw. einfach im Template? So oder so könnte man da vll. weiter debuggen.

Daniel

        return $.ajax({
            'type': "POST",
            'data': {'parentId': id},
            'url': '/test/getCategoryByParentId',
            'async': false,
            'cache': false,
            'beforeSend': function(xhr){ 
                xhr.setRequestHeader('X-CSRF-Token', CSRF.getToken());
                $('.ajaxBusy').show();
            }
        });

Versuch mal den Token in den Header zu packen.

1 Like

Danke für die AW.

@daniel

Die JS Datei wird im Plugin über die Bootstrap integriert:

/**
     * Provides an ArrayCollection for js compressing
     * @param Enlight_Event_EventArgs $args
     *
     * @return ArrayCollection
     */
    public function addJavascriptFiles(\Enlight_Event_EventArgs $args)
    {

        $js = __DIR__. '/Views/frontend/_resources/javascript/test.js';

        return new ArrayCollection(array($js));

    }

 

Das JS bezieht sich auf ein Emotion Widget, welches über die Einkaufswelt geladen wird.
Evt. hängt es ja damit zusammen.

P.S. Trotzdem würde ich auch gerne wissen waurm es ncht über die Whitelist geht? Die ist ja so wie von euch in der Doku beschrieben im Controller eingebunden.

 

@ellwe

Klappt, danke.

 

Wie sieht denn dein JS File jetzt aus? Wäre bestimmt auch für andere hilfreich.  Smile (Ich frage, weil es ja wohl erstmla nicht direkt funktioniert hat, hast du etwas verändert?)

Es hat nicht funktioniert, weil ein paar Parameter nicht gesetzt wurden, da dass Script erst im TPL war.
Also dein Vorschlag war die Lösung.

@ottscho schrieb:

P.S. Trotzdem würde ich auch gerne wissen waurm es ncht über die Whitelist geht? Die ist ja so wie von euch in der Doku beschrieben im Controller eingebunden.

 

hi. du musst CSRFWhitelistAware auch implementieren. Dann sollte es auch mit der Whitlist klappen.

use Shopware\Components\CSRFWhitelistAware; 

class Shopware_Controllers_Frontend_OttTest extends Enlight_Controller_Action implements CSRFWhitelistAware{

}

 

1 Like