csrfmiddlewaretoken - Cómo usar curl con Django, tokens csrf y solicitudes POST
django post csrf token (6)
Estoy usando Curl para probar uno de mis formularios de Django. Las llamadas que he intentado (con errores de cada uno, y en varias líneas para la legibilidad):
(1):
curl
-d "{/"email/":/"[email protected]/"}"
--header "X-CSRFToken: [triple checked value from the source code of a page I already loaded from my Django app]"
--cookie "csrftoken=[same csrf value as above]"
http://127.0.0.1:8083/registrations/register/
(con el encabezado http y csrftoken
en la cookie) genera un error de 400 sin que se devuelva ningún dato.
(2):
curl
-d "{a:1}"
--header "X-CSRFToken:[as above]"
--cookie "csrftoken=[as above];sessionid=[from header inspection in Chrome]"
http://127.0.0.1:8083/registrations/register/
(como en (1) pero sin espacios en la declaración de propiedad del encabezado, y con sessionid
en la cookie también) se produce el mismo error 400 sin que se devuelva ningún dato.
(3):
curl
-d "{a:1}"
--header "X-CSRFToken:[as above]"
http://127.0.0.1:8083/registrations/register/
(solo el encabezado http con X-CSRFToken
, sin cookie) da como resultado el código de error 403, con el mensaje: cookie CSRF no establecida.
¿Cómo puedo probar mi formulario con Curl? ¿Qué factores no estoy considerando además de los valores de las cookies y los encabezados http?
Aquí es cómo lo hice, usando el tutorial de resto del marco
abra un navegador, por ejemplo, cromo, luego presione F12, abra la pestaña del desarrollador y monitoree la red, inicie sesión usando sus credenciales de usuario y obtenga que su token CRSF monitoree el POST
luego en curl ejecuta:
curl http://127.0.0.1:8000/snippets/ /
-X POST /
-H "Content-Type: application/json" /
-H "Accept: text/html,application/json" /
-H "X-CSRFToken: the_token_value" /
-H "Cookie: csrftoken=the_token_value" /
-u your_user_name:your_password /
-d ''{"title": "first cookie post","code": "print hello world"}''
Creo que es más limpio no poner la ficha en el cuerpo, sino más bien el encabezado con X-CSRFToken
Trabajé con curl como este
- Debe enviar csrftoken en el encabezado como X-CSRFToken.
- Debe enviar los datos del formulario en formato JSON. Manifestación,
Primero buscaremos csrf_token & store en cookie.txt (o cookie.jar como lo llaman)
$ curl -c cookie.txt http://localhost.com:8000/
contenido cookie.txt
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.
localhost.com FALSE / FALSE 1463117016 csrftoken vGpifQR12BxT07moOohREGmuKp8HjxaE
A continuación volvemos a enviar el nombre de usuario, la contraseña en formato json. (puede enviarlo de manera normal). Verifique el escape de datos json.
$curl --cookie cookie.txt http://localhost.com:8000/login/ -H "Content-Type: application/json" -H "X-CSRFToken: vGpifQR12BxT07moOohREGmuKp8HjxaE" -X POST -d "{/"username/":/"username/",/"password/":/"password/"}"
{"status": "success", "response_msg": "/"}
$
puede almacenar la nueva cookie de sesión csrf_token de devoluciones en el mismo archivo o archivo nuevo (he almacenado en el mismo archivo con la opción -c)
$curl --cookie cookie.txt http://localhost.com:8000/login/ -H "Content-Type: application/json" -H "X-CSRFToken: kVgzzB6MJk1RtlVnyzegEiUs5Fo3VRqF" -X POST -d "{/"username/":/"username/",/"password/":/"password/"}" -c cookie.txt
-Contenido de cookie.txt
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.
localhost.com FALSE / FALSE 1463117016 csrftoken vGpifQR12BxT07moOohREGmuKp8HjxaE
#HttpOnly_localhost.com FALSE / FALSE 1432877016 sessionid cg4ooly1f4kkd0ifb6sm9p
Cuando almacena una nueva cookie csrf_token & session id en cookie.txt, puede usar la misma cookie.txt en el sitio web.
Estoy leyendo cookies de solicitudes anteriores de cookie.txt (--cookie) y escribiendo nuevas cookies a partir de la respuesta en el mismo cookie.txt (-c).
El formulario de lectura y envío ahora funciona con csrf_token & id de sesión.
$curl --cookie cookie.txt http://localhost.com:8000/home/
Tratar:
curl
-d "[email protected]&a=1"
http://127.0.0.1:8083/registrations/register/
Observe especialmente el formato del argumento -d
.
Sin embargo, esto probablemente no funcionará, ya que su vista probablemente necesite una solicitud POST en lugar de una solicitud GET. Dado que modificará los datos, no solo devolverá la información.
La protección CSRF solo es necesaria para solicitudes "inseguras" (POST, PUT, DELETE). Funciona al marcar la cookie ''csrftoken'' contra el campo de formulario ''csrfmiddlewaretoken'' o el encabezado http ''X-CSRFToken''.
Asi que:
curl
-X POST
-d "[email protected]&a=1&csrfmiddlewaretoken={inserttoken}"
--cookie "csrftoken=[as above]"
http://127.0.0.1:8083/registrations/register/
También es posible usar - --header "X-CSRFToken: {token}"
lugar de incluirlo en los datos del formulario.
Una mezcla de la respuesta de Damien y tu ejemplo número 2 funcionó para mí. Utilicé una página de inicio de sesión simple para probar, espero que su vista de registro sea similar. La respuesta de Damien casi funciona, pero le falta la cookie de sessionid
.
Recomiendo un enfoque más robusto. En lugar de ingresar manualmente las cookies de otras solicitudes, intente utilizar el sistema integrado de administración de cookies de curl para simular una interacción completa del usuario. De esta forma, reduces la posibilidad de cometer un error:
$ curl -v -c cookies.txt -b cookies.txt host.com/registrations/register/
$ curl -v -c cookies.txt -b cookies.txt -d "[email protected]&a=1&csrfmiddlewaretoken=<token from cookies.txt>" host.com/registrations/register/
El primer curl simula que el usuario llega primero a la página con una solicitud GET y se guardan todas las cookies necesarias. El segundo curl simula rellenar los campos de formulario y enviarlos como POST. Tenga en cuenta que debe incluir el campo csrfmiddlewaretoken
en los datos POST, como lo sugiere Damien.
curl-auth-csrf es una herramienta de código abierto basada en Python capaz de hacer esto por usted: "Herramienta de Python que imita cURL, pero realiza un inicio de sesión y maneja cualquier token de Falsificación de solicitudes entre sitios (Cross-Site Request Forge). solo accesible cuando se inicia sesión ".
Esta sería tu sintaxis:
echo -n YourPasswordHere | ./curl-auth-csrf.py -i http://127.0.0.1:8083/registrations/register/ -d ''[email protected]&a=1'' http://127.0.0.1:8083/registrations/register/
Esto pasará los datos POST como se detalla, pero también incluirá la contraseña pasada a través de stdin. Supongo que la página que visitas después de "iniciar sesión" es la misma página.
Descripción completa: soy el autor de curl-auth-csrf.
X-CSRFToken
en encabezados solo necesita ser el mismo con csrftoken
en cookie.
Ejemplo:
curl -v http://www.markjour.com/login/ -H "X-CSRFToken: 123" -b "csrftoken=123" -d "username=admin&password=admin"