¿Cómo compartir el token CSRF a la aplicación cliente?

4

Tengo dos aplicaciones web diferentes. La aplicación web de servicios tiene servicios REST definidos. La aplicación web del cliente tiene páginas JSP que realizan llamadas a los servicios REST utilizando Ajax para obtener los datos y mostrarlos en la interfaz de usuario. Quiero implementar OWASP CSRF Gaurd 3 para mis servicios REST.

¿Cómo puedo obtener el valor del token CSRF en la aplicación del Cliente para que pueda pasar el valor del token a medida que los servicios de cabecera y descanso se validan y ejecutan?

Déjame decirle a mi arquitectura un poco clara. Proyecto de servicios: es un proyecto de primavera / JPA con servicios web REST definidos. Este proyecto requiere ser protegido con CSRF. Su contexto web es / Servicios. Así que la url podría estar en localhost como http://localhost:8080/Services/RESTSERVICE

Proyecto del cliente: es un proyecto JSP / Servlet con páginas web jsp / html. Este proyecto realiza llamadas AJAX a los Servicios REST del proyecto Servicios para recuperar los datos y mostrarlos en la interfaz de usuario. La URL es como http://localhost:8080/Client/index.jsp

Ahora mi duda es si implemento CSRF Guard in Services Project, el proyecto del Cliente requirió el token CSRF para llamar a los Servicios REST protegidos. ¿Cómo obtengo este valor de token en las páginas jsp de proyectos del Cliente?

Intenté agregar una cookie en la respuesta de los servicios de descanso, pero el javascript del cliente no puede leerla, por lo que no pude compartir el token con el cookie. ¿Hay algún otro enfoque? Cualquier ayuda será apreciada ...

    
pregunta MShah 08.10.2013 - 11:41
fuente

4 respuestas

2

Simplemente implemente un punto final /token que proporcione un token CSRF dada una cookie de sesión. Recuerde, mientras JS del lado del cliente en un dominio diferente no pueda recuperar y use esto para construir solicitudes (lo que más puede hacer JS del lado del cliente es enviarlo en un iframe aislado), CSRF no es posible. Permitir que la aplicación cliente obtenga el token a través de CORS si los dominios son diferentes.

    
respondido por el Manishearth 08.10.2013 - 13:41
fuente
0

Hace poco tuve que hacer esto y terminé poniendo el token CSRF en una variable javascript global. Luego, cuando hiciera mis llamadas, incluiría este token como parámetro. Dado que un atacante no podría leer ningún estado desde su navegador, debería estar seguro allí.

Ejemplo:

$.ajax({
  type: "POST",
  url: "some.php",
  data: { name: "John", location: "Boston", _csrf: _GLOBALS._csrf }
});
    
respondido por el Abe Miessler 08.10.2013 - 16:51
fuente
0

He enfrentado el mismo problema y he decidido usar "solicitudes de token únicas". Algo como esto:

  1. Introduzca la contraseña de inicio de sesión, autentíquese, autorice, cargue la página principal del proyecto
  2. Llame al método /csrf-token antes de cualquier otra solicitud, por ejemplo, durante la etapa inicial de arranque
    • El servidor genera el token y luego en algún lugar de los datos de la sesión del servidor se toma nota de que el token csrf ya se ha solicitado, por lo que todas las llamadas futuras de /csrf-token fallarán.
  3. El cliente recuerda ese token y lo usa para todas las solicitudes futuras; podría recordarse en algún espacio de nombres de javascript, por ejemplo, por lo que solo será accesible desde esa página / pestaña.

Gran inconveniente de este método: debe firmar si vuelve a cargar la página, por ejemplo.

    
respondido por el Sergey Stolyarov 17.12.2013 - 09:25
fuente
0

Agregar el token CSRF en el cliente

pom.xml:

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>js-cookie</artifactId>
    <version>2.1.0</version>
</dependency>

Importarlo en HTML:

<script type="text/javascript" src="/webjars/js-cookie/js.cookie.js"></script>

entonces podemos usar los métodos de conveniencia de Cookies en xhr:

$.ajaxSetup({
beforeSend : function(xhr, settings) {    
      xhr.setRequestHeader("X-XSRF-TOKEN",
          Cookies.get('XSRF-TOKEN'));
    }
  }
}
});

fuente: enlace

    
respondido por el gstackoverflow 28.04.2018 - 13:48
fuente

Lea otras preguntas en las etiquetas