2011-02-11 92 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);

这将在过去设置过期标题,并强制浏览器每次重新请求页面。