を使用してアプリケーションを頻繁にテストしていますcurl
が、以前はビューを でラップするだけcsrf_exempt
でした。私は本当にこれをしたくありません。デプロイメントでこれを行うのを忘れて、CSRF地獄の生涯を楽しむという嫌な気持ちがあるからです。
Django のシェル コマンドを使用して CSRF トークンを要求する方法はありますか? curl
物事を安全にテストするために、リクエストで送信できるトークンを取得したいと思います。
を使用してアプリケーションを頻繁にテストしていますcurl
が、以前はビューを でラップするだけcsrf_exempt
でした。私は本当にこれをしたくありません。デプロイメントでこれを行うのを忘れて、CSRF地獄の生涯を楽しむという嫌な気持ちがあるからです。
Django のシェル コマンドを使用して CSRF トークンを要求する方法はありますか? curl
物事を安全にテストするために、リクエストで送信できるトークンを取得したいと思います。
Cookie jar を埋めるために、フォーム URL に対して最初の GET 要求を行います。
$ curl http://example.com/some-form/ -o /dev/null -c cookies.txt -s
csrftoken
Cookieの値を取得します。
$ grep csrftoken cookies.txt | cut -f 7
YQkfXZCKtPP0hC30NmH10jSWuf6yJA5E
POST を発行するときは、csrfmiddlewaretoken
この値を持つフィールドを含めるだけです (同じ Cookie jar を使用します)。
私は同じトリックを使用して、ライブラリを使用してエンド ツー エンドのテストを作成しrequests
ます。
これに関連する問題に取り組んでいる間、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]>