PHP会话 - 注销的最佳实践

时间:2015-12-29 09:35:57

标签: php security session

我正在研究一个使用session_destroy()方法将用户登出系统的PHP应用程序,因为在注销时销毁所有会话信息被认为是一种很好的做法。

但是,我想存储一些信息,例如"上次登录日期,上次用户名"等等无限期(直到浏览器的缓存/ cookie被刷新)。此信息将用于为使用相同浏览器的用户/人员构建微妙的个性化功能。

我无法将此数据存储在服务器上,因为需要使用浏览器 识别 信息,而不是系统的用户,并且我没有唯一的数据可靠地识别浏览器。

最好/推荐的方法是什么?我目前正在考虑多个会话,并使用其中一个来存储此类信息,而不是销毁它。

任何好的建议都会受到赞赏。安全性是此应用程序的一个问题。提前谢谢!

编辑:底线:是否正在破坏会话,完全打开会话劫持等安全风险?

2 个答案:

答案 0 :(得分:3)

last_loginlast_login_ip存储在数据库中的users表中比在客户端存储更好(并且必须)。如果浏览器崩溃,或者用户使用其他浏览器/计算机登录,该怎么办?

session_destroy()是正确的。或者,如果您想要做更多事情,可以重置会话,不推荐,并像这样致电session_destroy()

$_SESSION = array();
session_destroy();

但我建议只清除您使用该应用程序设置的特定会话信息。比方说,例如:

unset($_SESSION["user"]);
  

因为请记住,我在这里存储的数据将在用户注销后使用,这意味着我无法识别用户

您正在将数据存储在数据库中,这意味着,没有办法,您可能会犯错误。评论很疯狂。让我举一个你所说的话的例子。考虑last_loginlast_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();