Estoy planeando usar tokens de sincronizador para la prevención CSRF, pero OWASP recomienda Comprobando las referencias y los encabezados de origen también. He estado tratando de averiguar la lógica correcta para esto, pero mis experimentos sugieren que no hay una forma válida de verificación debido a la forma en que se comporta Firefox.
Firefox no envía el encabezado de origen para las mismas solicitudes de origen, lo que habría pensado significa que debes permitir las solicitudes a través de las cuales no existe un encabezado de origen. Sin embargo, acabo de experimentar con los URI de datos y parece que Firefox tampoco envía el encabezado de origen, lo que significa que un atacante puede dirigir al usuario a un URI de datos que envía automáticamente un formulario malicioso.
Esto
data:text/html;base64,PGZvcm0gYWN0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIiBtZXRob2Q9IkdFVCI+CjxpbnB1dCB0eXBlPSJzdWJtaXQiPgo8L2Zvcm0+
es un enlace a un URI de datos que contiene un formulario que se envía a example.com.
¿Cuál es el siguiente código codificado en base64:
<form action="http://www.example.com" method="GET">
<input type="submit">
</form>
Cuando lo abro en Firefox con la consola web abierta, no se muestra el origen ni el encabezado de referencia.
¿Qué me estoy perdiendo aquí? ¿Hay alguna lógica que debería usar en el servidor que permita las solicitudes de FIrefox pero no las solicitudes maliciosas de los URI de datos?