Ich entwickle eine Rails 4-App, die eine mobile App über eine API bereitstellt und über eine Webbenutzeroberfläche für Administratoren verfügt, um die Anwendung zu verwalten. Es gibt auch ein paar Webseiten, die den Benutzern angezeigt werden (erfolgreiche E-Mail-Bestätigung und Zurücksetzen des Passworts).Korrekte Verwendung von protect_from_forgery in der Rails-App für Web und API
Ich habe zwei Sätze von Controllern erstellt: ein Satz erbt von APIController und der andere von AdminController. Beide erben von ApplicationController. Der verbleibende Controller, der für Benutzer-Webseiten verantwortlich ist, erbt ebenfalls von ApplicationController.
In Anbetracht dieses Schemas bin ich unsicher, wie CSRF-Schutz mit protect_from_forgery ordnungsgemäß implementiert werden kann. Ich habe derzeit folgendes:
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
Also meine Frage ist: ist das korrekt? Gibt es eine Möglichkeit, es zu verbessern? Ist die Überprüfung im APIController sinnlos, da alle API-Anfragen sowieso nur JSON sind?
Brakeman beschwerte sich, dass es in ApplicationController keinen protect_from_forgery-Aufruf gibt, aber vielleicht sieht er die Aufrufe in den Unterklassen nicht.
Vielen Dank im Voraus!