【发布时间】:2018-01-10 09:54:54
【问题描述】:
我用 PHP 编写了一个带有用户身份验证的网站。我为此使用了会话。当用户登录时,会在数据库中设置一个标志,当他注销时,该标志会被重置。这可以防止一个用户多次登录网站。
一切正常,但是当用户忘记注销时,会话会在一段时间后失效。当用户现在尝试重新登录时,他将被阻止登录,因为该标志仍然设置。
我需要一个处理程序/函数,当会话变得无效/被破坏时将被调用。我该怎么做?
我知道有一个名为 session_set_save_handler 的函数,但我只需要 destroy 函数。不需要其他函数,我可以访问该函数中的 $_SESSION 变量吗?因为在这个变量中保存了用户ID,需要重置其标志。
感谢您的帮助。
【问题讨论】:
-
不要这样做。支持每个用户多个同时会话。人们切换设备、浏览器、计算机、网络等。你真的想阻止某人这样做吗?没有其他人这样做,并且用户希望事情能够正常工作。
-
PHP 没有真正的方法可以做到这一点。您必须在数据库中设置一个时间戳并设置一个 cron 以在 X 分钟后删除该标志,这应该与您设置的默认会话超时相对应。话虽如此,这是一个坏主意。用户可能希望拥有多个会话。
-
嗨,布拉德,感谢您的回复。我在一个商业网站上工作,人们可以在那里购买一个帐户。这种方法可以防止他们只购买一个帐户并分发该帐户。
-
您应该使用更好的启发式方法来解决该问题。例如,允许在一个小的地理区域内同时登录 X 次。如果用户似乎同时在两台设备上使用同一个帐户,则引发手动检查标记。不要将每个人硬限制在一个设备上;您需要在用户友好性和收入保护之间取得平衡,单个数据库标志不是解决方案。
-
“我需要一个处理程序/函数,当会话无效/被销毁时将被调用” - 问题是,会话没有主动这样做 - 变成无效,或销毁。会话 cookie 有一定的生命周期,它会过期。但这不会删除存储在服务器上的会话数据——这是垃圾收集器的工作。
标签: php session session-set-save-handler