Sé que hay una gran cantidad de defensas contra los ataques CSRF. Sin embargo, CSRF es estrictamente una vulnerabilidad del navegador, y cualquier solicitud que provenga de un navegador que no sea el navegador se "permite" (y con razón) se permite.
Pero ... ¿cómo saber si una solicitud es de un navegador o no? Por lo que puedo decir, la única forma es examinando el encabezado de agente de usuario .
Todo esto está muy bien, pero, a diferencia de los encabezados Origin y Referer, el encabezado user-agent puede ser modificado programáticamente :
Nota: el encabezado User-Agent ya no está prohibido, según las especificaciones, consulte lista de nombres de encabezados prohibidos (esto se implementó en Firefox 43,) así que ahora se puede configurar en un objeto Fetch Headers, a través de XHR setRequestHeader (), etc.
Oops.
¿Hay alguna otra forma de determinar si una solicitud proviene de un navegador? O, para defenderte de los ataques CSRF, ¿estás condenado a bloquear también todas las solicitudes que no sean del navegador?