IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

CSRF Token invalide [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 20
    Points : 20
    Points
    20
    Par défaut CSRF Token invalide
    Bonjour à tous,

    je sais que ce problème est récurrent et j'y ai vu des solutions mais je n'arrive pas à les faire fonctionner.

    Donc comme vous avez pu le comprendre, lorsque je soumets côté client, une requête post en ajax vers le côté serveur à l'intention d'un formulaire, je me vois gratifié du message CSRF Token invalid....

    Déjà j'ai vu la solution consistant à ajouter {{form_rest etc etc dans la view du formulaire, mais je n'ai pas de vue, je n'affiche pas mon formulaire. Il me sert simplement à instancier un nouvel objet d'une entité donné afin de l'enregistrer dans ma base de données.

    Un autre élément intéressant de mon contexte de travail est le suivant : si j'ai bien compris, le CSRF Token a une durée de vie, il est délivré par le serveur. Le truc c'est que le but de mon application est que côté client elle soit entièrement chargé et le client peut travailler dessus sans nécessairement avoir de connexion avec le serveur (donc le matin il charge ce dont il a besoin), il travaille dessus toute la journée et régulièrement des tentatives d'envoi de données sont effectuées. Le problème donc est que le Token est probablement périmé au bout d'un certain moment.

    J'ai donc également essayé de re générer un nouveau token côté serveur lors de la réception de la requête client, et de le passer en paramètre de mon formulaire afin de le mettre moi même dans un champ csrf mais ça ne fonctionne pas non plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class CallType extends AbstractType
    {
        private $csrfToken;
     
     
        public function __construct($token)
        {
            $this->csrfToken = $token;
        }
     
     
     
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('csrfToken', 'csrf', array(
                    'data' => $this->csrfToken
                ))
                ->add('startDate', 'datetime', array(
                    'widget' => 'single_text',
    .......
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    /**
     * @Route("/project/survey")
     */
    class SurveyController extends Controller
    {
        /**
         * @Route("/save-answers", name="survey_saveanswers")
         * @Method({"POST"})
         * @Security("has_role('ROLE_CALLER')")
         */
        public function saveAnswersAction(Request $request)
        {     
            $csrfToken = $this->container->get('form.csrf_provider')->generateCsrfToken('authenticate');
     
            $call = new Call();
            $form = $this->createForm(new CallType($csrfToken), $call);

    Des idées ?? merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 252
    Points : 358
    Points
    358
    Par défaut
    Le plus simple ne serait t'il pas de désactiver la protection par token pour ce genre d'actions ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        public function setDefaultOptions(OptionsResolverInterface $resolver) {
            $resolver->setDefaults(array('csrf_protection' => false));
        }

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Points : 219
    Points
    219
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    * @Security("has_role('ROLE_CALLER')")
    Tu as un provider stateless ?

  4. #4
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    j'ai le même soucis, formulaire envoyé en ajax et csrf invalide.
    j'ai reçu aucune solution, personne ne sait... c'est un mystère

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    Non je ne veux surtout pas désactiver cette protection là, en revanche j'ai trouvé une solution.
    Il faut, avant d'envoyer sa requête, envoyer une première requête de demande de token, je montre pour ceux que ça intéresse :

    Dans mon js :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                $.ajax({
                    url: '/app_dev.php/project/survey/get-token',
                    type: 'GET',
                    error: function(){console.log('error');},
                    success: function(tokenResponse)
                    {
                        var token = tokenResponse.token;
    Evidemment j'ai crée une méthode exprès dans mon controller que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        /**
         * @Route("/get-token", name="survey_getsaveanswerstoken")
         * @Method("GET")
         * @Security("has_role('ROLE_CALLER')")
         */
        public function getSaveAnswersTokenAction()
        {
            $csrfProvider = $this->get('form.csrf_provider');
     
            return new JsonResponse([
                'token' => $csrfProvider->generateCsrfToken('callcollection_form'),
            ]);
        }
    Et donc dans mon js, pour ma requête à faire je rajoute le token dans le champ de mon form de la manière nomduform[_token]=leToken


    Voili Voilou

  6. #6
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    HUGH !!

    merci d'avoir posté la solution !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] "The CSRF token is invalid"
    Par keokaz dans le forum Symfony
    Réponses: 1
    Dernier message: 08/11/2012, 10h19
  2. Réponses: 5
    Dernier message: 11/10/2012, 16h01
  3. csrf token invalid
    Par blacksf dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 08/09/2012, 12h17
  4. [1.x] csrf token: Required
    Par PinGu- dans le forum Symfony
    Réponses: 8
    Dernier message: 14/01/2011, 00h08
  5. [1.x] csrf token: Required
    Par fatbob dans le forum Symfony
    Réponses: 2
    Dernier message: 23/02/2010, 20h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo