2013-08-22 11 views
12

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.

Antwort

8

Sie können die Menschen sehen, lassen vermuten, dass CSRF für API-Anfragen kein Thema ist (es gibt keinen Zustand zu beginnen, so was gibt es sowieso kapern?), So deuten darauf hin, einige der folgenden, einfach die Warnung zu beseitigen:

Es gab jedoch einige Kommentare, dass es möglich ist, CSRF mit text/plain mit verschiedenen Flash-und Java-basierten Methoden zu verpflichten. Ich glaube, dass der Grund für den Sicherheitspatch war in einer Weile Schienen zurück: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails/

Auf jedem Fall eine gute Lösung, die für eine Authentizität Token tatsächlich überprüft ist hier zu finden: WARNING: Can't verify CSRF token authenticity rails

Es geht um Einstellung tatsächlich die Kopfzeile in Ihrer Anfrage.

Viel Glück!

Verwandte Themen