2012-04-16 12 views
22

Cuando intento post de RestKit, hay una advertencia en la consola de Rails:rieles muestra "ADVERTENCIA: No se puede verificar la autenticidad CSRF token" de una RestKit POSTAL

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) 

Aquí está el código de cliente:

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]; 

¿Cómo puedo eliminar la advertencia?

Respuesta

71

Puede quitar las advertencias con lo siguiente:

skip_before_filter :verify_authenticity_token 

Esto debe ir a cada controlador de API de Rails que usted tiene, o si tiene un base_controller para todos los controladores de la API luego lo puso allí.

Si también puede acceder a su aplicación a través de un navegador web, no coloque esta línea en el application_controller ya que creará una vulnerabilidad de seguridad.

Es seguro eliminar csrf para llamadas a API, ya que la vulnerabilidad en particular solo se puede ejecutar a través de un navegador web.

actualización decimosexta de diciembre de 2013

he visto algunos enlaces a esta respuesta y algunos otros contenidos que sugiere una aclaración. Una API puede ser vulnerable a CSRF si usa métodos de autenticación basados ​​en la web para autenticar la API, p. sesiones o cookies

Hay algunos buenos detalles en Is your Web API susceptible to a CSRF exploit?.

Mi consejo sigue siendo para los usuarios de RestKit, ya que es poco probable que las credenciales de los usuarios se basen en sesiones o cookies, sino en nombres de usuario o claves de API.

Si su API se puede autenticar con sesión o cookies, debe evitar omitir : verify_authenticity_token y debe pensar en pasar a la autenticación basada en la clave de la API.

Si su API puede ser autenticada con un nombre de usuario y contraseña que también se usa para autenticarse en la web todavía existe un exploit potencial, aunque es menos grave ya que requeriría que el usuario escriba su nombre de usuario y contraseña para su sitio en el cuadro de desafío HTTP Auth mientras visita el sitio con el exploit. De nuevo, para la mejor seguridad, debe pensar en pasar a la autenticación basada en la clave de la API.

Vale la pena señalar que no estoy de acuerdo con que necesite agregar :only => [:your_method] para protección adicional, siempre que tenga controladores api aislados, su API no esté mezclada con sus respuestas web y no esté utilizando sesión o cookies. Si están en su lugar, puede agregar de manera segura skip_before_filter en un base_controller para su api.

+30

Para evitar abrir un gran agujero, le recomiendo que elimine la verificación solo por su método. 'skip_before_filter: verify_authenticity_token: only => [: your_method]' –

+15

para aquellos que cortan y pegan el código anterior: 'skip_before_filter: verify_authenticity_token,: only => [: your_method]' Marc olvidó una coma. No veo un botón de edición. – pjammer

+0

Gracias por esta información detallada ... –

Cuestiones relacionadas