web-dev-qa-db-fra.com

Non-concordance des jetons CSRF dans la post-demande en version 3.6

J'ai deux applications différentes de cakephp. L'un a une version 3.5 et une autre 3.6.

Quand j'ai utilisé et construit l'application 3.5, je n'ai pas eu de problème de CSRF matching in post request. Mais maintenant, comme j'utilise la version 3.6, cela me donne une erreur de jeton CSRF.

Bien que dans les deux applis AppController, le composant CSRF soit désactivé.

//$this->loadComponent('Csrf');

j'utilise une simple demande de publication comme celle-ci:

$.ajax({
        type: "POST",
        url: "../user/my_action",
        dataType: 'json',
        success: function (data) {
            set_data(data.response);
        }
    });

Qu'est-ce que je rate? ou une configuration que j'ai mal faite?

4
fat potato

Le dernier modèle d'application 3.6 utilise désormais le middleware CSRF par défaut, consultez vos applications src/Application.php fichier. Malheureusement, ce changement n'a pas été documenté correctement et a frappé les gens par surprise.

Idéalement, vous ne le désactivez pas, mais transmettez plutôt le jeton CSRF approprié à vos demandes AJAX, vous pouvez facilement obtenir le jeton à partir de l'objet de demande dans vos modèles de vue, par exemple dans la mise en page pour le rendre disponible à l'échelle mondiale:

<script>
var csrfToken = <?= json_encode($this->request->getParam('_csrfToken')) ?>;
// ...
</script>

Vous pouvez ensuite l'utiliser facilement dans vos demandes AJAX:

$.ajax({
    headers: {
        'X-CSRF-Token': csrfToken
    },
    // ...
});

Voir également

19
ndm

Ajoutez ce code sur votre appel de fonction $ .ajax ():

beforeSend: function (xhr) { // Add this line
        xhr.setRequestHeader('X-CSRF-Token', $('[name="_csrfToken"]').val());
 },  // Add this line
4
SnguyenOne

Pour CakePHP 3.8, cela a fonctionné pour moi. Dans config\routes.php commentez la ligne comme suit:

//$routes->applyMiddleware('csrf');
2
levolutionniste

j'ai eu la même erreur, sans utiliser ajax, le problème était que le thème admin n'utilisait pas cakephp 3 form helper sintax, c'était html.

après avoir changé avec Form-> create ()?> Form-> end ()?> cela a bien fonctionné

1
Stanescu Gheorghe