57 votes

Rails - Comment ajouter une protection CSRF aux formulaires créés en javascript ?

J'utilise backbone.js et cela fonctionne très bien. mais les formulaires que je crée en tant que modèle javascript n'ont pas le jeton de protection rails csrf. Comment l'ajouter aux modèles que je crée en javascript ?

87voto

lucianosousa Points 1947

La meilleure façon de résoudre ce problème, à l'intérieur du formulaire :

 <%= hidden_field_tag :authenticity_token, form_authenticity_token %>

Mettre à jour:

Il semble que le form_authenticity_token soit privé pour les contrôleurs dans les nouvelles versions de rails.

Si c'est le cas pour vous, ce que je suggère c'est : déclarer une variable dans un contrôleur comme : @form_token = form_authenticity_token et utilisez-le dans la vue que vous recherchez.

38voto

Thong Kuah Points 1548

Si vous avez <%= csrf_meta_tag %> dans votre mise en page quelque part et qui vous est accessible depuis le js, vous pouvez y accéder en utilisant $('meta[name="csrf-token"]')

Voir http://eunikorn.blogspot.com/2011/07/working-with-backbonejs-in-harmony-with.html pour une idée sur la façon de pirater le support csrf dans chaque demande de backbone

7voto

Jack Zelig Points 2011

J'ai un formulaire dans un composant Vue dans une application Rails 6.

À ma grande surprise, il suffisait d'inclure une entrée masquée avec le nom authenticity_token dans le modèle Vue et lors du chargement de la page, Rails a rempli la valeur avec un jeton de protection CSRF.

Par exemple

 <template>
  <div id="app">
    <form
      action="/submit"
      method="post"
      @submit.prevent="onSubmit"
    >
      <input
        type="hidden"
        name="authenticity_token"
        value=""
      >
      <!-- rest of form -->
    </form>
  </div>
</template>

Ce qui est rendu comme :

 <div id="app">
  <form action="/submit" method="post">
    <input type="hidden" name="authenticity_token" value="zl9PJiE...">
    ...
  </form>
</div>

4voto

suga_shane Points 352

Vous pouvez ajouter le jeton csrf à chaque formulaire qui utilise 'post' ou 'delete'. Le voici en coffeescript :

 $ -> 
  for f in $("form")
    if f.method == 'post' or f.method == 'delete'
      $(f).prepend("<input type='hidden' name='authenticity_token' value='" + token + "'>")

Assurez-vous d'avoir <%= csrf_meta_tags %> dans votre mise en page. Il devrait déjà être dans la mise en page "application" standard, mais ajoutez-le si vous utilisez une mise en page différente.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X