2012-06-25 5 views
5

Ich weiß, Schienen bereitgestellt CSRF-Schutz standardmäßig von Rails3. aber meine Webanwendung ist eine einzelne Seite Anwendung, und die gesamte Kommunikation hängt von Ajax ab.Wie CSRF-Token mit Rails3.2.x, vor dem Senden erholsamer POST/PUT API, ohne Formular/UI von Server-Seite?

Also, wie kann ich CSRF-Token vom Server vor jedem Ajax aufrufen? oder was ich tun kann ist nur CSRF Schutz, richtig?

Hinweis: wir verwenden Sie keine Schienen sehen die Web-Seite zu erzeugen, auch die Homepage, so die Lösung put "<% = csrf_meta_tag%>" in .html oder .erb ist ungültig wir. Verwenden Sie JavaScript Framework auf einer Seite.

mein env: rails3.2.3, devise2.0.4, dojo1.7.2

Antwort

4

Ich würde Ihnen empfehlen einen Blick auf das Rails-backbone Projekt zu übernehmen. Insbesondere die Datei backbone_rails_sync.js.

Es zeigt, wie dieses Gem die CSRF-Token-Daten zusammen mit einer beliebigen Ajax-Anfrage an den Server sendet.

Hier sind auch einige docs by the Django project, die Ihnen ein Beispiel geben, wie Sie die standardmäßige jQuery ajax() - Methode überschreiben, um immer ein CSRF-Token zu senden.

basierend auf Kommentar aktualisiert:

Also, was Sie wo zu fragen ist, wie CSRF zu implementieren, wenn nichts anderes als ein REST-API und keine Verwendung von Ansichten/Formulare in irgendeiner Weise verwendet werden.

Die Antwort lautet: nicht enthalten CSRF-Schutz.

Cross-site request forgery ist eine Möglichkeit, bei der eine andere (bösartige) Website eine Anforderung reproduziert oder imitiert und sich als gültiger Benutzer beim Senden ungültiger Daten an den Server verhält.

Dies ist nur ein Problem, wenn ein Benutzer authentifizieren muss und der Authentifizierungsstatus im Cache gespeichert wird (um zwischen den Seitenaufrufen zu bestehen). Wenn eine bösartige Website diesen Cache entführt, kann sie Daten übermitteln, während sie vorgibt, dieser Benutzer zu sein, ohne dass der Benutzer und der Server dies jemals bemerken. Dies ist, was CSRF-Schutz beauftragt wird, es fügt eine spezielle Zeichenfolge in das Formular, die nur für diese bestimmte Anfrage und ist einzigartig für jede andere Anfrage, so dass selbst wenn die Sitzung entführt wird, verhindert der CSRF-Schutz jede Änderung an der Server.

In Ihrem Fall jedoch verwenden Sie HTTP-API-Aufrufe und müssen daher Ihre Authentifizierung jede Anfrage über die Verwendung der Authorization header senden. Auf diese Weise werden die Anmeldeinformationen niemals zwischengespeichert und können nicht entführt werden. Daher ist kein CSRF-Schutz erforderlich.

Es gibt jedoch auch andere Möglichkeiten, um Ihre RESTful API ist sicher zu stellen Sie sicher:

  • Immer Daten senden über den Draht in verschlüsselter Form (https/ssl)
  • Verwenden Sie eine gute Authentifizierungsmethode wie oAuth (2), API Tokens oder Basic HTTP Authentication (die letzten beiden sind weniger sicher, aber immer noch sicher genug für kleinere Anwendungen)
  • Überprüfen Sie immer alle Werte in Ihrer Anwendung, bevor Sie auf sie reagieren
+0

danke für ihre information. Aber vielleicht ein Missverständnis. – qwert

+0

danke für Ihre Information. Aber vielleicht ein Missverständnis. Eigentlich möchte ich wissen, wie man den csrf-Token bekommt, wenn ich nur eine Ajax-Anfrage sende?
Ich habe einige Posts gelesen, die sagen "<% = csrf_meta_tag%> " im Layout von .html oder .erb. Aber mein Client verwendet nur die restliche API, also kein Formular/UI von der Serverseite vor dem Senden einer AJAX-Anfrage, daher ist die obige Lösung ungültig. Kann ich eine spezielle Ajax-Anfrage an den Server senden, um zuerst das CSRF-Token zu erhalten und dann eine Ajax-Anfrage mit diesem CSRF zu senden? Oder andere Lösungen? – qwert

+0

Ich habe meine Antwort basierend auf Ihrem Kommentar aktualisiert. Kurzum: Sie brauchen in Ihrem Fall keinen CSRF-Schutz. – JeanMertz