私はPHPアプリケーションで作業していますが、実際にユーザーがログアウトしてブラウザの戻るボタンを押すと、セッションが破棄されていないかのように前のページを見ることができます:((こことウェブで見つけたものをすべて試しましたが、うまくいきません:'(
戻るボタンを無効にすることはできますか?
http://blog.priyakant.com/2014/09/23/browser-back-button-prevent/
概要:
ブラウザの戻るボタン – ログアウト後に前のページが表示されないようにする – Cookie ベースのアプローチ 投稿日: 2014 年 9 月 23 日 by Priyakant Patel — コメントを残す ログアウト後に前のページが表示されないようにする
クライアント ブラウザ アプリケーションは、パフォーマンス上の理由からページをキャッシュします。この場合、ユーザーが戻る (ブラウザの戻るボタン) をクリックすると、キャッシュから前のページが表示されます。
ケース 1 : ユーザーがまだログインしています。
前のページの内容を表示してもOKです。
ケース 2 : ユーザーがログアウトしています。
次のユーザーがブラウザの戻るボタンをクリックして、前のページのコンテンツを表示できる可能性があります。
これは、多くのアプリケーションで大きな問題になる可能性があります。金融アプリケーションでは、次のユーザーの可能性が金融データを見ることができます。または、医療/患者関連のアプリケーションは、HIPAA 違反である可能性があり、会社は大きな罰則に直面する可能性があります。
では、本題に戻りましょう。この問題を解決するにはどうすればよいでしょうか。
HTTP Cookie ベースのアプローチを提案しています。
手順:
スライド有効期限でサーバー側から HTTP Cookie を作成します。これはクライアント JavaScript からアクセスできます (注: ブラウザは有効期限が切れるとこの Cookie を消去します)。
ログアウト時にこの Cookie を消去する この Cookie が
見つからない場合は、ページをリロードしてください。この場合、サーバーはページを再認証し、必要に応じてログイン ページにリダイレクトします
。
これが ASP.NET を使用した私の実装です。実装はサーバー テクノロジによって異なりますが、考え方は変わりません。
(サーバ側)。スライド有効期限付きのサーバー側から HTTP Cookie を作成する
Response.SetCookie(new HttpCookie(“TimeoutCookieName”, "1") { Expires = DateTime.UtcNow.AddMinutes(10) });
//NOTE 10 == Session Timeout. This will be same as your application login session timeout.
(サーバ側)。ログアウト時にこの Cookie をクリアする
Response.SetCookie(new HttpCookie(“TimeoutCookieName”, "1") { Expires = DateTime.UtcNow});
(クライアント側) : (次のスクリプトは BODY タグの直後に存在する必要があります)
window.preventBackButton = function () {
try {
if (document && (!document.cookie || document.cookie.indexOf('_tc=1') < 0)) {
window.document.body.style.display = 'none'; window.location = window.location;
}
} catch (e) { }
};
window.preventBackButton(); //Call immediately after body tag
次のように ASP.NET 実装を見つけてください。
////C# Helper class - Start
using System;
using System.Web;
namespace MyHelpers {
public static class MyHtmlHelper {
public const string TimeoutCookieName = "_tc";
public static HtmlString PreventBackButtonScript(HttpResponseBase response) {
response.SetCookie(new HttpCookie(TimeoutCookieName, "1") { Expires = DateTime.UtcNow.AddMinutes(10) });
var clientScript = "window.-reventBackButton = function() {
try {
if(document && (!document.cookie || document.cookie.indexOf('" + TimeoutCookieName + "=1') < 0)) {
window.document.body.style.display='none'; window.location = window.location;
}
} catch(e) {}
};
window.preventBackButton();";
return new HtmlString(clientScript);
}
public static void SafeUnSetTimeoutCookie(this HttpResponseBase response) {
response.SetCookie(new HttpCookie(TimeoutCookieName, "0") { Expires = DateTime.UtcNow.AddYears(-5) });
}
}
}
////C# Helper class - End
//Shared\_Layout.cshtml
//Make sure not to include after logout OR login page
<html>
<body>
@MyHelpers.MyHtmlHelper.PreventBackButtonScript(Response)
.
.
<⁄body>
<⁄html>
戻るボタンを無効にすることはできません。以前にログアウトしたユーザーのページが表示される場合は、セッション チェック スクリプトがどこかで失敗しています。ログアウト フォームを送信するときにプロセス スクリプトを使用し、現在ログアウトしているユーザーをメイン ページにリダイレクトします (該当する場合)。
できません。ブラウザはページをキャッシュするため、ページをロードするたびに Web サーバーにリクエストする必要はありません。戻るボタンを押すと、サーバーに問い合わせずに最後のページが読み込まれます。
おそらく、各ページ要求で送り返すキャッシング ヘッダーに関係している可能性があります。短時間しか有効でないコンテンツがあるため、ページを生成するときにヘッダーを送り返して、ブラウザーにローカルにキャッシュしないように指示する必要があります。
ページのキャッシュを無効にする例http://www.w3schools.com/php/func_http_header.asp :
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");
ユーザーのキャッシュ/セッションをクリアしていますか? 彼らが反撃したとしても、ログアウト時にセッションをクリアしても、ログインしたままにするべきではないと思います。
編集: 編集する前に - OP 以外の誰かが - この質問は、ブラウザの戻るボタンを無効にできるかどうかを尋ねました。その質問に対する私の最初の回答は以下のとおりです。また、明確にする必要があると感じています。戻るボタンを本質的に「壊す」ための以下のアプローチは、私が推奨または好むアプローチではありません。戻るボタンなどの基本的なブラウザー機能を使用するときに、その使用を妨げようとするのではなく、適切に反応するようにアプリケーションを設計する必要があります。
ユーザーのブラウザの戻るボタンを無効にすることはできません。これは、オーバーライドできないブラウザーの基本的な機能です。
ユーザーが元に戻った場合にアプリケーションが中断する (エラー メッセージが表示され、ユーザーが最初からやり直すか、要求を再送信する必要がある) ようにすることができます。アプリケーションを設計したときに戻るボタンを考慮に入れていなかったことを認めているため、これを行うのは悪い考えです。すべてのアプリケーション、注文フォーム、ショッピング カートなども、正しく設計されていれば、戻るボタンを使用できるはずです。
戻るボタンの使用を中断するために私が見た 1 つのアプローチは、アプリケーション内のすべての URL とすべてのフォーム内でトークンを渡すことです。トークンはすべてのページで再生成され、ユーザーが新しいページを読み込むと、前のページのトークンはすべて無効になります。
ユーザーがページをロードすると、正しいトークン (前のページのすべてのリンク/フォームに与えられたもの) が渡された場合にのみページが表示されます。
私の銀行が提供するオンライン バンキング アプリケーションは、このようなものです。戻るボタンを使用すると、リンクが機能せず、ページのリロードもできなくなります。代わりに、戻ることができないため、最初からやり直す必要があるという通知が表示されます。
とはいえ、ユーザーが戻ったときにアプリケーションが壊れるようにすることは悪い考えであり、アプリケーションの設計が貧弱であることを思い出してください。