Ich habe Rails App mit REST API für den Zugriff von mobilen Anwendungen entwickelt.Wie kann man sicherstellen, dass die Rails API von CSRF gesichert ist?
Es funktioniert ganz gut. Wenn sich ein Benutzer von einer mobilen Anwendung anmeldet, erhält er auth_token
, die er in seinen zukünftigen Anfragen an API verwendet. Das Problem besteht darin, dass die API auch über das Web zugänglich ist, indem Sie zu Pfad/api/v1/... gehen und sie deshalb vor CSRF geschützt werden muss.
Ich habe BaseApiController
Klasse, die von ApplicationController
erbt, die protect_from_forgery
"aktiviert" hat. Hier ist Beispiel:
class Api::V1::BaseApiController < ApplicationController
# ...
end
class ApplicationController < ActionController::Base
protect_from_forgery
# ...
end
Nun, wenn ich nicht-GET-Anfragen an meine API, mit auth_token
, mein Antrag erfolgreich abgeschlossen wird, aber in den Protokollen kann ich die berühmten WARNING: Can't verify CSRF token authenticity
sehen. Wenn ich protect_from_forgery
von meinem BaseApiController
entferne, erhalte ich keine Warnungen (offensichtlich), aber dann ist meine API anfällig für CSRF-Angriffe (Ich habe ein einfaches HTML-Formular erstellt, das die Daten zwischen Domänen erfolgreich ändert, wenn keine protect_from_forgery
vorhanden ist).
Meine Frage ist: Wie kann ich sicherstellen, dass meine API sicher bleibt, aber auch die Warnung bei Nicht-GET-Anfragen entfernen?
Hier ist eine der Lösungen, die ich gekommen bin mit, aber es sieht eher wie ein Hack, und führt eine zusätzliche DB-Abfrage:
class Api::V1::BaseApiController < ApplicationController
# ...
def verified_request?
super || User.where(authentication_token: params['auth_token']).count > 0
end
end
Mehr Informationen über das Projekt: Schienen 3.2.14, Devise, AngularJS. Der Quellcode des Projekts kann here gefunden werden.