我正在研究一个使用session_destroy()
方法将用户登出系统的PHP应用程序,因为在注销时销毁所有会话信息被认为是一种很好的做法。
但是,我想存储一些信息,例如"上次登录日期,上次用户名"等等无限期(直到浏览器的缓存/ cookie被刷新)。此信息将用于为使用相同浏览器的用户/人员构建微妙的个性化功能。
我无法将此数据存储在服务器上,因为需要使用浏览器 识别 信息,而不是系统的用户,并且我没有唯一的数据可靠地识别浏览器。
最好/推荐的方法是什么?我目前正在考虑多个会话,并使用其中一个来存储此类信息,而不是销毁它。
任何好的建议都会受到赞赏。安全性是此应用程序的一个问题。提前谢谢!
编辑:底线:是否正在破坏会话,完全打开会话劫持等安全风险?
答案 0 :(得分:3)
将last_login
和last_login_ip
存储在数据库中的users
表中比在客户端存储更好(并且必须)。如果浏览器崩溃,或者用户使用其他浏览器/计算机登录,该怎么办?
session_destroy()
是正确的。或者,如果您想要做更多事情,可以重置会话,不推荐,并像这样致电session_destroy()
:
$_SESSION = array();
session_destroy();
但我建议只清除您使用该应用程序设置的特定会话信息。比方说,例如:
unset($_SESSION["user"]);
因为请记住,我在这里存储的数据将在用户注销后使用,这意味着我无法识别用户
您正在将数据存储在数据库中,这意味着,没有办法,您可能会犯错误。评论很疯狂。让我举一个你所说的话的例子。考虑last_login
和last_login_ip
,然后执行此操作:
Query_The_Server("UPDATE `users` SET `last_login`=NOW(), `last_login_ip`='{$_SERVER["REMOTE_ADDR"]}' WHERE `user_id`={$_SESSION["user"]["user_id"]}");
现在告诉我,上面的事情怎么会失败?
示例:在登录页面中,我想说“此计算机上的最后登录用户是:John”。
这需要隐私问题。比方说,例如,我登录应用程序,退出,我的朋友登录或其他等待点击我的人登录。他发现我之前登录过,这可能是隐私问题。想一想。
但是,如果这是你想要做的,那么是的,不要使用session_destroy()
,而是使用unset($_SESSION["user"]);
或你存储的任何内容来识别用户而不要触及{{1 }}
另一个想法是:
last_user
答案 1 :(得分:0)
您需要将数据存储到某种形式的永久存储中,因为会话数据仅在用户关闭浏览器之前存储。
然后从介质中获取该数据并显示它,直到另一个用户登录。
然后运行:
session_destroy();