tokens CSRF para un sistema JWT-auth usando cookies

2

Creo que tengo esto ordenado, pero me encantaría escuchar si me equivoco. Tenemos un conjunto de aplicaciones Python + Angular.js, que utilizan tokens JWT para la autenticación, donde los tokens se cifran mediante una clave secreta, la carga útil identifica al usuario y el token se almacena en el lado del cliente en una cookie configurada como HTTP SOLAMENTE y tan seguro. Por diversos motivos, esto nos funciona bien, podemos usar una aplicación de middleware wsgi de Python en múltiples backends API, nuestro token se envía automáticamente en cada solicitud al dominio y podemos omitir el uso de las sesiones por completo. He revisado esta parte aquí y en otros lugares y estoy seguro de que es bueno. (Mi pregunta está aquí: enlace )

Mi nueva pregunta es cómo manejar tokens CSRF, dado que no estamos usando sesiones en absoluto. Estoy pensando lo siguiente:

  • auth se maneja fuera del token jwt en la cookie descrita anteriormente, llamémosla accept_token_cookie. JS no puede leerlo, es HTTP SOLAMENTE. Tiene el ID de usuario.
  • se envía una segunda cookie con nuestro token CSRF, que no es HTTP_ONLY, por lo que angular puede leerlo (llamémoslo csrf_cookie)
  • csrf_cookies payload es un cifrado de nuestra carga útil de identidad (o parte de ella, como el correo electrónico del usuario), pero hecho con una segunda clave secreta
  • cuando se realiza una solicitud XHR, mi JS verá el valor csrf_cookie y lo agregará a un encabezado
  • en el ingreso, nuestro servidor decodifica ambas cookies y obtiene el token como enviado por angular en un encabezado personalizado. Si estos no coinciden todos, sabemos que esta solicitud es mala porque el javascript de solicitud no pudo leer nuestro csrf_cookie. Sin embargo, csrf_cookie todavía no se utiliza en absoluto para generar identidad, que es lo que deseamos para que la cookie accept_token permanezca totalmente opaca para el cliente.

De todas mis lecturas, lo anterior suena correcto. Si me equivoco, por favor dime por qué, gracias.

    
pregunta Iain Duncan 28.12.2016 - 23:47
fuente

1 respuesta

0
  

cuando se realiza una solicitud XHR, mi JS verá el valor csrf_cookie y lo agregará a un encabezado

Si no está utilizando CORS y está verificando este encabezado del lado del servidor, esto solo será suficiente para mitigar el CSRF.

El motivo es que los encabezados personalizados no pueden enviarse entre dominios sin CORS.

La configuración y comprobación del valor del token real ayuda aún más porque las vulnerabilidades presentes en los complementos (por ejemplo, Flash) que pueden ayudar a evitar la restricción del encabezado personalizado no pueden aprovecharse para omitir su protección.

Consulte aquí para usar encabezados personalizados como mitigación de CSRF .

Su enfoque parece una variación de la Encrypted Token Pattern . / p>     

respondido por el SilverlightFox 07.01.2017 - 19:03
fuente

Lea otras preguntas en las etiquetas