用户注销后PHP会话不会破坏

时间:2009-11-05 22:44:54

标签: php session

我正在尝试为我的PHP应用程序创建一个身份验证机制,但是我很难破坏会话。我已经尝试取消先前在会话数组中设置并通过

销毁会话的身份验证令牌

session_destroy

以及在销毁会话之前完全重置会话数组。我正在调用头函数并在函数调用结束时返回我的index.php页面。我也试过了

session_write_close

处理关闭会话。当我将用户注销时,我会对会话进行vardump,并且它没有显示数据,但是当我返回index.php页面时,我正在获取用户身份验证数据。我还做了Post数据的vardump,以确保我不会以某种方式重新提交post身份验证处理程序。

有关该怎么做的任何建议?

6 个答案:

答案 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.

在测试之前不要忘记清除浏览器缓存:)