No estoy seguro de estar de acuerdo con la premisa de que verificar la referencia y los encabezados de origen es la mejor defensa. En unos pocos casos de esquina, ambos encabezados faltarán. En estos casos, la única opción segura es bloquear la solicitud, lo que podría afectar la funcionalidad de algunos usuarios legítimos.
Si esta sigue siendo la ruta que desea tomar, :
- Comience con el encabezado de origen y, si falta, use el encabezado de referencia.
- Nuevamente, si ninguno de estos está presente, debes bloquear.
- La comparación de URL: s puede parecer simple, pero en realidad es una cosa muy difícil de hacer. Asegúrese de que su comparación sea sólida, y por ejemplo ese
good.com.evil.com
no pasa como good.com
. Eso es solo un ejemplo, estoy seguro de que hay más escollos por ahí. Preferiblemente, debería usar una buena biblioteca bien probada para esta tarea.
- Probablemente sea bueno verificar que el esquema sea
http://
o https://
. No estoy seguro de si hay algún ataque que pueda usarse si no se realiza esta comprobación, pero Dios sabe qué trucos inteligentes hay con URI de datos o no.
Si desea otras opciones, considere los clásicos como los tokens anti-CSRF o envíe doble las cookies. O para una API, solo usar un token de portador en el encabezado de autenticación es suficiente.