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

jlm*_*kes 6 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');
?>
Run Code Online (Sandbox Code Playgroud)

这成功地在IE7,IE8,Chrome和Firefox上注销用户 - 但在Safari中,我可以按后退按钮(在注销后立即)并仍然可以看到安全内容.如果我刷新安全页面,它会将我引导到登录屏幕(应该如此).

我尝试过使用:

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">
Run Code Online (Sandbox Code Playgroud)

......但它没有效果.有人可以提供任何建议吗?我发现这篇关于浏览器缓存的文章,但我还没有在其中找到答案......虽然我确实找到了:

<?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);
?>
Run Code Online (Sandbox Code Playgroud)

......这也解决不了"问题".嗯.

eye*_*ess 3

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

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

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