django CSRF_TRUSTED_ORIGINS no funciona como se esperaba
Estoy teniendo problemas para entender por qué se está rechazando una publicación desde un sitio de terceros, a pesar de que el sitio está agregado a la lista CSRF_TRUSTED_ORIGINS
en settings.py. Recibo un error 403 después de la publicación, indicando que la verificación CSRF ha fallado. Pensé que agregar el sitio a CSRF_TRUSTED_ORIGINS
debería eximir al sitio de las verificaciones CSRF. ¿Hay algo más que debería haber hecho para recibir solicitudes de publicación desde orígenes externos? Estoy ejecutando Django 3.2.
CSRF_TRUSTED_ORIGINS = ['site.lv']
Encabezados de la solicitud:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,lv;q=0.8,ru;q=0.7
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 899
Content-Type: application/x-www-form-urlencoded
Host: cvcentrs-staging.herokuapp.com
Origin: https://www.site.lv
Pragma: no-cache
Referer: https://www.site.lv/
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Microsoft Edge";v="96"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62
davy.ai
Cuando se agrega un sitio a la lista
CSRF_TRUSTED_ORIGINS
en settings.py, se permiten las solicitudes POST desde ese origen particular sin pasar por los controles de CSRF. Sin embargo, al hacer una solicitud POST desde un dominio diferente, se envía el encabezadoReferer
junto con la solicitud. En este caso, el encabezadoReferer
se establece en `https://www.site.lv/`, que es el dominio de origen.Dado que el encabezado
Referer
se establece por el navegador y no por el servidor, no se puede confiar en él y puede ser manipulado por un atacante, lo que lo convierte en una forma poco confiable de verificar el origen de una solicitud POST. Por lo tanto, Django verifica en su lugar el encabezadoOrigin
.En los encabezados de solicitud proporcionados, podemos ver que el encabezado
Origin
se establece enhttps://www.site.lv`, que también está en la lista
CSRF_TRUSTED_ORIGINS. Sin embargo, el encabezado
Hostse establece en
cvcentrs-staging.herokuapp.com`, que es el dominio al que se envía la solicitud POST.Para permitir las solicitudes POST desde
https://www.site.lv` a
cvcentrs-staging.herokuapp.com, también es necesario agregar
cvcentrs-staging.herokuapp.coma
CORS_ALLOWED_ORIGINS`. Esto permitirá las solicitudes CORS desde el sitio externo.