55

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

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

(httpヘッダーとcsrftokenCookieを使用)結果として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)と同様ですが、ヘッダープロパティ宣言にスペースがなくsessionid、Cookieにもスペースがありません)、データが返されない同じ400エラーが発生します。

(3):

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

(CookieなしのhttpヘッダーのみX-CSRFToken)エラーコード403が発生し、メッセージ:CSRFcookieが設定されていません。

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

4

6 に答える 6

15

試す:

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

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

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

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

それで:

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

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

于 2012-05-17T01:03:12.153 に答える
8

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

  • csrftoken を X-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/
于 2015-05-15T10:24:49.440 に答える
1

curl-auth-csrfは、これを行うことができる Python ベースのオープンソース ツールです。「cURL を模倣するが、ログインを実行し、クロスサイト リクエスト フォージェリ (CSRF) トークンを処理する Python ツール。通常の HTML のスクレイピングに役立ちます。ログイン時のみアクセス可能。」

これはあなたの構文です:

echo -n YourPasswordHere | ./curl-auth-csrf.py -i http://127.0.0.1:8083/registrations/register/ -d 'email=test@test.com&a=1' http://127.0.0.1:8083/registrations/register/

これにより、リストされている POST データが渡されますが、stdin を介して渡されたパスワードも含まれます。「ログイン」後に訪れるページも同じページだと思います。

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

于 2016-01-23T03:33:17.837 に答える