web-dev-qa-db-ja.com

Django、csrfトークンおよびPOSTリクエストでcurlを使用する方法

Djangoフォームのいずれかをテストするためにcurlを使用しています。試した呼び出し(それぞれからのエラー、および読みやすさのために複数行で):

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

(httpヘッダーとCookie内のcsrftokenを使用)は、データが返されずに400エラーになります。

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

((1)と同様ですが、ヘッダープロパティ宣言にスペースがなく、Cookieにsessionidが含まれている場合)、データが返されずに同じ400エラーが発生します。

(3):

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

X-CSRFToken付きのHTTPヘッダーのみ、Cookieなし)は、エラーコード403になり、メッセージ:CSRF Coo​​kie not set。

Curlでフォームをテストするにはどうすればよいですか? Cookie値とHTTPヘッダー以外に考慮しない要素は何ですか?

43
Trindaz

ダミアンの応答とあなたの例番号2の混合物は私のために働いた。テストには簡単なログインページを使用しましたが、登録ビューも同様であると思われます。 Damienの応答はほとんど機能しますが、sessionid Cookieが欠落しています。

より堅牢なアプローチをお勧めします。他のリクエストから手動でCookieを入力するのではなく、curlの組み込みのCookie管理システムを使用して、完全なユーザーインタラクションをシミュレートしてください。そうすれば、エラーを起こす可能性を減らすことができます。

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

最初のカールは、GETリクエストで最初にページに到達したユーザーをシミュレートし、必要なすべてのCookieが保存されます。 2番目のカールは、フォームフィールドに入力し、それらをPOSTとして送信することをシミュレートします。 Damienが提案したように、POST=データにcsrfmiddlewaretokenフィールドを含める必要があることに注意してください。

27
Kevin S.

試してください:

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

特に-d引数の形式に注意してください。

ただし、ビューはおそらくGETリクエストではなくPOSTリクエストを必要とするため、これはおそらく機能しません。情報を返すだけでなく、データを変更するためです。

CSRF保護は、「安全でない」リクエスト(POST、PUT、DELETE)にのみ必要です。 「csrfmiddlewaretoken」フォームフィールドまたは「X-CSRFToken」httpヘッダーに対して「csrftoken」Cookieをチェックすることで機能します。

そう:

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

フォームデータに含める代わりに--header "X-CSRFToken: {token}"を使用することもできます。

14
Damien Ayers

私はこのようなカールで働いた

  • X-CSRFTokenとしてcsrftokenをヘッダーに送信する必要があります。
  • JSON形式でフォームデータを送信する必要があります。デモ、

最初にcsrf_tokenを取得してcookie.txt(またはcookie.jarで呼び出します)に保存します

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

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

次に、json形式でユーザー名とパスワードを再送信します。 (通常の方法で送信できます)。 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": "/"}
$

戻り値の新しいcsrf_tokenセッションCookieを同じファイルまたは新しいファイルに保存できます(オプション-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

-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

新しいcsrf_tokenとセッションID cookieをcookie.txtに保存すると、Webサイト全体で同じcookie.txtを使用できます。

Cookie.txt(--cookie)からの以前の要求からcookieを読み取り、同じcookie.txt(-c)内の応答から新しいcookieを作成しています。

フォームの読み取りと送信がcsrf_tokenとセッションIDで機能するようになりました。

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

残りのフレームワークチュートリアルを使用して、これをどのように行ったか

ブラウザを開きますchrome次にF12を押して開発者タブを開き、ネットワークを監視し、ユーザー資格情報を使用してログインし、CRSFトークンを取得してPOSTを監視します

次に、カールで実行します:

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

X-CSRFTokenを使用して、トークンを本文ではなくヘッダーに入れるほうがクリーナーだと思います

4
Dr Manhattan

curl-auth-csrf は、これを行うことができるPythonベースのオープンソースツールです。トークン。通常、ログイン時にのみアクセス可能なHTMLをスクレイピングするのに役立ちます。」

これはあなたの構文でしょう:

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/

これは、リストのPOSTデータに沿って渡されますが、stdinを介して渡されたパスワードも含まれます。「ログイン」の後にアクセスするページは同じページであると想定します。

完全な開示:curl-auth-csrfの著者です。

1
j0nam1el

ヘッダーのX-CSRFTokenは、Cookieのcsrftokenと同じである必要があります。

例:

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