2011-02-11 91 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 2011-02-11 00:43:53

+0

相關:http:// stackoverflow。com/questions/64059/is-a-way-to-keep-a-page-from-rendering-once-a-person-has-logged-out-but-hit – 2011-02-11 00:47:35

+1

一旦內容被傳遞,已不再安全。 – 2011-02-11 00:49:47

回答

3

如果您可以使用HTTPS,則結合Cache-control: no-cache標頭將禁用「頁面緩存」(WebKit術語,用於內存/後退緩存)。其缺點是它將被禁用所有安全頁面瀏覽,而不僅僅是註銷後。 (Source;注意他們正在研究允許例外情況,值得關注這一點。)

如果您可以依賴於JavaScript,附加一個unload事件處理程序將阻止「頁面緩存」。這也有利於您僅在單擊「註銷」按鈕或鏈接時纔打破緩存,只需附加事件處理程序即可。 (Source

這些解決方案都不是理想的,但其中一個解決方案可能是一個值得的妥協。

0

問題的一部分是您將來設置了一個Expires標題。瀏覽器使用Expires標題作爲指示器應該保留在緩存中的時間。試試這個:

$ offset = 60 * 60 * 24 * 3;
$ ExpStr =「過期:」。 gmdate(「D,d M Y H:i:s」,time() - $ offset)。 「 格林威治標準時間」;
標題($ ExpStr);

這將在過去設置過期標題,並強制瀏覽器每次重新請求頁面。