Маркер аутентификации 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.