http - por - ¿Los servicios web JSON son vulnerables a los ataques CSRF?
post por ajax laravel (4)
Estoy construyendo un servicio web que utiliza exclusivamente JSON para su contenido de solicitud y respuesta (es decir, sin cargas útiles codificadas).
¿Es un servicio web vulnerable al ataque CSRF si los siguientes son verdaderos?
Cualquier solicitud
POST
sin un objeto JSON de nivel superior, por ejemplo,{"foo":"bar"}
, será rechazada con un 400. Por ejemplo, una solicitudPOST
con el contenido42
sería por lo tanto rechazada.Cualquier solicitud
POST
con un tipo de contenido diferente de laapplication/json
será rechazada con un 400. Por ejemplo, una solicitudPOST
con laapplication/x-www-form-urlencoded
tipo de contenidoapplication/x-www-form-urlencoded
sería rechazada.Todas las solicitudes GET serán Safe y, por lo tanto, no modificarán ningún dato del lado del servidor.
Los clientes se autentican a través de una cookie de sesión, que el servicio web les proporciona después de que proporcionan un par de nombre de usuario / contraseña correctos a través de un POST con datos JSON, por ejemplo
{"username":"[email protected]", "password":"my password"}
.
Pregunta auxiliar: ¿Las solicitudes PUT
y DELETE
siempre vulnerables a CSRF? Lo pregunto porque parece que la mayoría (¿todos?) Los navegadores no permiten estos métodos en formularios HTML.
EDITAR: agregado elemento # 4.
EDITAR: Muchos buenos comentarios y respuestas hasta ahora, pero nadie ha ofrecido un ataque CSRF específico al cual este servicio web es vulnerable.
¿Es un servicio web vulnerable al ataque CSRF si los siguientes son verdaderos?
Sí. Todavía es HTTP.
¿Las solicitudes PUT y DELETE son siempre vulnerables a CSRF?
Sí
parece que la mayoría (¿todos?) los navegadores no permiten estos métodos en formularios HTML
¿Crees que un navegador es la única forma de hacer una solicitud HTTP?
Es posible hacer CSRF en servicios Restful basados en JSON usando Ajax. Probé esto en una aplicación (usando Chrome y Firefox). Tienes que cambiar el contentType a texto / plain y el dataType a JSON para avaoid una solicitud de verificación previa. Luego puede enviar la solicitud, pero para enviar datos de sesión, debe establecer el indicador withCredentials en su solicitud de ajax. Discuto esto con más detalle aquí (se incluyen referencias):
http://wsecblog.blogspot.be/2016/03/csrf-with-json-post-via-ajax.html
La falsificación de solicitudes CSRF arbitrarias con tipos de medios arbitrarios solo es posible con XHR, porque el método de un formulario está limitado a GET y POST, y el cuerpo de un mensaje POST de un formulario también está limitado a los tres formatos application/x-www-form-urlencoded
, multipart/form-data
, y text/plain
. Sin embargo, con la codificación de datos de formulario text/plain
aún es posible forzar solicitudes que contengan datos JSON válidos .
Entonces, la única amenaza proviene de los ataques CSRF basados en XHR. Y esos solo serán exitosos si son
- ejecutar desde el mismo origen, así que básicamente desde su propio sitio de alguna manera (por ejemplo, XSS), o
- ejecutar desde un origen diferente y su servidor permite tales solicitudes de origen cruzado .
Si puede eliminar ambos, su servicio web no es vulnerable a CSRF. Al menos no los llevados a cabo a través de un navegador web.
Tengo algunas dudas con respecto al punto 3. Aunque se puede considerar seguro ya que no altera los datos del lado del servidor, los datos aún se pueden leer, y existe el riesgo de que puedan ser robados.
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/