2012-04-16 16 views
22

Kiedy próbuję post od RestKit, jest ostrzeżenie w konsoli Rails:Rails pokazuje „UWAGA: Nie można zweryfikować autentyczności tokenu CSRF” z RestKit POST

Started POST "/friends" for 127.0.0.1 at 2012-04-16 09:58:10 +0800 
Processing by FriendsController#create as */* 
Parameters: {"friend"=>{"myself_id"=>"m001", "friend_id"=>"f001"}} 
WARNING: Can't verify CSRF token authenticity 
(0.1ms) BEGIN 
SQL (1.7ms) INSERT INTO `friends` (`friend_id`, `myself_id`) VALUES ('f001', 'm001') 
(1.1ms) COMMIT 
Redirected to http://127.0.0.1:3000/friends/8 
Completed 302 Found in 6ms (ActiveRecord: 3.0ms) 

Tutaj jest kod klienta:

NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init]; 
[attributes setObject: @"f001" forKey: @"friend_id"]; 
[attributes setObject: @"m001" forKey: @"myself_id"]; 
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObject:attributes forKey:@"friend"]; 
[[RKClient sharedClient] post:@"/friends" params:params delegate:self]; 

Jak mogę się pozbyć ostrzeżenia?

Odpowiedz

71

Można bezpiecznie usunąć ostrzeżenia z następujących czynności:

skip_before_filter :verify_authenticity_token 

ten powinien iść do każdego kontrolera Rails API, które masz, lub jeśli masz base_controller dla wszystkich kontrolerów API następnie umieścić go tam.

Jeśli możesz również uzyskać dostęp do swojej aplikacji przez przeglądarkę internetową, nie umieszczaj tej linii w numerze application_controller, ponieważ stwarzasz lukę w zabezpieczeniach.

Można bezpiecznie usunąć csrf dla wywołań API, ponieważ konkretna luka może zostać wykonana tylko przez przeglądarkę internetową.

Aktualizacja 16 grudnia 2013

Widziałem kilka linków do tej odpowiedzi i innej zawartości, co sugeruje wyjaśnienie. Interfejs API może być podatny na działanie CSRF, jeśli do uwierzytelnienia interfejsu API używa się internetowych metod uwierzytelniania - np. sesje lub pliki cookie.

Istnieje kilka dobrych szczegółów w Is your Web API susceptible to a CSRF exploit?.

Moja rada jest nadal ważna dla użytkowników RestKit, ponieważ dane uwierzytelniające użytkownika raczej nie będą oparte na sesjach lub plikach cookie, ale raczej na nazwach użytkowników lub kluczach API.

Jeśli twój interfejs API może być uwierzytelniony za pomocą sesji lub plików cookie, powinieneś unikać przeskakiwania : verify_authenticity_token i powinieneś pomyśleć o przejściu na uwierzytelnianie oparte na kluczach API.

Jeśli twój interfejs API może zostać uwierzytelniony przy użyciu nazwy użytkownika i hasła, które są również używane do uwierzytelniania w Internecie, wciąż istnieje potencjalny exploit, chociaż jest on mniej poważny, ponieważ wymagałoby wpisania nazwy użytkownika i hasła Twojej witryny w polu wyzwanie Auth protokołu HTTP podczas odwiedzania witryny z exploitem. Ponownie, dla najlepszego bezpieczeństwa powinieneś pomyśleć o przejściu do uwierzytelniania opartego na kluczach API.

Warto zauważyć, że nie zgadzam się, że trzeba dodać :only => [:your_method] dla dodatkowej ochrony, pod warunkiem, że posiadasz izolowane kontrolery APi, Twój interfejs API nie jest zmieszany z Twoimi odpowiedziami internetowymi i nie używasz sesji ani ciasteczek. Jeśli są one na miejscu, możesz bezpiecznie dodać skip_before_filter do base_controller dla swojego interfejsu API.

+30

Aby uniknąć otwierania dużej dziury, zalecam pominięcie weryfikacji tylko dla twojej metody. 'skip_before_filter: verify_authenticity_token: only => [: your_method]' –

+15

dla tych, którzy wycięli i wkleili powyższy kod: 'skip_before_filter: verify_authenticity_token,: only => [: your_method]' Marc zapomniał przecinka. Nie widzę przycisku edycji. – pjammer

+0

Dzięki za te informacje szczegółowe .. –

Powiązane problemy