it-swarm.com.de

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

Ich verwende curl, um eines meiner Django-Formulare zu testen. Die Aufrufe, die ich ausprobiert habe (mit Fehlern von jedem und über mehrere Zeilen zur besseren Lesbarkeit):

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

(mit http-Header und csrftoken im Cookie) führt zu einem 400-Fehler, ohne dass Daten zurückgegeben werden.

(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 Header-Eigenschaftendeklaration und auch mit sessionid in Cookie) führt zu dem gleichen 400-Fehler, ohne dass 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 zu Fehlercode 403, mit der Meldung: CSRF-Cookie nicht gesetzt.

Wie kann ich mein Formular mit curl testen? Welche Faktoren berücksichtige ich außer Cookie-Werten und http-Headern nicht?

36
Trindaz

Eine Mischung aus Damiens Antwort und Ihrem Beispiel Nummer 2 hat für mich funktioniert. Ich habe zum Testen eine einfache Anmeldeseite verwendet. Ich gehe davon aus, dass Ihre Registrierungsansicht ähnlich ist. Damiens Antwort funktioniert fast, aber es fehlt der Cookie sessionid.

Ich empfehle einen robusteren Ansatz. Anstatt die Cookies von anderen Anforderungen manuell einzugeben, verwenden Sie das eingebaute Cookie-Managementsystem von curl, um eine vollständige Benutzerinteraktion zu simulieren. Auf diese Weise verringern Sie die Wahrscheinlichkeit eines Fehlers:

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

Die erste Wellung simuliert den Benutzer, der zuerst mit einer GET-Anforderung auf der Seite erscheint, und alle erforderlichen Cookies werden gespeichert. Die zweite Wellung simuliert das Ausfüllen der Formularfelder und das Senden dieser als POST. Beachten Sie, dass Sie das Feld csrfmiddlewaretoken in die POST -Daten aufnehmen müssen, wie von Damien vorgeschlagen.

26
Kevin S.

Versuchen:

curl
 -d "[email protected]&a=1"
 http://127.0.0.1:8083/registrations/register/

Beachten Sie insbesondere das Format des -d-Arguments.

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

CSRF-Schutz ist nur für "unsichere" Anforderungen (POST, PUT, DELETE) erforderlich. Es überprüft das Cookie 'csrftoken' entweder mit dem Formularfeld 'csrfmiddlewaretoken' oder dem http-Header 'X-CSRFToken'.

So:

curl
 -X POST
 -d "[email protected]&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}" zu verwenden, anstatt ihn in die Formulardaten aufzunehmen.

11
Damien Ayers

Ich habe mit Curl so gearbeitet

  • Sie müssen csrftoken im Header als X-CSRFToken einreichen.
  • Sie müssen Formulardaten im JSON-Format einreichen . Demo,

Zuerst holen wir csrf_token ab und speichern es in cookie.txt (oder cookie.jar, wie sie es nennen)

$ curl -c cookie.txt http://localhost.com:8000/ 

cookie.txt Inhalt

# 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

Als nächstes senden wir den Benutzernamen und das Passwort im Json-Format erneut. (Sie können es auf normale Weise versenden). Überprüfen Sie die Json-Datenflucht.

$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": "/"}
$

sie können die Rückgabe des neuen csrf_token-Sitzungscookies in derselben Datei oder neuen Datei speichern (ich habe sie in derselben Datei mit der Option -c gespeichert.)

$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

-Inhalt von 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

Wenn Sie das neue Cookie csrf_token & session id in cookie.txt speichern, können Sie dieselbe cookie.txt auf der Website verwenden.

Sie lesen Cookies aus der vorherigen Anfrage von cookie.txt (--cookie) und schreiben neue Cookies aus der Antwort in dieselbe cookie.txt (-c).

Das Lesen und Senden des Formulars funktioniert jetzt mit csrf_token & session id.

$curl --cookie cookie.txt http://localhost.com:8000/home/
4
Netro

So habe ich es gemacht, indem ich das Rest Framework Tutorial benutzt habe

einen Browser öffnen, z. Wenn Sie dann F12 drücken, öffnen Sie die Registerkarte "Entwickler" und überwachen Sie das Netzwerk. Melden Sie sich mit Ihren Benutzeranmeldeinformationen an und rufen Sie das CRSF-Token ab, um den POST zu überwachen

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, nicht den Token in den Körper zu legen, sondern den Header mit X-CSRFToken

3
Dr Manhattan

curl-auth-csrf ist ein auf Python basierendes Open-Source-Tool, das dies für Sie tun kann: "Python-Tool, das cURL nachahmt, sich aber anmeldet und mit allen Cross-Site Request Forgery-Token (CSRF-Tokens) umgeht. Nützlich zum Abkratzen von HTML, auf das normalerweise nur bei Anmeldung zugegriffen werden kann. "

Das wäre deine Syntax:

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/

Dadurch werden die POST - Daten wie angegeben weitergegeben, aber auch das über stdin übergebene Passwort. Ich gehe davon aus, dass die Seite, die Sie nach "Login" besuchen, dieselbe Seite ist.

Vollständige Offenlegung: Ich bin der Autor von curl-auth-csrf.

1
j0nam1el

X-CSRFToken in Kopfzeilen muss mit csrftoken in Cookie identisch sein.

Beispiel:

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