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 Cookie not set。
Curlでフォームをテストするにはどうすればよいですか? Cookie値とHTTPヘッダー以外に考慮しない要素は何ですか?
ダミアンの応答とあなたの例番号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
フィールドを含める必要があることに注意してください。
試してください:
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}"
を使用することもできます。
私はこのようなカールで働いた
最初に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/
残りのフレームワークチュートリアルを使用して、これをどのように行ったか
ブラウザを開きます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を使用して、トークンを本文ではなくヘッダーに入れるほうがクリーナーだと思います
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の著者です。
ヘッダーのX-CSRFToken
は、Cookieのcsrftoken
と同じである必要があります。
例:
curl -v http://www.markjour.com/login/ -H "X-CSRFToken: 123" -b "csrftoken=123" -d "username=admin&password=admin"