5

を使用してアプリケーションを頻繁にテストしていますcurlが、以前はビューを でラップするだけcsrf_exemptでした。私は本当にこれをしたくありません。デプロイメントでこれを行うのを忘れて、CSRF地獄の生涯を楽しむという嫌な気持ちがあるからです。

Django のシェル コマンドを使用して CSRF トークンを要求する方法はありますか? curl物事を安全にテストするために、リクエストで送信できるトークンを取得したいと思います。

4

3 に答える 3

12

Cookie jar を埋めるために、フォーム URL に対して最初の GET 要求を行います。

$ curl http://example.com/some-form/ -o /dev/null -c cookies.txt -s

csrftokenCookieの値を取得します。

$ grep csrftoken cookies.txt | cut -f 7
YQkfXZCKtPP0hC30NmH10jSWuf6yJA5E

POST を発行するときは、csrfmiddlewaretokenこの値を持つフィールドを含めるだけです (同じ Cookie jar を使用します)。

私は同じトリックを使用して、ライブラリを使用してエンド ツー エンドのテストを作成しrequestsます。

于 2013-11-07T03:23:11.713 に答える
0

これに関連する問題に取り組んでいる間、AJAX 経由でアクセスできる一連のエンドポイントの CSRF トークンの設定をテストしたいと思いました。私はこのスレッドに出会い、Django シェルからそれを行う別の方法を追加する価値があると考えました。これは、元のポスターが尋ねているように見えたものです。

まず、私はrequestsライブラリを使用しているので、持っていない場合はあなたがしなければなりませんpip install requests.

トークンが存在することを確認する

次に、Ajax エンドポイントのみを扱う場合は、トークンを取得する何らかの方法が必要です。そのため、ビューの get メソッドに次のデコレーターを設定する必要があります。これは、Django のドキュメントに記載されているように、動的にフォームを生成します。クラスベースのビューの例を次に示します。

from django.utils.decorators import method_decorator
from django.views.decorators.csrf import ensure_csrf_cookie

    @method_decorator(ensure_csrf_cookie)
    def get(self, request, *args, **kwargs):
        return SomeJson...

DRF 投稿: csrf_protect を確認する

私は Django Rest Framework ビューも使用しているためcsrf_protect、POST で明示的に設定する必要がありました。

from django.views.decorators.csrf import csrf_protect

    @method_decorator(ensure_csrf_cookie)
    def post(self, request, *args, **kwargs):
        return SomeJson...

シェルからトークンを取得し、それを POST して戻します

最後に、メソッドからトークンを取得してgetメソッドに POST するためにpost、次のことを行いました。

>>> resp = requests.get(url)
>>> cookies = resp.cookies
>>> token = cookies['csrftoken']
>>> data = {'content': True, 'we': None, 'are': False, 'posting': 0}
>>> data['csrfmiddlewaretoken'] = token
>>> resp2 = requests.post(url, data=data, cookies=cookies)
>>> resp2
<Response [200]>
于 2015-06-24T16:52:05.313 に答える