php - 如何完全(我的意思是完全)销毁所有会话数据并防止缓存访问?
问题描述
我目前正在使用您使用 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
,而在所有其他页面上,它会吐出布尔值0
或1
?!?!?! 我很困惑......我想这就是为什么我不能正确删除会话?
代码:
<?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 会话哦,我的灵魂!)
解决方案
销毁位于session_save_path()
文件夹 /session.save_path
指令中的会话数据文件。
推荐阅读
- slurm - slurm:Slurm 作业的源代码及其依赖文件应该存储在哪里?
- rest - 使用 MS SQL Server 从具有基本身份验证的 REST API 获取数据
- unity3d - 为什么 Vuforia AR 无法在我的设备中运行?
- c# - LiteDb Where 查询
- java - Android Spinner 上的对象属性 (REST API)
- javascript - 获取相对单位值
- python - 向熊猫数据框添加多列
- ruby-on-rails - Ruby on Rails 更新数据库字段迁移
- python - 替换张量中大于零的所有值
- javascript - Javascript替换具有属性的span标签内的值