ActionController::InvalidAuthenticityToken


#1

Bonjour,

Un visiteur m’a signalé qu’il n’arrivait pas à valider un formulaire.
Dans les logs j’ai ceci:

ActionController::InvalidAuthenticityToken
(ActionController::InvalidAuthenticityToken):
/vendor/rails/actionpack/lib/action_controller/
request_forgery_protection.rb:86:in verify_authenticity_token' /vendor/rails/activerecord/lib/../../activesupport/lib/ active_support/callbacks.rb:173:insend’
/vendor/rails/activerecord/lib/…/…/activesupport/lib/
active_support/callbacks.rb:173:in `evaluate_method’

Je n’ai jamais eu de problème avec ce formulaire avant. Je l’ai testé
et n’ai moi-même aucun problème avec.

Avez-vous une idée du problèmes?

Merci d’avance et meilleures salutations,
Nicolas


#2

Nicolas B. wrote:

active_support/callbacks.rb:173:in send' /vendor/rails/activerecord/lib/../../activesupport/lib/ active_support/callbacks.rb:173:inevaluate_method’

Je n’ai jamais eu de problème avec ce formulaire avant. Je l’ai testé
et n’ai moi-même aucun problème avec.

Avez-vous une idée du problèmes?

C’est dû à protect_from_forgery.

Beaucoup on ce problème. C’est limite aléatoire. Certain le désactive
tout simplement.


Cyril M.
http://blog.shingara.fr


#3

Nicolas B. wrote:

Bonjour,

Un visiteur m’a signal� qu’il n’arrivait pas � valider un formulaire.
Dans les logs j’ai ceci:

ActionController::InvalidAuthenticityToken
Bonsoir qu’utilisez-vous pour générer votre formulaire? Pouvez-vous
poster le code correspondant?

Beaucoup on ce probl�me. C’est limite al�atoire. Certain le d�sactive
tout simplement.
Ce n’est pas très malin comme solution.


#4

Le 15 déc. 08 à 20:46, Fernando P. a écrit :

poster le code correspondant?
Oui, il s’agit d’un formulaire d’inscription avec des cases à cocher,
des champs pour les coordonnées et un captcha (simple_captcha) pour
valider le tout. Apparemment c’est la seule personne à qui le
problème est arrivé (3 fois de suite). Cette même personne Ã
ensuite réussi à envoyer des infos via le formulaire de contact (qui
fonctionne de la même manière, sans les cases à cocher) sans
problème.

Voici mon code:

<% form_for(@registration_people, :url =>
inscription_path(@registration_people)) do |f| %>

Je m'inscris aux ateliers suivants

<% unless @programs.blank? %>

<%- for program in @programs -%> <%- end -%>
<%= check_box_tag('registrations[]', program.id, @registrations.include?(program.id.to_s), :id => dom_id(program)) %> <%= program.date_small %> <%= program.workshop.title %>
<% else %>

Aucun atelier disponible pour l'instant.

<% end %>

Mes coordonnées

<%= render :partial => 'registration_peoples/form', :locals => {:f => f} %>

<%= f.submit "Je m'inscris" %>

<% end %>

Le partial est un formulaire rails classique, avec au fond le code du
captcha:

  <%= show_simple_captcha :label => "Merci de saisir ci-dessous le texte de l'image", :object => 'registration_people' %>

Merci d’avance pour votre aide, car là j’avoue être un peu perdu.
Nicolas


#5

Le 16 décembre 2008 09:29, Nicolas B. a écrit :

Oui, il s’agit d’un formulaire d’inscription avec des cases à cocher,
des champs pour les coordonnées et un captcha (simple_captcha) pour
valider le tout. Apparemment c’est la seule personne à qui le
problème est arrivé (3 fois de suite). Cette même personne à
ensuite réussi à envoyer des infos via le formulaire de contact (qui
fonctionne de la même manière, sans les cases à cocher) sans
problème.

Si le formulaire A ne marche pas et le formulaire B marche, il faut
examiner attentivement les codes des deux formulaires, simplifier
les formulaires en reproduisant le bug, repérer les différences.
Vérifier les paramètres (notamment l’authenticity_token) dans
les logs. Bref, débugger.

Si déjà tu n’arrives pas à reproduire son bug, t’es mal parti.

– Jean-François.


http://twitter.com/underflow_


#6

Ok, merci pour votre aide, je vais investiguer…

Cordialement,
Nicolas

Le 16 déc. 08 à 11:48, Jean-François Trân a écrit :


#7

On 16 déc, 09:29, Nicolas B. removed_email_address@domain.invalid wrote:

problème.
Si ca marche pour toi le problème n’est pas dans ton code de
formulaire.

Le protect_from_forgery est une technique pour éviter que des
formulaires soient posté à l’insu de l’utilisateur en exploitant une
failles xss et une session persistante chez l’utilisateur (Cross
Server Request Forgery).

Ca consiste en l’ajout d’un champ hidden au formulaire qui contient
une valeur déterministe (liée à la session jusqu’à maintenant mais
dans rails edge ce n’est plus le cas). Cette valeur est soumise avec
le formulaire et vérifié coté serveur, si la valeur diffère entre
celle soumise et celle attendue l’exception
ActionController::InvalidAuthenticityToken est levée.

Il faut donc dans le cas de ton utilisateur vérifié qu’est-ce qui est
envoyé comme paramètre (en particulier si il y a le token_id) est
passé.
Plusieurs raisons pour que ca foire:

  • une erreur dans le formulaire qui fait que le hidden field
    n’apparait pas (ce qui ne doit pas être ton cas puisque ca marche avec
    toi).
  • une page qu’on a oublié de rechargé depuis longtemps et qui le
    session_id qui a changé depuis le temps parce que le user s’est logué
    ou la session a
    expirée - un mauvais support des cookies par le navigateur client
  • un problème de stabilité coté gestion des sessions qui change les
    session_id, ou carrement une desactivation des sessions
  • si tu n’est pas en CookieStore un mauvais paramétrage de la
    secret_key du protect_from_forgery qui est différente d’un controller
    à l’autre et rails se mélange les pinceaux (ca a été assez longtemps
    le cas mais plus depuis Rails2.2)

A priori je ne vois pas d’autres causes, la plus probable reste le
paramétrage de la secret key et un comportement deviant de ton client
(qui ne recharge pas ses pages et ouvrent plein d’onglet).

La solution finale étant la desactivation du protect_from_forgery, ca
n’est pas dramatique si tu es bien protégé contre le xss mais c’est
dommage.

Renaud
Feedback2.0


#8

Bonjour,

Ayant rencontré aussi ce problème il y a quelques temps, j’ai fait du
google,

qui porpose de mettre un :only sur le protect_from_forgery

ce qui donne chez moi :

protect_from_forgery :secret => “xxxxx”, :only => [:create, :destroy,
:update]

Par contre je n’avais le problème qu’aléatoirement sur le from “search”
de
la page d’accueil.


David DEMONCHY - Fusco
http://blog.fusco.dtdm.org/
removed_email_address@domain.invalid

Le 16 décembre 2008 12:58, Nicolas B. removed_email_address@domain.invalid a
écrit :