9

通常の状況では、django は Cookie を介して csrf トークンを送信します。これは、後で ajax post メソッドで使用できます。ただし、ブラウザー (Chrome または Firefox) で Cookie をクリアすると、csrf トークンはブラウザーに送信されなくなり、セッション ID は引き続き送信されますが、csrf トークンは送信されません。誰が何が問題なのか知っていますか?

テンプレートに {% csrf_token %} を追加してこの問題を解決すると、そのページ リクエストとともに SET-COOKIE ヘッダーが表示されます。サーバーがSET-COOKIEヘッダーを介してトークンを送信するようにするには、テンプレートに{%csrf-token%}を配置する必要があることがわかりました

4

4 に答える 4

5

私も同じ問題を抱えていました。django ソースに対してデバッグした後、理由は次のとおりです。

ビューが csrf_token テンプレート タグを含むテンプレートをレンダリングしていない場合、Django は CSRF トークン Cookie を設定しない可能性があります。

2 つのソリューション:

  • {% csrf_token %}テンプレートに追加する
  • @ensure_csrf_cookieビューにデコレータを使用する

詳細については、django docを参照してください。

于 2015-11-19T02:25:39.517 に答える
4

django/middleware/csrf.pyどのCsrfViewMiddlewareクラスで宣言されているかを見てください。ご覧のとおりdef process_response(self, request, response)、Cookie のセットアップを妨げる 3 つの条件があります。

def process_response(self, request, response):
    if getattr(response, 'csrf_processing_done', False):
        return response

    # If CSRF_COOKIE is unset, then CsrfViewMiddleware.process_view was
    # never called, probaby because a request middleware returned a response
    # (for example, contrib.auth redirecting to a login page).
    if request.META.get("CSRF_COOKIE") is None:
        return response

    if not request.META.get("CSRF_COOKIE_USED", False):
        return response

    # Set the CSRF cookie even if it's already set, so we renew
    # the expiry timer.
    response.set_cookie(settings.CSRF_COOKIE_NAME,
                        request.META["CSRF_COOKIE"],
                        max_age = 60 * 60 * 24 * 7 * 52,
                        domain=settings.CSRF_COOKIE_DOMAIN,
                        path=settings.CSRF_COOKIE_PATH,
                        secure=settings.CSRF_COOKIE_SECURE
                        )
    # Content varies with the CSRF cookie, so set the Vary header.
    patch_vary_headers(response, ('Cookie',))
    response.csrf_processing_done = True
    return response

どちらが適用されているかを確認してください。

于 2012-07-17T06:23:00.277 に答える