首页 > 解决方案 > 如何完全(我的意思是完全)销毁所有会话数据并防止缓存访问?

问题描述

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

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

登出代码:

<?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(),但不知何故无法访问任何会话变量?!如果 I 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();位来清除会话信息。不过小问题,如果我用 GET 变量刷新 HTML 页面session_id(),它仍然会加载页面吗?甚至说我应该刚刚在我的独立脚本中清除的 `$_SESSION["IS_AUTHORIZED"] 变量现在又回来了,并恢复到我清除它之前?这实际上破坏了使用会话的全部意义?请帮忙!(到目前为止,我讨厌 php 会话哦,我的灵魂!)

标签: phpsession

解决方案


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


推荐阅读