php - 阻止后退按钮暴露安全页面?

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

...这也没有解决“问题”。嗯。

最佳答案

如果您可以使用 HTTPS,这与 Cache-control: no-cache header 结合将禁用“页面缓存”(内存中/后退缓存的 WebKit 术语)。这样做的缺点是它将对所有安全页面 View 禁用,而不仅仅是在注销后。 ( Source ;注意他们正在努力允许异常(exception)情况,值得关注这一点。)

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

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

关于php - 阻止后退按钮暴露安全页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4964407/

相关文章:

PHP/MYSQL - 如何将从数据库获取的数据(存储在变量中)分配给 session 变量?

php - 拉维尔 5 : Replace string in query results (Eloquent ORM)

php - 多线谷歌折线图,使用来自 mySQL 数据库的数据

php - 不确定我是否需要 SSL 或替代方案

php - LEFT JOIN 还是只选择额外的表?

php - Codeigniter:与子域和 sess_time_to_update 共享 session

javascript - HTML 元素动态定位

java - Grails、作业、静态辅助方法和 Hibernate session

session - 在 2 个 tomcat 实例之间维护 session

php - PHP 中的自定义 session 处理程序