我遇到了一个(显然是常见的)浏览器缓存问题,我的安全页面可以通过后退按钮访问(在用户注销后。)
这是我的 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/