web-dev-qa-db-ja.com

ブラウザの戻るボタン/履歴からの情報漏えいを防ぎますか?

Webサイトでホストされる機密データがあり、このシナリオでデータが公開されないようにしたい:

  • プライマリユーザーがアプリケーションをログオフしたが、ブラウザを閉じなかった(キオスク環境を想定)

  • 次に、2番目の(悪意のある)ユーザーが端末に近づき、[戻る]ボタンを押すか、単に履歴を閲覧します。

その結果、悪意のあるユーザーは許可されていないコンテンツを表示できます。

  1. これを防ぐための私のオプションは何ですか?

  2. サイトを「ユーザーフレンドリー」に保ち、認証されたユーザーが認証されていない/許可されていない履歴を遡ることを許可するにはどうすればよいですか?

私が遊んでいたいくつかのアイデアには、

  • キャッシュ制御:キャッシュなし
  • 最終更新日
  • 期限切れ
  • また、ページの認証を更新するJavaScript

しかし、SSLまたは非SSLモードで動作しているときに、これらのさまざまな設定がWebブラウザーにどのように影響するかはわかりません。これはさらに複雑ですプロキシが関係する場合==になるため、専門家に確認することをお勧めします。

21
  1. SSLを使用する
  2. セッション管理を正しく実装していることを確認してください。たとえば、各ページでチェックされ、ログアウトによって破棄された正しいセッションIDの存在
  3. キャッシュ制御を追加:no-cache、pragma:no-cacheおよびexpire:-1ヘッダーをどこにでも
  4. フォームとすべての機密変数がPOSTリクエストを通じてのみ送信され、GETではないことを確認してください(コード監査中に、ページが理由なく両方のメソッドを受け入れる回数が無数に見られます)。
23
john

プロキシが変更する場合、SSLを使用しておらず、交換されたデータが「機密」である場合、SSLを使用しないことは非常に悪いことです。そういえば、キーロガーで「強化」できるパブリックキオスクの機密データもそうです。

ブラウザの意味で「ページを変更する」ことなく、JavaScriptを使用してコンテンツページをダウンロードおよび表示できます。次に、独自の戻るおよび進む「ボタン」を提供します。次に、実際のページ変更(ブラウザーの観点から)にフックを追加して、内部コンテンツを消去します。

ユーザーが新しいウィンドウを開いて「機密」ウィンドウを閉じるのを忘れた場合、上記のいずれもあなたを救いません。

7
Tom Leek

キャッシュ制御はSSL接続に適用され、ブラウザーで広くサポートされているため、これが最善のアプローチのようです。 SSLを介して接続している場合、プロキシは中間者でコンテンツを提供するか、単に無視して通常どおりルーティングします。それがMiTMを実行する場合、ブラウザーの証明書信頼チェックを破るので、大きな赤いエラーが表示され、(うまくいけば)ユーザーはキオスクから離れて何かを使用するように教えられます。そうでなければ、まあ、あなたはSOLです。

プロキシが接続をルーティングするだけで、cache-controlまたはExpired、またはLast-Modifiedヘッダーを渡した場合、ブラウザーはそれをサポートすると期待されます。ただし、問題が発生するのは、HTMLページのローカルキャッシュです。悪意のあるユーザーは、キャッシュからページを読み取るだけです。ブラウザがサポートしていない場合は、ユーザーにページを表示させないでください。ユーザーエージェントを確認し、サポートされている既知のバージョンのリストと比較してください。

もちろん、トムが言ったように、キオスクにキーロガーがインストールされている場合は、ゲームオーバーです。

6
Steve

古い質問ですが、現代の答えを追加します。

機密性の高い応答の場合、次のヘッダーを設定する必要があります。

Cache-Control: no-store, must-revalidate

最近では、おそらくHTTP 1.0 Expiresヘッダーについて心配する必要はありません。 Pragmaはリクエストのみであり、レスポンスではありません。

(ログインフォームが表示されるように)セッションタイムアウトの直後にページを更新するには、次のヘッダーを追加します。

Refresh: n + m

ここで、nはセッションがタイムアウトするまでの秒数、mはわずかな遅延です。 Javaこれは:

session.getMaxInactiveInterval() - ( System.currentTimeMillis() - session.getCreationTime() ) / 1000
3
Neil McGuigan

