2011-02-11 8 views
5

나는 브라우저 캐시와 (분명히 공통) 문제가 발생하고있어, 내 보안 페이지 뒤로 가기 버튼을 통해 액세스 할 수있는 (사용자 로그 아웃 후.) 여기 뒤로 단추를 눌러 보안 페이지를 표시하지 않습니까?

내 logout.php

<?php 
    // 1. Find the session 
    session_start(); 

    // 2. Unset all the session variables 
    $_SESSION = array(); 

    // 3. Destroy the session cookie 
    if(isset($_COOKIE[session_name()])) { 
     setcookie(session_name(), '', time()-42000, '/'); 
    } 

    // 4. Destroy the session 
    session_destroy(); 

    redirect_to('index.php?logout=1'); 
?> 

이있다 IE7, IE8, Chrome 및 Firefox에서 사용자를 성공적으로 로그 아웃합니다.하지만 Safari에서는 로그 아웃 한 후 뒤로 버튼을 누르고 보안 콘텐츠를 볼 수 있습니다. 나는 보안 페이지를 새로 고침 경우 (예상대로). 로그인 화면에 저를 부팅

당신은 http://labs.inversepenguin.com @ 스스로를 시도 할 수 있습니다 (사용자 : & 패스 스택 :. 오버 플로우를)

내가 사용하려고했습니다 :

<META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 
<META HTTP-EQUIV="Expires" CONTENT="-1"> 

... 그러나 효과가 없습니다. 누구든지 조언을 해줄 수 있습니까? 나는 브라우저 캐싱에 this article 발견했습니다,하지만 난 발견했다하지만 난 ... 그 안에 답변을 찾을 아직 ". 문제"

<?php 
Header("Cache-Control: must-revalidate"); 

$offset = 60 * 60 * 24 * 3; 
$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT"; 
Header($ExpStr); 
?> 

...하는도 해결되지 않습니다 흠.

+0

브라우저는 데이터를 캐시하고 나중에 "뒤로"버튼을 누르면 나중에 표시 할 수 있습니다. 그게 아마도 여기서 일어나는 일이고, 당신이 할 수있는 일이별로 없습니다. – You

+0

관련 : http : // stackoverflow.com/questions/64059/once-a-way-to-keep-a-way-to-keep-a-person-have-logged-out-but-hit –

+1

일단 콘텐츠가 전달되면 더 이상 안전하지 않습니다. –

답변

3

HTTPS를 사용할 수있는 경우 Cache-control: no-cache 헤더와 결합하면 "페이지 캐시"(메모리 캐시/역방향 캐시의 WebKit 용어)가 비활성화됩니다. 단점은 로그 아웃 후에뿐 아니라 모든 보안 페이지 뷰에 대해 비활성화된다는 것입니다. (Source; 예외를 허용하는 데주의를 기울이고 있습니다.)

JavaScript를 사용하는 경우 unload 이벤트 핸들러를 연결하면 "페이지 캐시"가 차단됩니다. 이것은 "로그 아웃"버튼이나 링크가 클릭되었을 때만 캐시를 깨기 위해 unload 이벤트 핸들러를 첨부 할 수도 있습니다. (Source)

이러한 솔루션 중 어느 쪽도 이상적이지 않지만 그 중 하나는 가치있는 절충안입니다.

1

이것은 웹킷/사파리 문제인 것처럼 보입니다. 여기에 결정적인 대답이 없이는 전에 묻습니다 - Safari Back button not honouring PHP logout session

답변에서 링크를 살펴보면 언로드 이벤트에서 답을 찾을 수있을 것 같아요.

+0

나는 이것이 "문제"라는 개념에 동의하지 않습니다. 뒤로 버튼을 누르면 원래 페이지를 방문 할 때 보았던 것과 똑같은 것을 볼 수 있습니다. 나는 다른 모든 브라우저가 이것을 잘못하고 있다고 말할 정도로까지 갈 것입니다. – You

+0

처음부터 로그 아웃의 목적을 완전히 이기기 때문에 확실히 문제가됩니다. 로그 아웃 버튼을 클릭해도 사이트의 보안 부분에 들어가는 것을 막지 못하면 무엇을합니까? –

+0

@Brent : HTTP에는 "entry"또는 "exit"개념이 없습니다. URL을 통해 리소스를 요청하는 것뿐입니다. 상태가 유지되지 않습니다. "로그 아웃"을 클릭하면 실제로 로그 아웃됩니다. 브라우저가 캐시 한 경우에는 뒤로 버튼을 클릭하여 방금 로그 아웃 한 페이지를 다시 볼 수 있습니다 (HTTP 응답 캐시 헤더를 존중하는 경우에는 없어야 함). 그러나 이것이 여전히 로그인되어 있거나 페이지의 링크가 계속 작동 함을 의미하지는 않습니다. 이것은 중요한 사이트 (예 : 은행)가 로그 아웃 한 후에 항상 브라우저를 닫으려는 이유입니다. – alexantd

0

문제의 일부는 앞으로 Expires 헤더를 설정하는 것입니다. 브라우저는 무언가가 캐시에 남아 있어야하는 시간의 지표로 Expires 헤더를 사용합니다. 이것을 시도하십시오 :

$ offset = 60 * 60 * 24 * 3;
$ ExpStr = "만료 :". gmdate ("D, d M Y H : i : s", 시간() - $ 오프셋). "GMT";
헤더 ($ ExpStr);

이전에는 만료 헤더를 설정하고 브라우저가 매번 페이지를 다시 요청하도록합니다.

+0

'header ("Expires : Mon, 1997 년 7 월 23 일 05:00:00 GMT")를 시도했지만 아무 소용이 없다. Safari는 여전히 페이지에 대한 액세스를 허용합니다. – jlmakes

관련 문제