我正在尝试为我的PHP应用程序创建一个身份验证机制,但是我很难破坏会话。我已经尝试取消先前在会话数组中设置并通过
销毁会话的身份验证令牌 session_destroy
,
以及在销毁会话之前完全重置会话数组。我正在调用头函数并在函数调用结束时返回我的index.php页面。我也试过了
session_write_close
处理关闭会话。当我将用户注销时,我会对会话进行vardump,并且它没有显示数据,但是当我返回index.php页面时,我正在获取用户身份验证数据。我还做了Post数据的vardump,以确保我不会以某种方式重新提交post身份验证处理程序。
有关该怎么做的任何建议?
答案 0 :(得分:8)
首先,请确保在致电session_start();
之前致电session_destroy();
,因为如果不这样做,它只会发出警告。
此外,来自PHP: session_destroy:
为了完全终止会话,比如要将用户注销,还必须取消设置会话ID。如果使用cookie来传播会话ID(默认行为),则必须删除会话cookie。 setcookie()可能会用于此。
答案 1 :(得分:2)
还值得注意关于PHP会话,session_unset()
> session_destroy()
; 我不知道为什么。在阅读PHP Manual entry on session_destroy()
之后,它似乎只删除了当前上下文中的数据,而实际上并没有从平面会话文件中清除它,所以如果你没有清除你可以得到它的cookie。这看起来非常反直觉(正如PHP经常那样),并且可能是我多年前决定(然后及时忘记原因)总是使用session_unset()
而不是session_destroy()
的原因。
此外,确保在完成所有会话废话之后发生重定向,因为PHP的行为方式并非所有开发人员都期望的。 IMO的最佳做法是使用header('Location: ...');
die;
来电
答案 2 :(得分:1)
如果您只使用session_unset(),那么错误的IE仍会保留数据我的建议是同时使用它们。
答案 3 :(得分:0)
我会检查使用Fiddler将浏览器发送到服务器的内容,并检查您在session.save_path中存储了哪些信息
答案 4 :(得分:0)
您确定页面未缓存吗?
写入身份验证令牌:
session_start();
$_SESSION['varName'] = null;
$_SESSION = array();
session_destroy();
答案 5 :(得分:0)
但是当我回到index.php页面
时
是否刚刚从浏览器缓存中请求了特定页面?对页面进行大量刷新(大多数网页浏览器中都为CTRL+F5
。)
如果结果是原因并且您想要禁用请求缓存,请将以下标题集添加到您的网页的HTML <head>
:
<meta http-equiv="cache-control" content="no-cache,no-store,must-revalidate">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="expires" content="0">
或者,在PHP代码中使用PHP的header()
函数:
header('cache-control: no-cache,no-store,must-revalidate'); // HTTP 1.1.
header('pragma: no-cache'); // HTTP 1.0.
header('expires: 0'); // Proxies.
在测试之前不要忘记清除浏览器缓存:)