2012-05-16 136 views
34

私は、私のDjangoフォームの1つをテストするためにcurlを使用しています。私が試したコール(それぞれから、および読みやすさのために複数行にわたってエラーのある):Django、csrfトークン、POSTリクエストでのcurlの使用方法

(1):400エラーで(HTTPヘッダとクッキーでcsrftoken有する)

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/ 

結果データは返されません。

(2):データなしと同じ400エラーに

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)と同様であるが、ヘッダ性宣言のスペースなし、あまりにもクッキーでsessionid有する)結果が返されます。

(3):メッセージとエラーコード403で

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

X-CSRFTokenでのみHTTPヘッダ、クッキーなし)結果:CSRFクッキーが設定されていません。

フォームをカールでテストするにはどうすればよいですか? Cookieの値とhttpヘッダー以外の要素は何ですか?

+1

あなたはX-CSRFトークンを取得する方法を教えてできますか? '-header" X-CSRFToken:[私が既にDjangoアプリケーションからロードしたページのソースコードから3重にチェックされた値] " –

答えて

11

試してみてください。

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

お知らせ-d引数の特にフォーマット。

しかし、これはおそらく、あなたのビューはGET要求の代わりにPOST要求を必要とする可能性があるため、これはうまくいかないでしょう。それは単に情報を返すだけでなく、データを変更することになるからです。

CSRF保護は、安全でない要求(POST、PUT、DELETE)に対してのみ必要です。これは 'csrftoken'クッキーを 'csrfmiddlewaretoken'フォームフィールドか 'X-CSRFToken' HTTPヘッダーのいずれかと照合して動作します。だから、

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}"を使用することも可能です。

+1

-dはPOSTを意味し、-Xは完全に余計です。 –

+1

私はsessionidセッションのID = [対応するセッションID] "' – yellowcap

26

ダミアンの反応とあなたのサンプル番号2の混合物が私のために働いた。私は単純なログインページを使ってテストしましたが、私はあなたの登録画面が似ていると思います。 Damienの応答はほとんど機能しますが、sessionidのCookieがありません。

より堅牢なアプローチをお勧めします。他のリクエストから手動でクッキーを入力するのではなく、curlの組み込みクッキー管理システムを使用して、完全なユーザー対話をシミュレートしてみてください。そうすれば、あなたがエラーを作るチャンスを減らす:

$ 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リクエストでページに到着シミュレートし、必要なすべてのクッキーが保存されています。 2番目のカールは、フォームフィールドを入力してPOSTとして送信することをシミュレートします。 Damienの示唆したように、csrfmiddlewaretokenフィールドをPOSTデータに含める必要があります。ここで

+1

私はケビンのレスポンスに基づいて完全にコード化された回答をhttp: //stackoverflow.com/questions/21306515/how-to-curl-an-authenticated-django-app/24376188#24376188 Djangoでは、リファラー( '-e')を指定する必要もあります。 – Peterino

3

は私が

は、例えばブラウザを開き、残りのフレームワークのチュートリアルを使用して、それをやった方法ですクロムは、F12は開発者のタブを開いて、ネットワークを監視し、ユーザーの資格情報を使用してログインし、実行カールで、その後POST

を監視からあなたCRSFトークンを取得押す:

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

+0

これを動作させるには、 '-H" X-CSRFToken:the_token_value "'属性が必要でした。フルコード、最初にクッキー 'curl -v -c cookies.txt -b cookies.txt http:// url.com'を取得します。私は 'cookies.txt'から' csrftoken'を開いてコピーして投稿しました: 'curl -v -c cookies.txt -b cookies.txt -H" X-CSRFToken:< the token > " - データ" foo = bar&csrftoken = < the token > "http:// url.com' – jbergantine

4

を使用して、体内のトークンではなく、ヘッダは、私はあなたがX-CSRFTokenとしてヘッダにcsrftokenを提出する必要があり、この

  • のようにカールして働きました。
  • JSON形式でフォームデータを送信する必要があります。 デモ、

まず、我々はcookie.txtにcsrf_token &店をフェッチ(または、彼らはそれを呼び出すよう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セッションクッキーを保存することができます(私は、オプション-cを使用して同じファイルに保存されています。)cookie.txt

$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 

-content

# 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/ -H "Content-Type: application/json" -H "X-CSRFToken: vGpifQR12BxT07moOohREGmuKp8HjxaE" -c cookie.txt 
1

curl-auth-csrfあなたのためにこれを行うことが可能Pythonベースのオープンソースのツールである:カールを模倣する「Pythonのツールが、ログインを実行し、任意のクロスサイトリクエストフォージェリ(CSRF)のトークンを処理するのに便利です。通常はログインしたときにのみアクセス可能な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データに沿って通過しますが、また、標準入力経由で渡されたパスワードが含まれるように。私はあなたが "ログイン"後に訪問するページは同じページであると仮定します。

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

+0

生成されたクッキーをファイルに保存する方法はありますか?カールと同様に、他のカールコマンドはそのクッキーに対して実行できますか?私はあなたのコードを見て、それを行う方法を見ていませんでした。それがあれば、GETではなくログイン後にPOSTを行う必要があるので、非常に便利です。 –

+0

curlは古いNetscape形式のCookieを使用します。 Pythonのhttp.cookiejar.MozillaCookieJarを使用して、形式でクッキーを保存()することができます。たとえば、[この回答](http://stackoverflow.com/a/25858635/3376504)を参照してください。しかし、通常、これは必要以上に難しい場合があります。クッキーをつかんだ後に作成したいカール要求については、 'curl-auth-csrf.py'を実行するだけで、それらのURLをリストに追加することができます。スクリプトはあなたのためにセッションクッキーを適用します。 – j0nam1el

0

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

例:

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