如何完全(我的意思是完全)销毁所有会话数据并阻止缓存访问



我目前正在使用付费墙类型的后端建立一个网站,您可以使用Microsoft帐户登录该网站。目前,我正在使用PHP会话来捕获和跟踪有效的请求。

我已经成功地完全销毁了保存在服务器上的所有会话数据,并重命名和清空了会话cookie(请参阅下面的代码)。不幸的是,这似乎还不够。我仍然可以通过GET变量传递旧会话ID来访问页面,并且我仍然可以加载页面。我怀疑这是一个缓存版本。我已经尝试在php中添加headders来防止这种情况,但它仍在加载!

注销代码:

<?php
if ($_POST) {
session_start($_POST["SID"]);
$_SESSION[] = array();
setcookie( session_name(), "", time()-3600, "/" );
session_destroy();
session_write_close();
echo("Session ".$_POST["SID"]." has been destroyed");
}
?>

标题代码:

<?php
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>

我本来希望能够点击注销按钮,如果我试图通过GET命令提供旧会话id来手动访问页面,我应该会被页面弹出。有什么办法绕过这个吗?也许会强制页面重新查询服务器(如果我能让它再次ping服务器,我认为我的php应该弹出请求?我犹豫了一下,哈哈哈)

编辑:

好吧,经过大量的调试,我把问题缩小到了我的$_SESSION["IS_AUTHORIZED"]变量?这应该是不可能的,但不知何故,我为在用户注销时销毁会话而编写的独立PHP脚本可以运行相同的session_id(),但却无法访问任何会话变量?!如果我var_dump($_SESSION["IS_AUTHORIZED"]),它会吐出NULL,而在所有其他页面上,它吐出布尔01?!?!?!我很困惑。。。我想这就是我不能正确删除会话的原因吧?

代码:

<?php
if ($_POST) {
session_id($_POST["SID"]);
echo(session_id()); //comes out as same as session origin page
session_start();
echo("|||"); //to make payoad easier to read lol
echo($_SESSION["IS_AUTHORIZED"]); //nothing... and var_dump() is NULL?
?>

编辑2:

天啊。因此,现在经过一些修补,独立的PHP脚本可以工作并链接到正确的session_id(),我可以完成整个session_destroy()$_SESSION = array();位来清除会话信息。不过小问题是,如果我用session_id()作为GET变量刷新HTML页面,它仍然加载页面?甚至说我应该刚刚在独立脚本中清除的`$_SESSION["IS_AUTHORIZED"]变量现在又回来了,并在我清除它之前恢复到了它?这真的违背了使用会话的全部意义吗?请帮忙!(到目前为止我讨厌php会话哦,我的灵魂!)

销毁位于session_save_path()文件夹/session.save_path指令中的会话数据文件。

<?php
session_start() ;
unset($_SESSION["IS_AUTHORIZED"]);
session_destroy();
session_write_close();
$_SESSION=new array();
session_regenerate_id(true);
?>

修复了它!只是为其他有这个问题的人发帖。

事实证明,这一切都链接回了session_write_close()命令。在托管受限内容的HTML页面中,我有PHP代码,它检查会话变量以确定天气或不显示页面或重定向。显然,为了首先访问$_SESSION[]变量,我首先必须设置session_id($_GET[<session id passed via GET>]),然后进行检查。不幸的是,我从未调用过session_write_close(),因此网页从未与会话文件断开连接。我的独立注销脚本实际上是在删除$_SESSION,而unset($_SESSION[<variable name>])正在工作。问题是,在HTML页面刷新时,我想它会重新保存会话文件,并有效地重新创建它

我能想到的解释它的最简单的类比是,编辑Word文档,在Word中打开时删除实际文件,然后从Word中保存,有效地重新创建文档。

我把保存目录改到了可以访问的地方,并实际监控会话文件是如何更改的(顺便说一句,很好的调试技术)

希望这能帮助未来的PHP程序员(祝你好运,你会需要它的哈哈)

最新更新