Маркер подлинности запроса AJAX в Rails 3 игнорируется - PullRequest
6 голосов
/ 06 ноября 2010

Rails, похоже, игнорирует токены аутентификации для запросов AJAX. Например, я специально изменил свой вызов AJAX, чтобы проверить это с недопустимым токеном, и запросы, кажется, проходят нормально.

Приложение имеет конфигурацию по умолчанию для использования хранилища cookie сеанса и имеет вызов protect_from_forgery в ApplicationController.

Есть идеи, что еще мне не хватало?

1 Ответ

7 голосов
/ 09 ноября 2010

РЕДАКТИРОВАТЬ >> Я также опубликовал этот ответ в блоге: http://zadasnotes.blogspot.com/2010/11/rails-3-forgery-csrf-protection-for.html

РЕДАКТИРОВАТЬ 2 >> Это было изменено в Rails 3.0.4.См. Следующий пост здесь: http://zadasnotes.blogspot.com/2011/02/rails-forgery-csrf-protection-for-ajax.html

После некоторого изучения я решил немного покопаться в документации кода rails, чтобы узнать.

Начиная здесь: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html#method-i-form_authenticity_token

protect_from_forgery добавляет before_filter на verify_authenticity_token , который показан ниже:

# 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

И Verified_request? показано здесь:

# 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

Наконец 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

Обратите внимание xhr? .xmlHttpRequest занесен в белый список и отсутствует в списке protect_from_forgery.Так что получается, что это по замыслу.

После дальнейшего изучения запросов xmlHttpRequests выясняется, что существуют ограничения на их запуск в доменах, что делает ненужным применение проверки csrf на xhr.

...