Webサイトでホストされる機密データがあり、このシナリオでデータが公開されないようにしたい:
プライマリユーザーがアプリケーションをログオフしたが、ブラウザを閉じなかった(キオスク環境を想定)
次に、2番目の(悪意のある)ユーザーが端末に近づき、[戻る]ボタンを押すか、単に履歴を閲覧します。
その結果、悪意のあるユーザーは許可されていないコンテンツを表示できます。
これを防ぐための私のオプションは何ですか?
サイトを「ユーザーフレンドリー」に保ち、認証されたユーザーが認証されていない/許可されていない履歴を遡ることを許可するにはどうすればよいですか?
私が遊んでいたいくつかのアイデアには、
しかし、SSLまたは非SSLモードで動作しているときに、これらのさまざまな設定がWebブラウザーにどのように影響するかはわかりません。これはさらに複雑ですプロキシが関係する場合==になるため、専門家に確認することをお勧めします。
プロキシが変更する場合、SSLを使用しておらず、交換されたデータが「機密」である場合、SSLを使用しないことは非常に悪いことです。そういえば、キーロガーで「強化」できるパブリックキオスクの機密データもそうです。
ブラウザの意味で「ページを変更する」ことなく、JavaScriptを使用してコンテンツページをダウンロードおよび表示できます。次に、独自の戻るおよび進む「ボタン」を提供します。次に、実際のページ変更(ブラウザーの観点から)にフックを追加して、内部コンテンツを消去します。
ユーザーが新しいウィンドウを開いて「機密」ウィンドウを閉じるのを忘れた場合、上記のいずれもあなたを救いません。
キャッシュ制御はSSL接続に適用され、ブラウザーで広くサポートされているため、これが最善のアプローチのようです。 SSLを介して接続している場合、プロキシは中間者でコンテンツを提供するか、単に無視して通常どおりルーティングします。それがMiTMを実行する場合、ブラウザーの証明書信頼チェックを破るので、大きな赤いエラーが表示され、(うまくいけば)ユーザーはキオスクから離れて何かを使用するように教えられます。そうでなければ、まあ、あなたはSOLです。
プロキシが接続をルーティングするだけで、cache-controlまたはExpired、またはLast-Modifiedヘッダーを渡した場合、ブラウザーはそれをサポートすると期待されます。ただし、問題が発生するのは、HTMLページのローカルキャッシュです。悪意のあるユーザーは、キャッシュからページを読み取るだけです。ブラウザがサポートしていない場合は、ユーザーにページを表示させないでください。ユーザーエージェントを確認し、サポートされている既知のバージョンのリストと比較してください。
もちろん、トムが言ったように、キオスクにキーロガーがインストールされている場合は、ゲームオーバーです。
古い質問ですが、現代の答えを追加します。
機密性の高い応答の場合、次のヘッダーを設定する必要があります。
Cache-Control: no-store, must-revalidate
最近では、おそらくHTTP 1.0 Expires
ヘッダーについて心配する必要はありません。 Pragma
はリクエストのみであり、レスポンスではありません。
(ログインフォームが表示されるように)セッションタイムアウトの直後にページを更新するには、次のヘッダーを追加します。
Refresh: n + m
ここで、n
はセッションがタイムアウトするまでの秒数、m
はわずかな遅延です。 Javaこれは:
session.getMaxInactiveInterval() - ( System.currentTimeMillis() - session.getCreationTime() ) / 1000
私のphpナビゲーションの経験では、いったんログオフしてログイン画面にリダイレクトしたり、ウィンドウを閉じたりすると、ナビゲートを戻すのは「困難」です。開いているページの開いているウィンドウのインスタンスは、期限切れになる前に許可されます。あなたが持っている安全な口を持つ安全なユーザーの数に応じて、CAPTCHAのバリエーションは、Cookieまたは記憶されたキーストロークを再利用する試みをキャプチャします。最も簡単な方法は、CAPTCHAピンジェネレータに所定の分散を追加することです。つまり生成されたpin#は5463です。誕生日14を追加します。CAPTCHAのコードでは、ifステートメントにユーザー文字列を追加するだけです。申し訳ありませんが、すばらしいとは言えませんが、あなたが説明したシナリオでは効果的で簡単です。
MSFTケースから#111101555217932
この機能は、HTTP POSTリクエスト内でデータを受け入れる任意のWebページで表示されます。AzureACSのロジックは、HTTP経由でフォームデータを送信するプロセスPOSTは実際にはブラウザの履歴にエントリとして表示されます。すぐにブラウザの履歴を確認すると、エントリはリストに「Working ...」と表示されます。これにより、このエントリに「戻る」ことができます。この「ページ」に戻ると、ブラウザはコンテンツの有効期限が切れていることを認識し、コンテンツの有効期限が切れているという情報を求め、そのページの「更新された」バージョンを取得するリクエストを再送信するかどうかを尋ねますサーバー。再試行ボタンをクリックすると、このフォームデータはADFSに戻され、ADFSはそれを通常のログインリクエストとして処理するので、そのリクエストを認証してSAMLトークンを送り返し、元のWebページに自動的にリダイレクトします。
他のブラウザでも同じ動作が見られます。
ですから、ユーザーが単に戻る、戻る、戻る、更新することで別のユーザーとしてログインすることを許可しないようにする方法を知りたいと思います。 IEチームとASP.NETチームといくつか話し合いましたが、この問題を回避するためにできることがいくつかありました。
IE=チームからの提案の1つは、ログイン資格情報を直接受け入れないようにADFSログインページを変更することです。代わりに、ログオンを示すボタンが含まれています。ユーザーがこのログオンをクリックするとボタンをクリックすると、window.open()呼び出しを実行して、ADFS Webサイトでホストされている2番目のページに移動する2番目の小さなダイアログボックスを起動するjavascriptがあります。2番目のADFSページは、ユーザー名とパスワードを受け入れ、それを送信します。ダイアログのログイン後、そのウィンドウを閉じ、親ウィンドウを使用して証明書利用者アプリケーションに移動できます。
別の提案は、ここで説明されているように、location.replace()呼び出しを試すことです: http://www.4guysfromrolla.com/webtech/111500-1.2.shtml これにより、履歴リストからエントリが削除されます新しいページに移動します。
1つのオプションは、ユーザーがフォームデータの一部として時間ベースの値を送信することも要求するようにADFSログインページを変更することです。フォームにTimeSubmitted値を追加し、ユーザーがログインボタンをクリックしたときに、値を現在の時刻に設定し、それをログインデータの一部として送信するスクリプトがあるとします。次に、サーバー側でこの値を確認し、サーバーの現在の時刻より2〜5秒以上遅れている場合は、ログイン試行を拒否し、顧客に新しい新しいログインページを送り返して、手動でユーザー名/パスワードの組み合わせをもう一度。
サーバー側のもう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リクエストのみが含まれます。
残念ながら、フォームデータがユーザーの認証とログオンに使用されている場合でも、誰かがフォームデータを再送信する機能を無効にするというこの問題を回避する簡単な方法はありません。提案されたすべての提案のうち、私はおそらく最初のサーバー側のソリューションを実装します。この場合、送信された時間を渡すだけで、サーバー時間から一定の差がある場合は、前回の成功したログイン試行の再投稿であるため、リクエストを無視します。