停止后退按钮暴露安全页面?

时间:2011-02-11 00:36:11

标签: php session

我遇到浏览器缓存(显然很常见)的问题,我的安全页面可以通过后退按钮访问(用户注销后)。

这是我的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中,我可以按下后退按钮(在注销后立即)并仍然可以看到安全内容。如果我刷新安全页面,它会将我引导至登录屏幕(应该如此。)

我尝试过使用:

<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);
?>

......这也无法解决&#34;问题。&#34; HMM。

3 个答案:

答案 0 :(得分:3)

如果您可以使用HTTPS,则结合Cache-control: no-cache标头将禁用“页面缓存”(内存/后向缓存的WebKit术语)。这样做的缺点是它将被禁用所有安全页面视图,而不仅仅是在注销后。 (Source;注意他们正在努力允许例外,值得关注这一点。)

如果您可以依赖JavaScript,附加unload事件处理程序将阻止“页面缓存”。这样做的好处是,只有在单击“注销”按钮或链接时才允许您仅通过附加unload事件处理程序来中断缓存。 (Source

这些解决方案都不是理想的,但其中一个可能是值得妥协的。

答案 1 :(得分:1)

这似乎是一个webkit / Safari问题。之前已经提出过这个问题,但没有明确答案 - Safari Back button not honouring PHP logout session

看看答案中的链接,我想你会在卸载活动中找到答案。

答案 2 :(得分:0)

部分问题是您将来要设置Expires标头。浏览器使用Expires标头作为指示某些内容应保留在缓存中的时间。试试这个:

  

$ offset = 60 * 60 * 24 * 3;
  $ ExpStr =“过期:”。 gmdate(“D,d M Y H:i:s”,time() - $ offset)。 “GMT”;
  报头($ ExpStr);

这会在过去设置一个过期标头,并强制浏览器每次都重新请求该页面。