Teóricamente, tienes razón: la web podría haber sido diseñada de tal manera que los navegadores puedan detectar y prevenir estos ataques. Sin embargo, no fue diseñado de esa manera, y no hay una solución trivial que un navegador pueda aplicar que no rompa una gran cantidad de sitios web existentes.
Un ejemplo más simple: de forma predeterminada, ¿no se permiten las solicitudes entre sitios?
Una "solicitud entre sitios", en el contexto de CSRF, podría ser tan simple como "una etiqueta <img>
que hace referencia a una imagen alojada en otro dominio". La prevención de tales solicitudes rompería tantos sitios web que el navegador simplemente sería considerado roto por todos sus usuarios.
Es el navegador el que debe dejar de realizar solicitudes no autorizadas.
La solicitud solo es "no autorizada" en el sentido de que un usuario en particular no la solicitó. Esto, a primera vista, es un enfoque más prometedor: permitir que se realice la solicitud, pero no permita que se autentifique como la acción de un usuario en particular.
El problema aquí es que la gran mayoría de la autenticación utilizada por las aplicaciones web no es realmente visible para el navegador como autenticación; a lo sumo, el navegador sabe que el servidor ha solicitado que se le devuelvan una o más cadenas opacas ("cookies") en la próxima solicitud.
Por lo tanto, los navegadores tendrían que dejar de enviar todas las cookies en solicitudes que son "entre sitios", en el sentido de CSRF, al solicitar imágenes y otros activos para usar en una página HTML servida desde un dominio diferente; al enviar formularios dirigidos a un dominio diferente; etc.
¿Por qué los diferentes dominios (esto debería significar: diferentes partes) quieren hablar con ellos mismos a través del usuario?
Un caso de uso obvio son los sistemas de rastreo utilizados por los servicios de análisis y publicidad. Podría argumentar que estaríamos mejor si los navegadores los rompieran, pero dado que el navegador web más popular del mundo en este momento está desarrollado por una compañía que obtiene una gran parte de sus ingresos de tales servicios, es poco probable que esto suceda.
A veces, la comunicación entre servicios en el navegador realmente mejora la privacidad del usuario, si la única comunicación que puede ocurrir es en el servidor, ambos servidores deben conocer y discutir la identidad del usuario.
Si la web hubiera evolucionado teniendo en cuenta estas consideraciones de seguridad, los usos seguros del comportamiento similar a CSRF se implementarían por otros medios; pero incluso si se inventan nuevos protocolos y API ahora, es muy difícil cambiar el comportamiento predeterminado de los navegadores sin romper una gran cantidad de contenido existente.
Como tales, las funciones para proteger contra ellas, aunque sean estandarizadas, siempre serán habilitar , por lo que es necesario que el desarrollador de la aplicación realice algún trabajo para decir "No confío en la función X , así que por favor desactívelo para que no pueda ser abusado ". Cosas tales como los encabezados de la Política de seguridad de contenido y las opciones de cookies HttpOnly y SameSite son opciones opcionales. Cosas como los tokens CSRF en las formas son formas de no confiar en que el usuario tenga un navegador actualizado que implemente todas las protecciones necesarias.