type por enviar http security csrf

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?

  1. Cualquier solicitud POST sin un objeto JSON de nivel superior, por ejemplo, {"foo":"bar"} , será rechazada con un 400. Por ejemplo, una solicitud POST con el contenido 42 sería por lo tanto rechazada.

  2. Cualquier solicitud POST con un tipo de contenido diferente de la application/json será rechazada con un 400. Por ejemplo, una solicitud POST con la application/x-www-form-urlencoded tipo de contenido application/x-www-form-urlencoded sería rechazada.

  3. Todas las solicitudes GET serán Safe y, por lo tanto, no modificarán ningún dato del lado del servidor.

  4. 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?

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

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.