2009-11-05 69 views
5

我试图为我的PHP应用程序创建一个身份验证机制,我很难破坏会话。我已经试过你重置这是以前的会话阵列内设置身份验证令牌,并通过PHP会话并没有破坏用户注销

session_destroy破坏会议,

以及销毁会话之前完全复位会话阵列。我正在调用头函数并返回到函数调用结束时的index.php页面。我也试着

session_write_close

处理关闭会话。当我登录用户时,我做了会话的vardump,它没有显示任何数据,但是当我回到index.php页面时,我收回了用户验证数据。我也做了Post数据的vardump,以确保我不会以某种方式重新提交后验证处理程序。

关于在这里做什么的任何建议?

+0

您不必使用session_write_close()..通常用于用户身份验证。 – mauris 2009-11-05 22:46:48

回答

6

首先,确保你打电话session_start();之前致电session_destroy();因为它只会发出警告,如果你不这样做。

此外,从PHP: session_destroy

为了完全终止会话,想注销用户,会话ID也必须给予取消。如果使用cookie传播会话标识(默认行为),则必须删除会话cookie。 setcookie()可用于此目的。
+4

+1不在logout.php页面上调用session_start。 – jkushner 2009-11-06 20:59:20

+0

如果您使用了命名会话,请不要忘记使用session_name! – Calmarius 2011-09-28 14:27:06

0

我会检查什么是使用招,并检查哪些信息你已存储在您的session.save_path

0

确定的页面没有被缓存发送浏览器向服务器?

上书写的身份验证令牌:

session_start(); 
$_SESSION['varName'] = null; 
$_SESSION = array(); 
session_destroy(); 
0

但是当我回到index.php页面

是不是特定的页面在浏览器刚刚被要求缓存?做一个硬刷新的页面(大多数网页浏览器中的CTRL+F5)。

如果原来是原因,并要禁用请求缓存,添加以下套头为HTML <head>您的网页:使用PHP的header()功能

<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代码:

header('cache-control: no-cache,no-store,must-revalidate'); // HTTP 1.1. 
header('pragma: no-cache'); // HTTP 1.0. 
header('expires: 0'); // Proxies. 

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

2

也值得关注PHP会话,session_unset()>​​; 我不知道为什么。在阅读PHP Manual entry on session_destroy()之后,它似乎只删除当前上下文中的数据,实际上并没有将它从平面会话文件中清除,所以如果您没有清除cookie,则可以马上恢复。这看起来非常违反直觉(正如PHP一般),并且可能是几年前我决定(并且很快忘记原因)的原因,总是使用session_unset()而不是​​。

此外,请确保您的重定向发生在您完成所有此会话废话之后,因为PHP的行为并非所有开发人员所期望的。最佳做法,国际海事组织,是每header('Location: ...');呼叫die;

1

如果你只使用session_unset()然后小车IE仍然保留数据我的建议是使用两个。