2012-05-20 5 views
6

Ich habe eine bestehende Rails Backend-Website, die json Anrufe zum Server macht. Jetzt entwickle ich eine mobile iOS-App, um dasselbe Backend zu verwenden und Anrufe in JSON zu senden. Allerdings mobile Anforderungen mit versagen:sicherheits-safe csrf tokens für json rails anrufe deaktivieren?

WARNING: Can't verify CSRF token authenticity 

um Stackoverflow Suchen, schlugen viele csrf Kontrollen für json Anrufe zu deaktivieren, indem Sie so etwas wie dies mit:

# Or this in your application_controller.rb 
def verified_request? 
    if request.content_type == "application/json" 
    true 
    else 
    super() 
    end 
end 

Aber meine Frage ist, ich verstehe nicht, wie Verhindert dies CSRF-Angriffe im JSON-Format? Angreifer können von ihrer Site aus immer eine JSON-Anfrage an unseren Endpunkt senden. Hat jemand Einblick in das? Ich konnte darauf keine klare Antwort finden.

Antwort

2

Was Sie beschreiben, ist sehr einfach mit Flash zu nutzen:

 var request:URLRequest = new URLRequest("http://stackoverflow.com"); 
     request.requestHeaders.push(new URLRequestHeader('Content-Type', 'application/json'));  
     request.data = unescape('{"a":1,"b":{"c":3}}'); 
     request.method = URLRequestMethod.POST; 
     navigateToURL(request, '_blank'); 

Wenn Sie auf der Suche CSRF prevention cheat sheet Sie den Referer, um sicherzustellen, überprüfen seine aus einer Domain, die Sie vertrauen. Wenn der Referer leer ist, könnte er von einer https-URL stammen, was als Fehler betrachtet werden sollte. Sich auf das CSRF-Token von Ruby zu verlassen, ist eine stärkere Form eines CSRF-Schutzes.

+0

Dank Turm. Ja, es ist möglich, JSON-Aufrufe in csrf zu knacken. Wenn ich auf diese Seite schaue, kann ich mehr darüber erfahren, wer das lösen kann. Aber wissen Sie, wie ich die von Rails generierten CSRF-Tokens verwenden kann, damit eine mobile App sie verwenden und die Anfrage senden kann? – Anish

+0

@Anish Sie könnten es booten, vielleicht haben Sie einen statischen Anruf, der immer das Token zurückgibt. – rook

+0

"Sie können den Referer überprüfen, um sicherzustellen, dass er von einer Domain stammt, der Sie vertrauen." Natürlich können diese leicht gefälscht werden – SooDesuNe

1

Dies ist ein Update für Ajax

Get csrf_token von Schienen oder wenn etwas anderes, von meta

// js file 
var csrf_token = $('meta[name=csrf-token]').attr('content'); 

oder

//js.erb file 
var csrf_token = "<%= request.session["<%= _csrf_token %>"] %>"; 
mit

dann fügen Sie diese

$("body").bind("ajaxSend", function(elm, xhr, s){ 
    if (s.type == "POST") { 
    // place lines mentioned above here 
    // line goes here... 
    xhr.setRequestHeader('X-CSRF-Token', csrf_token); 
    } 
}); 
js
+2

Das JS-Beispiel könnte schlecht sein, weil Sie Ihre Assets vorkompilieren und diese nicht dynamisch neu generiert werden. Nur ein Hinweis. Das könnte wirklich beängstigend sein, weil es in der Entwicklung funktionieren würde, aber nicht in der Produktion. – StingeyB

+0

@StingeyB danke für deinen Kommentar :-) Ich habe einen Kommentar zum letzten Codeblock hinzugefügt, der den Benutzer anweist, wo die oben genannten Zeilen zu platzieren sind. Dies sollte Asset-Vorkompilierung überleben, einverstanden? – Abdo