Маркер аутентификации AJAX-запроса Rails 3 игнорируется

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

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

Любые идеи, что еще я мог пропустить?

1 ответ

Решение

РЕДАКТИРОВАТЬ >> Я также опубликовал этот ответ в блоге: 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 code, чтобы узнать.

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

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

И проверенный запрос? показано здесь:

# 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.

Другие вопросы по тегам