Android GCM (プッシュ通知サービス) の登録プロセス中に、モバイル クライアントはDjango ビューに対してPOST 要求を行う必要があります。デフォルトでは、ビューには csrf_token が必要ですが、@csrf_exempt デコレーターで無効にすることができます。
私の質問は: csrf でビューをチェックしないとどうなりますか? モバイル クライアントから (ある種のソルトを使用して) トークンを作成することは理にかなっていますか?
Android GCM (プッシュ通知サービス) の登録プロセス中に、モバイル クライアントはDjango ビューに対してPOST 要求を行う必要があります。デフォルトでは、ビューには csrf_token が必要ですが、@csrf_exempt デコレーターで無効にすることができます。
私の質問は: csrf でビューをチェックしないとどうなりますか? モバイル クライアントから (ある種のソルトを使用して) トークンを作成することは理にかなっていますか?
それは本当にあなたの見方の性質に依存します。
csrf トークンは、同じ PC で既に認証されているときに、意図しないアクションの呼び出しを防ぐのに役立ちます。たとえば、Django アプリにhttp://www.example.com/person/delete/356という URL が存在するとします。POSTすると、ID 356の人が削除されます。起動するには認証が必要なため、これは通常は問題ありません。ただし、1 つのタブで Django アプリケーションにログインしていて、誰かが「http://www.example.com/person/delete/356」というリンクを含むフィッシング メール (または類似のメール) を送信した場合はどうでしょうか。クリックします。それと、別のタブで既に認証されているため、機能します。Django に csrf トークンを期待させることにより、Django は実際に期待する要求のみを実行します。つまり、Django はトークン "12345ab" を発行したことを認識しているため、トークン "12345ab" を含む要求が返された場合、トークンが欠落している場合はアクションに罰金を科します。または、「98765zx」を送信すると失敗します。
認証がなく、ビューが何も動作しない場合 (つまり、データを変更せずに表示するだけ)、@csrf_exempt を作成するリスクはかなり低いです。
同様に、これがモバイル アプリ内で発生し、ビューが認証されている場合、認証はブラウザー タブと同様にアプリ間で共有されないため、リスクは低くなります。
HTTP リクエストをセットアップするときに、期待される csrf トークンを何らかの方法で取得できる場合は、他のオプションも利用できます。AJAX 呼び出しの場合と同様に、ヘッダーを設定できます。Django のドキュメントはこちらを参照してください。
これは、多くの要因、具体的には登録ID以外に収集しているもの、およびクライアントがPOSTのためにサーバーに接続している方法によって異なります。
攻撃者は、自分の管理下にあるデバイスを被害者のアカウントに登録し、被害者向けの通知を受け取る可能性があります。
何をしているのかによっては、これはそれほどひどいことではないかもしれません。特に、GCMメッセージに機密情報が含まれることは想定されておらず、より安全な方法で情報をロードするためのトリガーとして機能することを考えればなおさらです。
(つまり、GCMが認証に基づいてクライアントデバイスに新しいページをロードするアクティビティをトリガーした場合、攻撃者のアプリは被害者の資格情報を使用して認証されないため、機密情報を見ることができません)。
それは何よりも厄介なことになるでしょう。
Namが述べたようにトークンを設定します-サーバーから(つまりJavaScriptコールバックから)GCM登録アクティビティを開始する場合は、クライアントが登録で返す必要があるトークンを設定するだけです。CSRFリクエストはこのステップとは非同期であり、トークンがないために失敗します。
アプリがアプリ専用のサブドメインを介してサーバーと通信する場合(つまり、サブドメインレベルで認証Cookieを使用するapp.site.com)、アプリケーションが独自のドメインを排他的にロードする(つまり、外部Webサイトがない) )、サーバーはそのサブドメインの登録ビューへのアクセスのみを許可しているため、悪用するのは非常に困難です。CSRF攻撃はブラウザで発生する可能性があります。
CookieManagerを使用してアプリ内のサイトCookieからCSRF免除値を取得し、それをリクエストとともにPOST変数として追加します。そうすれば、ビューのCSRFを免除する必要はありません。これは基本的に、DjangoがAJAXCSRFを処理する方法です。登録する前に必ず@ensure_csrf_cookie
デコレータを使用して、CSRFCookieがクライアントに設定されていることを確認してください。
正直なところ、GCM登録のCSRFは、「夜更かしするための問題」トーテムポールについては非常に低いです。CSRFは、アカウント管理(パスワードの変更、銀行取引など)の問題です。