私のphpナビゲーションの経験では、いったんログオフしてログイン画面にリダイレクトしたり、ウィンドウを閉じたりすると、ナビゲートを戻すのは「困難」です。開いているページの開いているウィンドウのインスタンスは、期限切れになる前に許可されます。あなたが持っている安全な口を持つ安全なユーザーの数に応じて、CAPTCHAのバリエーションは、Cookieまたは記憶されたキーストロークを再利用する試みをキャプチャします。最も簡単な方法は、CAPTCHAピンジェネレータに所定の分散を追加することです。つまり生成されたpin#は5463です。誕生日14を追加します。CAPTCHAのコードでは、ifステートメントにユーザー文字列を追加するだけです。申し訳ありませんが、すばらしいとは言えませんが、あなたが説明したシナリオでは効果的で簡単です。

1
Z_TLAW

MSFTケースから#111101555217932

この機能は、HTTP POSTリクエスト内でデータを受け入れる任意のWebページで表示されます。AzureACSのロジックは、HTTP経由でフォームデータを送信するプロセスPOSTは実際にはブラウザの履歴にエントリとして表示されます。すぐにブラウザの履歴を確認すると、エントリはリストに「Working ...」と表示されます。これにより、このエントリに「戻る」ことができます。この「ページ」に戻ると、ブラウザはコンテンツの有効期限が切れていることを認識し、コンテンツの有効期限が切れているという情報を求め、そのページの「更新された」バージョンを取得するリクエストを再送信するかどうかを尋ねますサーバー。再試行ボタンをクリックすると、このフォームデータはADFSに戻され、ADFSはそれを通常のログインリクエストとして処理するので、そのリクエストを認証してSAMLトークンを送り返し、元のWebページに自動的にリダイレクトします。

他のブラウザでも同じ動作が見られます。

ですから、ユーザーが単に戻る、戻る、戻る、更新することで別のユーザーとしてログインすることを許可しないようにする方法を知りたいと思います。 IEチームとASP.NETチームといくつか話し合いましたが、この問題を回避するためにできることがいくつかありました。

クライアント側の回避策

  1. IE=チームからの提案の1つは、ログイン資格情報を直接受け入れないようにADFSログインページを変更することです。代わりに、ログオンを示すボタンが含まれています。ユーザーがこのログオンをクリックするとボタンをクリックすると、window.open()呼び出しを実行して、ADFS Webサイトでホストされている2番目のページに移動する2番目の小さなダイアログボックスを起動するjavascriptがあります。2番目のADFSページは、ユーザー名とパスワードを受け入れ、それを送信します。ダイアログのログイン後、そのウィンドウを閉じ、親ウィンドウを使用して証明書利用者アプリケーションに移動できます。

  2. 別の提案は、ここで説明されているように、location.replace()呼び出しを試すことです: http://www.4guysfromrolla.com/webtech/111500-1.2.shtml これにより、履歴リストからエントリが削除されます新しいページに移動します。

サーバー側の回避策

  1. 1つのオプションは、ユーザーがフォームデータの一部として時間ベースの値を送信することも要求するようにADFSログインページを変更することです。フォームにTimeSubmitted値を追加し、ユーザーがログインボタンをクリックしたときに、値を現在の時刻に設定し、それをログインデータの一部として送信するスクリプトがあるとします。次に、サーバー側でこの値を確認し、サーバーの現在の時刻より2〜5秒以上遅れている場合は、ログイン試行を拒否し、顧客に新しい新しいログインページを送り返して、手動でユーザー名/パスワードの組み合わせをもう一度。

  2. サーバー側のもう1つの提案は、ブラウザの履歴を操作して、「Working…」エントリを削除することです。これを行うには、ページのPreRenderイベント内でクライアント側スクリプトを発行できます。ですから、ログインページでは

     private void WebForm1_PreRender(object sender, System.EventArgs e)
     {
        if (IsPostBack)
     {
     Response.Write("<html><head><script>location.replace('"+Request.Path+"');\n"
     +"</script></head><body></body></html>\n");
     Response.End();
     }
    

POSTリクエストはIEのナビゲーション履歴から削除されます。履歴にはGETリクエストのみが含まれます。

  1. キオスクのブラウザナビゲーションバーを非表示にして、ページに戻るボタンと進むボタンを直接追加することもできます。ページ自体でページナビゲーション機能を処理する必要があり、ユーザーがADFSのログインページから「戻る」にナビゲートできないようにする必要があることは明らかです。

残念ながら、フォームデータがユーザーの認証とログオンに使用されている場合でも、誰かがフォームデータを再送信する機能を無効にするというこの問題を回避する簡単な方法はありません。提案されたすべての提案のうち、私はおそらく最初のサーバー側のソリューションを実装します。この場合、送信された時間を渡すだけで、サーバー時間から一定の差がある場合は、前回の成功したログイン試行の再投稿であるため、リクエストを無視します。

1