2010-08-12 1 views
2

저는 PHP 응용 프로그램에서 작업하고 있지만 사실 사용자가 로그 아웃하고 브라우저의 뒤로 버튼을 로그 아웃 한 후를 누르면 이전 페이지를 볼 수있는 것처럼 문제가 있습니다. 세션이 파괴되지 않은 : ((나는 여기 웹에서 찾은 모든 것을 시도했지만 작동하지 않습니다 '(로그 아웃 후 이전 페이지를 표시하지 못하게합니다.

나는 뒤로 버튼을 비활성화 할 수 있습니다

+0

나는 당신의 브라우저 – mint

+1

가능한 중복 뒤로 버튼을 해제 할 수 있다고 생각하지 않습니다 [안 브라우저의 뒤로 버튼 (http://stackoverflow.com/questions/961188/disable- 브라우저 - 뒤로 버튼) – thomasrutter

+1

다른 복제본 : http://stackoverflow.com/questions/3359941/how-to-disable-back-button-navigation-on-certain-pages – thomasrutter

답변

0

당신은 뒤로 버튼을 비활성화 할 수 없습니다? 사용자의 브라우저에서 오버라이드 할 수없는 브라우저의 기본 기능입니다.

애플리케이션이 깨지도록 만들 수 있습니다 (disp 사용자가 다시 시작해야하거나 요청을 다시 제출해야한다는 오류 메시지가 표시됨). 응용 프로그램을 디자인 할 때 뒤로 버튼을 고려하지 않았다는 사실을 인정하기 때문에 이렇게하는 것은 좋지 않습니다. 모든 응용 프로그램, 주문 양식, 쇼핑 카트 등, 올바르게 설계된 경우 뒤로 버튼을 사용할 수 있어야합니다.

내가 뒤로 버튼 사용을 깨뜨린 것에 대한 한 가지 접근법은 응용 프로그램 내의 모든 URL과 모든 양식 내에서 토큰을 전달하는 것입니다. 토큰은 모든 페이지에서 다시 생성되며 사용자가 새 페이지를로드하면 이전 페이지의 토큰이 무효화됩니다.

사용자가 페이지를로드 할 때 올바른 토큰 (이전 페이지의 모든 링크/양식에 지정된)이 전달 된 경우에만 페이지가 표시됩니다.

은행에서 제공하는 온라인 뱅킹 응용 프로그램은 이와 같습니다. 뒤로 버튼을 전혀 사용하지 않으면 링크가 더 이상 작동하지 않으며 더 이상 페이지를 다시로드 할 수 없습니다. 다시 돌아갈 수 없다는 알림이 표시되고 다시 시작해야합니다.

즉, 사용자가 돌아 가면 응용 프로그램이 중단되므로 응용 프로그램 디자인이 좋지 않다고 생각합니다.

+0

질문을 다루기 시작하지 않습니다. – aaronasterling

0

사용자의 캐시/세션을 지우시겠습니까? 그들이 다시 치기는하지만 로그 아웃시 세션을 지우면 로그인 상태를 유지해야한다고 생각하지 않습니다.

0

뒤로 버튼을 비활성화 할 수 없습니다. 이전에 로그 아웃 한 사용자의 페이지를 볼 수 있으면 세션 확인 스크립트가 어딘가에 실패합니다. 로그 아웃 양식을 제출하고 현재 로그 아웃 한 사용자를 기본 페이지로 리디렉션 할 때 프로세스 스크립트를 사용하십시오 (적용 가능한 경우).

0

수 없습니다. 브라우저는 페이지를 캐싱 할 때마다 웹 서버에서 페이지를 요청할 필요가 없도록 페이지를 캐시합니다. 뒤로 버튼을 누르면 서버에 묻지 않고 마지막 페이지가로드됩니다.

1

각 페이지 요청에서 다시 보내는 캐싱 헤더와 관련이 있습니다. 짧은 시간 동안 만 유효한 컨텐츠가 있으므로 브라우저에서 로컬로 캐시하지 않도록 페이지를 생성 할 때 헤더를 다시 보내야합니다.여기 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"); 
2

http://blog.priyakant.com/2014/09/23/browser-back-button-prevent/

요약 :

브라우저 뒤로 버튼 - 9 월에 게시 쿠키 기반의 접근 방식 - 로그 아웃 한 후 이전 페이지의 표시 방지 Priyakant Patel의 2020 년 23 월 23 일 - 코멘트 남기기 로그 아웃 후 이전 페이지 표시 방지

성능상의 이유로 클라이언트 브라우저 응용 프로그램 페이지를 캐시합니다. 이 경우 사용자가 뒤로 (브라우저 뒤로 버튼)을 클릭하면 캐시의 이전 페이지가 표시됩니다.

사례 1 : 사용자는 여전히에 기록됩니다

는 이전 페이지의 내용을 표시하는 OK입니다..

사례 2 : 사용자가 로그 아웃되었습니다.

잠재적으로 다음 사용자는 브라우저의 뒤로 버튼을 클릭 할 수 있으며 이전 페이지의 내용을 볼 수 있습니다.

많은 응용 프로그램에서 큰 문제가 될 수 있습니다. 금융 애플리케이션에서 다음 잠재 고객은 재무 데이터를 볼 수 있습니다. 또는 의료/환자 관련 응용 프로그램이 HIPAA 위반 일 수 있으며 회사는 큰 벌칙에 직면 할 수 있습니다.

그럼이 문제를 어떻게 해결할 수 있습니까?

저는 HTTP 쿠키 기반 접근 방식을 제안합니다.

단계 :

슬라이딩 만료와 함께 서버 쪽에서 HTTP 쿠키를 만듭니다. Client JavaScript에서 액세스 할 수 있습니다 (참고 : Browser는 만료시이 쿠키를 지 웁니다).
로그 아웃시이 쿠키 지우기
이 쿠키를 찾지 못한 경우 페이지를 다시로드하십시오. 이 경우 서버는 페이지를 다시 인증하고 필요한 경우 로그인 페이지로 리디렉션합니다.
그게 끝났습니다.

다음은 ASP.NET을 사용하여 구현 한 것입니다. 구현은 서버 기술에 따라 다르지만 아이디어는 동일하게 유지됩니다.

  1. (서버 측). 슬라이딩 만료와 함께 서버 쪽에서 HTTP 쿠키 만들기

    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. 
    
  2. (서버 쪽) 로그 아웃에

    Response.SetCookie(new HttpCookie(“TimeoutCookieName”, "1") { Expires = DateTime.UtcNow}); 
    
  3. (클라이언트 사이드)이 쿠키를 지우십시오 : (다음 스크립트해야는 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> 
관련 문제