Para un REST-api parece que es suficiente verificar la presencia de un encabezado personalizado para proteger contra ataques CSRF, por ejemplo. cliente envía
"X-Requested By: whatever"
y el servidor comprueba la presencia de "X-Requested-By" y descarta la solicitud si no se encuentra el encabezado. El valor del encabezado es irrelevante. Así es como funciona CsrfProtectionFilter de Jersey 1.9 y se describe en esta publicación del blog: enlace . La publicación del blog también contiene enlaces a los documentos de la NSA y Stanford que indican que el encabezado personalizado en sí es suficiente protección:
El primer método consiste en establecer encabezados personalizados para cada solicitud REST como el encabezado X-XSRF. El valor de este encabezado no importa; simplemente la presencia debe evitar los ataques CSRF. Si llega una solicitud en un punto final REST sin el encabezado personalizado entonces la solicitud debe dejarse caer.
Las solicitudes HTTP desde un navegador web se realizan a través de formulario, imagen, iframe, etc no pueden establecer encabezados HTTP personalizados. La única forma de crear un La solicitud HTTP desde un navegador con un encabezado HTTP personalizado es utilizar un Tecnología como Javascript XMLHttpRequest o Flash. Estas Las tecnologías pueden establecer encabezados HTTP personalizados, pero tienen políticas de seguridad incorporado para evitar que los sitios web se envíen solicitudes entre sí a menos que la política lo permita específicamente. Esto significa que un sitio web www.bad.com no puede enviar una solicitud a enlace con la encabezado personalizado X-XSRFHeader a menos que utilicen una tecnología como una XMLHttpRequest. Esa tecnología evitaría tal solicitud de siendo hecho a menos que el dominio bank.example.com específicamente permitido eso. Esto da como resultado un punto final REST que solo se puede llamar a través de XMLHttpRequest (o tecnología similar).
Es importante tener en cuenta que este método también evita cualquier acción directa. acceder desde un navegador web a ese punto final REST. aplicaciones web el uso de este enfoque deberá interactuar con sus puntos finales REST a través de XMLHttpRequest o tecnología similar.
Fuente: Pautas para implementar REST
Sin embargo, parece que la mayoría de los otros enfoques sugieren que debería generar un token y también validarlo en el servidor. ¿Es esto una ingeniería excesiva? ¿Cuándo sería seguro un enfoque de "presencia de" y cuándo también se requiere la validación del token?