我目前正在使用您通过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
,而在所有其他页面上,它吐出布尔值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();
位以清除会话信息。但是,有一个小问题,如果我将session_id()
作为GET变量刷新HTML页面,它是否仍加载页面?甚至说我应该在独立脚本中清除的`$ _SESSION [“ IS_AUTHORIZED”]]现在又返回并还原为清除状态?这实际上打败了使用会话的整个观点吗?请帮助! (到目前为止,我讨厌php会话,我的灵魂!)
答案 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()
,所以该网页从未断开与会话文件的连接。我的独立注销脚本实际上正在删除$_SESSION
和unset($_SESSION[<variable name>])
正常工作。问题在于刷新HTML页面后,我想它会再次重新保存会话文件并有效地重新创建它。
我可以想到的最简单的类比是:编辑Word文档并在Word中打开文件时删除实际文件,然后从Word中保存,从而有效地重新创建文档。
我将保存目录更改为可以访问的目录,并实际上监视了会话文件的更改方式以弄清楚它(好的调试技巧)
希望这对以后的PHP程序员有所帮助(祝您好运,您将需要大声笑)