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

时间:2019-01-26 15:02:05

标签: php session

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

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

注销代码:

<?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会话,我的灵魂!)

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果[注释您,意思是缓存系统]在存储用户数据,则按注释,您可能希望在缓存控件中包括“私有”。但是,考虑到未实现的状态,代理以及对超文本传输​​协议的记录不足的犬类。实际上可能没有什么不同。但是,似乎仍然是正确的,并且通过使用指令,浏览器更倾向于实现它们。

https://tools.ietf.org/id/draft-ietf-httpbis-cache-00.html#rfc.section.5.2.2.6

max-age = 0实施得很好,除非一切都设置不正确,否则必须在服务器的下行进行所有操作。

如果配置错误,恶意或行为不当...添加? URL上带有唯一值的标记会欺骗这些错误的实现,从而将URL视为另一个页面。缓存系统是否损坏,它会强制连接到服务器以请求页面。


您正在使用的must-revalidate指令是执行您要执行的操作的正确指令。是否在下线实施?

  

在任何情况下,缓存都必须遵守must-revalidate指令;   尤其是如果某个缓存无法到达原始服务器   原因,它必须生成504(网关超时)响应。

答案 3 :(得分:0)

解决了!只需发布给有此问题的其他人。

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

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

我将保存目录更改为可以访问的目录,并实际上监视了会话文件的更改方式以弄清楚它(好的调试技巧)

希望这对以后的PHP程序员有所帮助(祝您好运,您将需要大声笑)