es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , , ,

Answer

  1. Avatar for 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 encabezado Referer junto con la solicitud. En este caso, el encabezado Referer 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 encabezado Origin.

    En los encabezados de solicitud proporcionados, podemos ver que el encabezado Origin se establece en https://www.site.lv`, que también está en la listaCSRF_TRUSTED_ORIGINS. Sin embargo, el encabezadoHostse establece encvcentrs-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` acvcentrs-staging.herokuapp.com, también es necesario agregarcvcentrs-staging.herokuapp.comaCORS_ALLOWED_ORIGINS`. Esto permitirá las solicitudes CORS desde el sitio externo.

Comments are closed.