web-dev-qa-db-ja.com

機密情報の電子タグ

特定のユーザーだけが見ることができる大きなJSONドキュメントがあり、それはめったに変更されないが、それが変更された場合、ユーザーは変更が非常に迅速に表示されることを期待しているとします。これにはetagsを使用するのが理にかなっています。変更されていない場合は、ネットワーク経由で転送されているドキュメント全体を保存し、変更されている場合はドキュメントを送信します。

1つのリスクは、複数のユーザーが同じブラウザウィンドウを使用する場合に発生するようです。

  • アリスはサイトにサインインし、リソースはetagで彼女に送信されます
  • アリスはサインアウトして昼食を取りに行きます
  • ボブは自分のブラウザを使用して自分自身としてサインインしますが、リソースを表示できません
  • Bobはブラウザキャッシュを調べ、ブラウザによって保存されたetagを確認し、同じetagを送信するようにブラウザを設定します-これでBobはデータを見ることができます

ボブはすでにアリスのブラウザインスタンスを使用しているので、彼はすでにキャッシュにあるものを見ることができ、したがってとにかくデータを読み取ることができたと思います。

機密情報にetag(または一般にブラウザキャッシング)を使用する安全な方法はないようです。JavaScriptを使用してメモリにデータを保存するだけです。それとも、使用するための特定の方法がないのですか?

6
Paul Stovell

Etagを使用してデータを取得する

サーバーが適切に実装されている場合、etagだけを知っていても、秘密のリソースを取得するのに役立ちません。ブラウザは、etagが有効かどうかをサーバーに確認します(If-None-Matchヘッダーを使用)。

アリスがリクエストを行うと、アリスは認証されるため、サーバーは304 Not Modifiedで応答し、キャッシュからリソースをロードするようブラウザに指示する必要があります。

しかし、ボブがリクエストを行うとき、彼は認証されていないため、サーバーは403 Forbiddenで応答する必要があります。その後、ブラウザはキャッシュから何もロードしません(そして、BobがAliceとは異なるブラウザを使用している場合は、ロードするものは何もありません)。

これらすべては、Cache-Controlno-cache(または存在しない)に設定されているという前提に基づいています。そうでない場合、ブラウザはサーバーに確認せずにキャッシュからリソースを直接ロードします。ボブとアリスが同じブラウザを使用している場合、ボブは認証されていなくても、ページのアリスバージョンを取得します。

ブラウザのキャッシュからリソースを盗む

ご指摘のとおり、etagを盗むだけでなく、Bobはキャッシュから実際のリソースを盗むだけです。

最新のブラウザは、これをさまざまな方法で保護します。 AliceとBobが同じOSユーザーを使用しているか、Bobがrootまたはadmin(OSによって異なる)でない限り、これはエクスプロイトを利用しないと実行できません。

それでも、リソースが非常に機密性が高く、信頼できない人と共有されているコンピューターでユーザーがリソースにアクセスすることが予想される場合は、Cache-Control: no-storeを設定してすべてのキャッシュを無効にすることを検討する必要があります。

3
Anders