编写一个小型CMS。用户身份验证是通过在命名会话中使用php设置的会话变量。当调用logout时,ajax例程会加载一个单独的php脚本来完成工作。此单独的脚本使用相同的会话参数。使用随机数据单独覆盖会话变量,然后销毁会话。这有效。注销后检查浏览器cookie列表表明会话cookie已被删除。到目前为止,一切都好。
如果用户在登录时导航到同一站点的其他页面,或者在新浏览器选项卡中打开第二页,则会出现问题。完成之后,注销例程不能销毁或取消设置会话。更糟糕的是,即使密码会话变量在注销时随机化,重新加载页面也会将其恢复到之前的值,从而有效地将用户重新登录。
检查浏览器数据显示会话cookie在发出的session_destroy()上未能删除,我无法以编程方式执行任何操作将删除它。
我正在试图弄清楚为什么打开第二个网站页面(使用相同的会话参数)应该看似锁定会话,因此无法从任一页面销毁它。 php手册没有提出任何此类行为。
浏览器缓存被认为可能是罪魁祸首,但似乎不太可能。
已经和它搏斗了一段时间。有任何想法吗?
在Firefox中进行测试,版本6到最新版本。
答案 0 :(得分:0)
session_destroy()
不会取消设置会话cookie(或重置$_SESSION
全局变量);它只会破坏服务器端会话数据存储(默认的基于文件的会话配置中的文件)。删除cookie(可以使用setcookie()
使用空值“手动”完成)不需要销毁会话数据。调用session_destroy()
但Cookie保持不变后,在后续请求中使用session_start()
将启动相同ID 的新会话(除非您也可以使用否会话数据来呼叫session_regenerate_id()
)。
现在关于你的问题,很难说没看到代码就会发生什么,但这里有几个想法:
会话变量被随机数据单独覆盖, 然后会话被销毁。
在调用session_destroy()
之前将会话数据设置为任何内容是没有意义的,因为这些新值永远不会进入会话数据存储。
注销后检查浏览器cookie列表会显示该会话 cookie已被删除。
就像我说的那样,cookie不会被自动删除;它更有可能不会被设定。
更糟糕的是,即使密码会话变量在注销时随机化, 重新加载页面会将其恢复为以前的值
这表明session_destroy()
实际上并没有破坏任何东西。这导致我怀疑在你的注销脚本中你没有在尝试销毁它之前初始化会话(使用session_start()
)。这应该导致PHP警告,您可能看不到因为您已禁止警告,或者因为脚本是通过AJAX调用的。
另一种可能性很小的可能性是你的注销脚本确实启动然后销毁会话,但是完全不同。使用Firebug或类似工具查看是否(和什么)会话cookie与您的AJAX请求一起发送。
最后,正如有人已经提到的:如果您需要在会话变量中存储密码,您可能需要重新考虑整个身份验证机制,但这是一个完全不同的主题。
答案 1 :(得分:0)
MarcB有答案 - 必须在销毁会话之前发出session_write_close()。
在ajax注销例程中,从任何页面注销会杀死用户对所有打开页面的编辑权限。
感谢。