2012-05-20 7 views
6

Mam istniejącą witrynę backendu Rails, która wywołuje json na serwerze. Teraz tworzę mobilną aplikację na iOS, aby korzystać z tego samego zaplecza i wysyłać połączenia w jsonie. Jednak wnioski komórkowych niepowodzeniem z:bezpieczeństwo bezpieczne, aby wyłączyć tokeny csrf dla wywołań Json Rails?

WARNING: Can't verify CSRF token authenticity 

wyszukiwanie wokół stackoverflow, wiele sugeruje, aby wyłączyć kontrole CSRF dla połączeń json używając coś takiego:

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

Ale moje pytanie jest, ja nie rozumiem, w jaki sposób czy to zapobiega atakom csrf w formacie json? Osoba atakująca może zawsze wysłać żądanie json do naszego punktu końcowego z ich strony. Ktoś ma wgląd w to? Nie mogłem znaleźć żadnej jasnej odpowiedzi na to pytanie.

Odpowiedz

2

co opisujesz jest bardzo łatwe do wykorzystania przy użyciu lampy błyskowej:

 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'); 

Jeśli spojrzeć na CSRF prevention cheat sheet można sprawdzić odsyłający do kierować się jej z domeny można zaufać. Jeśli referer jest pusty, może pochodzić z adresu URL https, więc należy go uznać za niepowodzenie. Poleganie na torze CSRF Ruby jest silniejszą formą ochrony CSRF.

+0

Dzięki Rook. Tak, możliwe jest złamanie połączeń json w csrf. Patrzenie na tę stronę daje mi więcej wglądu w to, kogo możemy rozwiązać. Ale czy wiesz, jak mogę wykorzystać tokeny CSRF generowane przez Railsy, ​​aby aplikacja mobilna mogła z nich korzystać i wysłać żądanie? – Anish

+0

@Anish Mógłbyś go załadować, być może mieć statyczne wywołanie, które zawsze zwraca token. – rook

+0

"możesz sprawdzić odnośnik, aby upewnić się, że pochodzi z domeny, której ufasz." Oczywiście można je łatwo sfałszować – SooDesuNe

1

Jest to poprawka dla AJAX

Get csrf_token z szyn lub za pomocą czegoś innego, z meta

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

lub

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

następnie dodać do js

$("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); 
    } 
}); 
+2

Przykład JS może być zły, ponieważ zamierzasz wstępnie skompilować swoje zasoby i nie będzie on dynamicznie odtwarzany. Tylko wskazówka. To mogłoby być naprawdę przerażające, ponieważ działałoby w fazie rozwoju, ale nie w produkcji. – StingeyB

+0

@StingeyB dzięki za komentarz :-) Dodałem komentarz do ostatniego bloku kodu instruującego użytkownika, gdzie umieścić powyższe linie. To powinno przetrwać wstępną kompilację aktywów, zgadzasz się? – Abdo

Powiązane problemy