Zajmuję się tworzeniem aplikacji Rails 4, która obsługuje aplikację mobilną za pośrednictwem interfejsu API i ma interfejs WWW dla administratorów do zarządzania aplikacją. Istnieje również kilka stron internetowych, które widzą użytkownicy (pomyślne potwierdzenie adresu e-mail i zresetowanie hasła).Prawidłowe użycie modułu protect_from_forgery w aplikacjach sieciowych i interfejsie API Railsy
Utworzono dwa zestawy kontrolerów: jeden zestaw dziedziczy z APIController, a drugi z AdminController. Oba te elementy dziedziczą po aplikacji ApplicationController. Pozostały kontroler odpowiedzialny za strony przeglądane przez użytkownika również dziedziczy z aplikacji ApplicationController.
Biorąc pod uwagę ten schemat, nie jestem pewien, jak prawidłowo wdrożyć ochronę CSRF za pomocą modułu protect_from_forgery. Obecnie mam następujące:
class ApplicationController < ActionController::Base
# ...
end
module API
class APIController < ApplicationController
protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }
# ...
end
end
module Admin
class AdminController < ApplicationController
protect_from_forgery with: :exception
# ...
end
end
class UsersController < ApplicationController
protect_from_forgery with: :exception
# ...
end
Moje pytanie brzmi: czy to prawda? Czy jest jakiś sposób, aby to poprawić? Czy kontrola w APIController jest bezcelowa, skoro wszystkie żądania API będą tylko JSON?
Brakeman skarżył się, że nie ma modułu protect_from_forgery w ApplicationController, ale może nie widzi wywołań w podklasach.
Z góry dziękuję!