2016-11-18 24 views
1

同期トークンパターンでは、常にCSRFトークンが隠しフィールドまたはURLに表示されます。それをAjaxの投稿要求の最後に添付し、サーバーがそれを使用する必要があるかどうかを決定させるのは安全ですか?それはなぜ人々はそれをしないのですか?CSRF同期トークン

答えて

0

簡単な答えは、リクエストが別の発信元によって行われた場合(つまり、Cookieに含まれていない場合)、ブラウザによって自動的に送信されない限り、シンクロナイザトークンパターンでトークンをどのように送信するかは関係ありません)。ですから、「Ajaxの投稿要求の最後に添付してもいいですか」(しかし、私はそれがあなたが何を意味するのかはよく分かりません:))。

ajax呼び出しのない伝統的なフォームアプリケーションについては、隠れたフォームフィールドが最も便利な方法です。それぞれのフォームの隠しフィールドにトークンを置くだけで、クライアント上で何もできません。簡単です。

Ajaxはランドスケープを変更し、Ajaxコールは自動的にトークンを送信しません。自動的に世話をする必要があります。たとえば、jQueryの場合、$.ajaxSetupbeforeSendフックを使用して、要求にトークンを自動的に追加します。リクエストのコンテンツタイプがx-www-form-urlencodedの場合は、別のフォーム変数として追加することができます。application/jsonのjsonリクエストの場合は、json値として追加できます。それは安全ですが、私は2つの問題を見ることができます。

トークンはビジネスロジックやビジネスデータの一部ではなく、リクエストの種類の「メタデータ」です。また、クエリーに固有のものではなく、データ構造全体にわたるクロスカッティングの問題です。だから、それをデータ構造から守る方が良いです。

もう1つの問題は、beforeSendの既に構成された要求データにトークンを追加するのは面倒です。

これをトークンとして送信するほうがはるかに簡単です。トークンをajaxリクエストに追加するときに、トークンを追加するときに主に行う作業です。 X-CSRF-Tokenなどのようなカスタムリクエストヘッダーを追加することは非常に一般的であり、サーバー側でそこからトークンを確認することができます。

+0

すばらしい説明!私はPHPでそれを行う伝統的な方法はありません。それは私のアプリケーションのために私のために特別に設計されたものなので、一般的な知識ではありません。私は、セキュリティの懸念があるかどうか疑問に思っていました。アプリケーションのセキュリティを是正するための知識があまりなく、明白であるかどうかは不明です。 –