Wie man curl mit Django, csrf Tokens und POST Anfragen benutzt



2 Answers

Versuchen:

curl
 -d "email=test@test.com&a=1"
 http://127.0.0.1:8083/registrations/register/

Beachten Sie insbesondere das Format des Arguments -d .

Dies wird jedoch wahrscheinlich nicht funktionieren, da Ihre Ansicht wahrscheinlich eine POST-Anfrage statt einer GET-Anfrage benötigt. Da Daten geändert werden, werden nicht nur Informationen zurückgegeben.

CSRF-Schutz wird nur für 'unsichere' Anfragen benötigt (POST, PUT, DELETE). Es funktioniert, indem Sie das "csrftoken" Plätzchen gegen das "csrfmiddlewaretoken" Formularfeld oder den "X-CSRFToken" http-Überschrift prüfen.

Damit:

curl
 -X POST
 -d "email=test@test.com&a=1&csrfmiddlewaretoken={inserttoken}"
 --cookie "csrftoken=[as above]"
 http://127.0.0.1:8083/registrations/register/

Es ist auch möglich, --header "X-CSRFToken: {token}" anstatt sie in die Formulardaten aufzunehmen.

Question

Ich benutze Curl, um eine meiner Django-Formen zu testen. Die Anrufe, die ich versucht habe (mit Fehlern von jedem, und über mehrere Zeilen für die Lesbarkeit):

(1):

curl
-d "{\"email\":\"test@test.com\"}"
--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/

(mit HTTP-Header und csrftoken in Cookie) führt zu einem Fehler 400 ohne Daten zurückgegeben.

(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/

(wie in (1), aber keine Leerzeichen in der Deklaration der Header-Eigenschaften und auch in der sessionid im Cookie) führt zu demselben 400-Fehler, bei dem keine Daten zurückgegeben werden.

(3):

curl
-d "{a:1}"
--header "X-CSRFToken:[as above]"
http://127.0.0.1:8083/registrations/register/

(nur http-Header mit X-CSRFToken , kein Cookie) führt zum Fehlercode 403, mit der Meldung: CSRF-Cookie nicht gesetzt.

Wie kann ich meine Form mit Curl testen? Welche Faktoren betrachte ich neben Cookie-Werten und http-Headern nicht?




X-CSRFToken in Kopfzeilen müssen nur mit csrftoken in cookie csrftoken .

Beispiel:

curl -v http://www.markjour.com/login/ -H "X-CSRFToken: 123" -b "csrftoken=123" -d "username=admin&password=admin"



Hier ist, wie ich es gemacht habe, mit dem Rest Framework Tutorial

Öffnen Sie einen Browser, zB chrome, drücken Sie F12, öffnen Sie die Entwickler-Registerkarte und überwachen Sie das Netzwerk, melden Sie sich mit Ihren Benutzerdaten an und lassen Sie Ihr CRSF-Token von der Überwachung des POST abhalten

dann in curl ausführen:

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"}' 

Ich denke, es ist sauberer, den Token nicht in den Körper zu setzen, sondern den Header mit X-CSRFToken




Related