繁体   English   中英

难以从网站注销用户

[英]Difficulty logging user out from website

编写一个小型CMS。 用户身份验证是通过在命名会话中用php设置的会话变量进行的。 调用注销时,Ajax例程会加载一个单独的PHP脚本来完成工作。 此单独的脚本使用相同的会话参数。 使用随机数据分别覆盖会话变量,然后销毁会话。 这可行。 注销后检查浏览器cookie列表显示会话cookie已被删除。 到目前为止,一切正常。

如果用户在登录时导航到同一站点的另一个页面,或者在新的浏览器选项卡中打开第二个页面,则会出现问题。 一旦完成,注销例程就无法破坏或取消会话设置。 更糟糕的是,即使注销时密码会话变量是随机的,重新加载页面也会将其恢复为之前的值,从而有效地将用户重新登录。

检查浏览器数据后,发现会话cookie在发出session_destroy()时未能删除,并且我无法以编程方式执行的任何操作将其删除。

我试图弄清楚为什么打开第二个站点页面(使用相同的会话参数)似乎应该锁定会话,以便不能从任何一个页面中删除它。 php手册在任何地方都没有建议任何此类行为。

已建议将浏览器缓存作为罪魁祸首,但似乎不太可能。

摔跤了一段时间。 有任何想法吗?

测试已在Firefox版本6到最新版本中完成。

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请求一起发送。

最后,就像有人已经提到的那样:如果需要将密码存储在会话变量中,则可能需要重新考虑整个身份验证机制,但这是一个完全不同的主题。

MarcB有答案-必须在销毁会话之前发出session_write_close()。

在ajax注销例程中使用此选项,从任何页面注销都将按原样取消用户在所有打开的页面上的编辑权限。

谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM