19

インターネットを検索した後、人々は通常この状況に対処します---フロントエンドはユーザーにcsrfトークンのCookieを送信できるdjangoビュー関数によって生成されます。ユーザーがajaxを使用してサーバーにリクエストを送信すると、csrfをサーバーに送信するajaxSend動作を書き換えることができます。

ただし、私の状況では、フロントエンドはバックエンドから完全に分離されています。つまり、フロントエンドはnginxを実行する専用サーバーにあり、ハッシュバンを使用してさまざまなページをすべて提供するHTMLは1つだけです。私のバックエンドは異なるドメイン名を使用して異なるサーバーで実行されています。この場合、クライアントはどのようにしてcsrf cookieを取得しますか?私のバックエンドはjsonapireturnのみを提供しました。

ありがとうございました。

4

3 に答える 3

-1

フロントエンドにドメイン frontend.example.com とバックエンド ドメイン backend.example.com があるとします。(あなたがDjango restフレームワークのようなものである場合)使用できる場合、セキュリティレイヤーを有効にするには2つの方法があります. CSRF 保護または CORS

CORSの場合、

pip install django-cors-headers

次に、これを INSTALLED_APPS、MIDDLEWARE_CLASSES に構成し、フロントエンド ドメインを CORS_ORIGIN_WHITELIST に追加します。

CORS_ORIGIN_WHITELIST = (
    'frontend.example.com'
)

CORS は、frontend.example.com 以外のドメインから発生するすべての http リクエストをブロックします。


CSRFの場合、

CSRF_COOKIE_DOMAIN = ".mydomain.com"

Angular アプリを使用している場合は、以下のようにします。

$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
$httpProvider.defaults.withCredentials = true;

次に、http リクエストを作成しながらヘッダーを追加します。

headers : {
    "x-csrftoken" : $cookies.csrftoken
}
于 2017-04-02T03:49:09.113 に答える
-1

CRSF トークン ソースを見ると、すべての csrf_middleware が Cookie を post 値に対してチェックしていることがわかります。cookie は既に ajax を介して設定されているはずなので、ポストの値をサーバーに戻すだけで済みます。テンプレート タグのソースを見ると、コンテキストから変数を取り出しているだけであることがわかります。利用可能な場合はコンテキストから引き出すか、コンテキストプロセッサを直接呼び出して、応答に貼り付けます。あとは、POST 変数 crsf_token として送り返すだけです。

于 2017-04-02T03:10:51.797 に答える