ruby on rails - Rails muestra "ADVERTENCIA: no se puede verificar la autenticidad del token CSRF" desde un POST de RestKit
ruby-on-rails ios (1)
Puede eliminar las advertencias de forma segura con lo siguiente:
skip_before_filter :verify_authenticity_token
Esto debe ir a cada controlador de la API de Rails que tengas, o si tienes un base_controller
para todos los controladores de la API y luego ponerlo 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
la application_controller
ya que creará una vulnerabilidad de seguridad.
Es seguro eliminar csrf
para llamadas a la API, ya que la vulnerabilidad particular solo se puede ejecutar a través de un navegador web.
Actualización 16 de diciembre de 2013
He visto algunos enlaces a esta respuesta y algunos otros contenidos que sugieren una aclaración. Una API puede ser vulnerable a CSRF si utiliza métodos de autenticación basados en la web para autenticar la API, por ejemplo, sesiones o cookies.
Hay algunos buenos detalles en ¿Es su API web susceptible a un exploit CSRF? .
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 puede autenticarse 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, aún existe un exploit potencial, aunque es menos grave ya que requeriría que el usuario ingrese su nombre de usuario y contraseña en su sitio en el sitio. Cuadro de autenticación HTTP Auth al visitar 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 en que debes agregar :only => [:your_method]
para protección adicional, siempre que tengas controladores api aislados, tu API no se mezcle con tus respuestas web y no estés usando session o galletas. Si están en su lugar, puede agregar sin problemas el skip_before_filter
en un base_controller
para su API.
Cuando intento RestKit
POST desde RestKit
, aparece una advertencia en la consola de Rails:
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 del 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 deshacerme de la advertencia?