2010-11-06 5 views
6

Rails sembra ignorare i token di autenticità per le richieste AJAX. Ad esempio, ho modificato di proposito la mia chiamata AJAX per testarla con un token non valido e le richieste sembrano passare normalmente.Rails 3 Token autenticità richiesta AJAX ignorato

L'applicazione ha la configurazione predefinita per utilizzare il cookie di sessione e ha la chiamata protect_from_forgery in ApplicationController.

Qualche idea di cos'altro potrei mancare?

risposta

7

EDIT >> Ho postato questa risposta in un post sul blog, così: http://zadasnotes.blogspot.com/2010/11/rails-3-forgery-csrf-protection-for.html

EDIT 2 >> Questo è stato cambiato in Rails 3.0.4. Vedere follow-up post qui: http://zadasnotes.blogspot.com/2011/02/rails-forgery-csrf-protection-for-ajax.html

Dopo la ricerca per un po ', ho deciso di scavare un po' nella documentazione del codice rotaie per scoprirlo.

partire qui: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html#method-i-form_authenticity_token

protect_from_forgery aggiunge un before_filter su verify_authenticity_token che riportiamo di seguito:

# File actionpack/lib/action_controller/metal/request_forgery_protection.rb, line 95 
95:  def verify_authenticity_token 
96:   verified_request? || raise(ActionController::InvalidAuthenticityToken) 
97:  end 

E il verified_request? viene mostrato qui:

# File actionpack/lib/action_controller/metal/request_forgery_protection.rb, line 
104:  def verified_request? 
105:   !protect_against_forgery? || request.forgery_whitelisted? || 
106:   form_authenticity_token == params[request_forgery_protection_token] 
107:  end 

Infine request.forgery_whitelisted?:

# File actionpack/lib/action_dispatch/http/request.rb, line 126 
126:  def forgery_whitelisted? 
127:  get? || xhr? || content_mime_type.nil? || !content_mime_type.verify_request? 
128:  end 

Avviso XHR?. xmlHttpRequest è nella whitelist e non si trova nella lista protect_from_forgery. Quindi sembra che questo sia di design.

Dopo aver cercato ulteriormente su xmlHttpRequests, sembra che ci siano delle restrizioni per eseguirli su domini, il che rende superfluo applicare il controllo csrf su xhr.

+1

Questo è cambiato da Rails 3.0.4 - ora anche le richieste AJAX devono fornire il token. Vedi [questo commit] (https://github.com/rails/rails/commit/ae19e4141f27f80013c11e8b1da68e5c52c779ea) – jamuraa

+0

@jamuraa Grazie per averlo fatto notare. Ho avuto un post sul blog di follow-up riguardo a questo qui: http://zadasnotes.blogspot.com/2011/02/rails-forgery-csrf-protection-for-ajax.html – zzawaideh

+3

nessuno dei collegamenti precedenti per zadasnotes.blogspot.com lavoro.... –