23

ログオンが必要で機密情報を表示する Web サイトがあります。

ユーザーはそのページにアクセスし、ログインするよう求められ、情報を確認できます。

ユーザーはサイトからログアウトし、ログイン ページにリダイレクトされます。

次に、「戻る」をクリックして、機密情報が含まれているページにすぐに戻ることができます。ブラウザはそれをレンダリングされた HTML と見なすだけなので、問題なく表示されます。

その人がログアウトした画面から「戻る」ボタンを押したときに、その情報が表示されないようにする方法はありますか? 戻るボタン自体を無効にしようとしているわけではありません。その人がサイトにログインしていないため、機密情報が再び表示されないようにしているだけです。

議論のために、上記のサイト/シナリオはフォーム認証を使用した ASP.NET です (したがって、ユーザーが目的のページである最初のページに移動すると、ログオン ページにリダイレクトされます。違い)。

4

16 に答える 16

13

簡単に言えば、安全に行うことはできないということです。

ただし、ユーザーが反撃して機密データを表示するのを困難にするために実装できる多くのトリックがあります.

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(Now.AddSeconds(-1));
Response.Cache.SetNoStore();
Response.AppendHeader("Pragma", "no-cache");

これにより、クライアント側でキャッシュが無効になりますが、これはすべてのブラウザーでサポートされているわけではありません。

AJAX を使用するオプションがある場合、クライアント コードから更新される更新パネルを使用して機密データを取得できるため、クライアントがまだログインしていない限り、応答時に表示されません。

于 2008-09-17T22:48:08.180 に答える
9

キャッシュと履歴は独立しており、相互に影響を与えるべきではありません。

銀行の唯一の例外は、履歴内を移動するときにHTTPSとCache-Control: must-revalidate強制更新の組み合わせです。

プレーンHTTPでは、ブラウザのバグを悪用する以外にこれを行う方法はありません。

「キラー」Cookieが設定されたときにチェックdocument.cookieしてリダイレクトするJavascriptを使用してハックすることもできますが、ブラウザが期待どおりにCookieを設定/クリアしない場合、これは深刻な問題になる可能性があります。

于 2008-10-19T22:57:25.233 に答える
3

aspdev.orgから:

Page_Load イベント ハンドラーの上に次の行を追加すると、ASP.NET ページがユーザーのブラウザーにキャッシュされなくなります。

Response.Cache.SetCacheability(HttpCacheability.NoCache)

このプロパティを設定すると、ユーザーが戻るボタンを押すとコンテンツが消え、「更新」を押すとログイン ページにリダイレクトされます。

于 2008-09-15T15:44:06.470 に答える
1

DannySmurf、<meta> 要素は、キャッシングの制御に関しては非常に信頼性が低く、特にプラグマはさらにそうです。 参照

于 2008-09-15T16:10:46.140 に答える
1

dannyp などと同様に、no-cache はキャッシュが機密リソースを格納するのを止めません。これは、最初に再検証しないと、キャッシュが保存したリソースを提供できないことを意味するだけです。機密性の高いリソースがキャッシュされないようにする場合は、no-store ディレクティブを使用する必要があります。

于 2008-09-15T16:14:19.423 に答える
1

JavaScript 関数でクイック サーバー チェック (ajax) を実行し、ユーザーがログインしていない場合は、現在のページを消去してメッセージに置き換えることができます。これは、javascript がオフになっているユーザーに対して明らかに脆弱ですが、それは非常にまれです。利点として、これはブラウザとサーバーの両方のテクノロジ (asp/php など) に依存しません。

于 2009-04-20T15:53:22.983 に答える
0

完全を期すために:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1));
于 2008-09-15T15:59:16.307 に答える
0

少し面倒ですが、Java アプレットまたはフラッシュ アプリケーションが埋め込まれていて、それを介して認証が行われている場合は、毎回サーバーで「リアルタイム」に認証する必要があるようにすることができます。彼らは情報を見たいと思っていました。

これを使用すると、情報を暗号化することもできます。

誰かが機密情報をオンにしたままページを保存できる可能性は常にありますが、キャッシュがないとこの状況は回避できません (ただし、Flash または Java アプリケーションのスクリーンショットはいつでも取得できます)。

于 2008-09-15T15:55:56.720 に答える
0

機密情報を含む Web ページを HTTP POST として返すことができます。その後、ほとんどの場合、データを再送信するかどうかを尋ねるメッセージがブラウザーから表示されます。(残念ながら、この動作の標準的なソースを見つけることができません。)

于 2009-01-06T16:17:25.257 に答える
0

世界で最も安全で効率的なホーム バンキング ソフトウェアの 1 つを持っていることで知られるブラジルの大手銀行 (Banco do Brasil) では、各ページに history.go(1) を挿入するだけです。戻るボタンで戻ります。単純。

于 2008-09-15T18:13:40.743 に答える
0

HTTP 応答ヘッダーを調べてください。人々が投稿しているほとんどの ASP コードは、それらを設定しているようです。必ず。

O'Reillyのシマリスの本は HTTP のバイブルであり、Chris Shiflett の HTTP の本も優れています。

于 2008-09-20T06:00:40.347 に答える
0

no-cache ディレクティブを探しています:

<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">

マスター ページのデザインが進んでいる場合、これは少し面倒かもしれませんが、サイトの残りの部分に影響を与えることなく、このディレクティブを 1 つのページに配置できると思います (それが必要であると仮定します)。

このディレクティブが設定されている場合、ブラウザは忠実にサーバーに戻り、ページの新しいコピーを探します。これにより、サーバーはユーザーが認証されていないことを認識し、ログイン ページに移動します。

于 2008-09-15T15:44:29.917 に答える
0

ログアウト操作をPOST. 次に、ブラウザは「フォームを再投稿してもよろしいですか?」というプロンプトを表示します。ページを表示するのではなく、

于 2008-09-15T15:44:57.467 に答える
0

ASP.NET でそれを行う方法がわかりませんが、PHP では次のようにします。

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");

これにより、ブラウザはアイテムを再チェックするように強制されるため、認証チェックがトリガーされ、ユーザー アクセスが拒否されます。

于 2008-09-15T15:45:26.420 に答える
0

正解は、応答に HTTP Cache-Control ヘッダーを設定することです。出力をキャッシュしないようにしたい場合は、Cache-Control: no-cache を実行できます。こちらもノーストアとのコーディネートでよく使われます。

制限付きのキャッシュが必要な場合のその他のオプションには、有効期限の設定と再検証が必要なものが含まれますが、これらすべてにより、キャッシュされたページが再度表示される可能性があります。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4を参照してください。

于 2008-09-15T15:45:31.363 に答える
0

私はちょうど銀行の例を念頭に置いていました。

私の銀行のページにはこれがあります:

<meta http-equiv="expires" content="0" />

これはこれくらいでいいと思います。

于 2009-04-20T09:48:58.537 に答える