0

問題/バグが見つかりましたか? CSRFを使用したAJAXで。全く使いません{% csrf_token %}。私は AJAX フォームのみを使用しているため、csrf 用の Cookie は設定されていません。その場合-ここにリンクの説明を入力しても意味がありません:( get_token を使用して生成できますが、すべてのサイトに配置する必要があるため、意味がありません。

csrf タグを使用せずにその Cookie を作成するにはどうすればよいですか?

4

4 に答える 4

1

任意のランダムな 32 桁の英数字文字列がトークンとして機能します。「csrftoken」という名前の Cookie に保存し、投稿と一緒に送信するだけです。

これにより、トークンが自動生成されるか、既存のトークンが再利用されます。ページ上のすべてのフォーム送信を処理します。オフサイト フォームがある場合は、このコードが実行されないようにする必要があります。

<script>
$(document).on('submit', 'form[method=post]', function(){
  if(!document.cookie.match('csrftoken=([a-zA-Z0-9]{32})')){
    for(var c = ''; c.length < 32;) c += Math.random().toString(36).substr(2, 1)
    document.cookie = 'csrftoken=' + c + '; path=/'
  }
  if(!this.csrfmiddlewaretoken) $(this).append('<input type="hidden" name="csrfmiddlewaretoken">')
  $(this.csrfmiddlewaretoken).val(document.cookie.match('csrftoken=([a-zA-Z0-9]{32})')[1])
})
</script>

jQuery 1.7 以降が必要

于 2014-01-24T18:12:24.777 に答える
0

ビューで csrf_exempt デコレーターを使用できます

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt

于 2011-09-29T23:59:12.160 に答える
0

サーバー側の JS 変数に csrf トークンをインプリントすると、後で Django によって認識されるカスタム HTTP ヘッダーを送信できます。

X-CSRFToken: {{ csrf_token }}}

また、その Q&A も参照してください: Opera のみの ajax ポスト リクエストでの Django CSRF の失敗

作業依頼例:

POST /main/uploadpage/ HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Content-Length: 505853
Origin: http://127.0.0.1:8000
X-File-Name: Screen Shot 2013-05-12 at 5.13.34 PM (2).png
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31
Content-Type: image/png
Cache-Control: no-cache
X-Requested-With: XMLHttpRequest
X-CSRFToken: 1kCcyDzpHIxicSzCqvuXUMbpGaXvFpCZ
Accept: */*
Referer: http://127.0.0.1:8000/main/uploadpage/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
于 2013-05-13T02:41:22.123 に答える
-1

CSRFを無効にすることを検討しましたか?

これを行うには、ミドルウェアを削除するだけです: 'django.middleware.csrf.CsrfViewMiddleware',

于 2011-09-30T01:19:12.837 に答える