我该如何实施隐式注销?

时间:2011-08-18 08:47:21

标签: php session login

我的登录系统目前的工作方式如下:

  1. 从POST表单中获取用户的用户名和密码。
  2. 检查数据库的用户名和salted +哈希密码。
  3. 如果身份验证成功,请生成一个长的,随机的字母数字字符串。
  4. 将此字符串存储在MySQL中,以及$_SESSION变量和用户名中。
    • 这与仅将用户密码放在$_SESSION中相反。我觉得这样就可以让间谍软件进入大门并窃取用户的凭据。
  5. 在需要身份验证的每个页面上(例如,非敏感帐户设置,仅限会员区域等),请检查$_SESSION用户名和字符串与存储在MySQL中的用户名和字符串。
  6. 如果匹配,请继续显示页面。否则,请显示登录表单。(?)
  7. 当用户明确注销时,从MySQL和$_SESSION中删除随机字符串。
  8. 我坚持的是当用户隐式注销时如何处理。也就是说,当他/她关闭浏览器窗口而不点击网站上的任何“注销”按钮时。我很确定我仍然需要从MySQL中删除随机字符串,因此有人不能使用被盗的cookie来登录。但是,如何知道用户何时关闭浏览器窗口?

    (“记住我”功能目前无关紧要。)

2 个答案:

答案 0 :(得分:3)

  

如何实施登录会话?

身份验证和会话管理是两回事,虽然它们紧密相连,但您似乎也在谈论授权。

  

如果身份验证成功,请生成一个长的,随机的字母数字字符串。

为什么呢? PHP已生成随机标识符(会话ID)。如果要区分经过身份验证/未经过身份验证的用户和/或确定哪个用户拥有当前会话,只需将用户名/用户ID存储在会话中。

  

将用户密码放在$ _SESSION变量

为什么你会想要这样做 - 一旦你认证了用户,你再也不需要再使用密码。

  

检查$ _SESSION用户名和字符串与存储在MySQL中的用户名和字符串

为什么呢?会话数据如何通过代码更改其他?如果您怀疑服务器端代码可能被篡改,那么无论您做什么都不重要,系统将是不安全的。

  

当用户明确注销时

...你明确地破坏了会话。就是这样。

当您从提议中删除冗余时,无需在隐式注销后进行清理。

BTW:您的提案中没有解决许多安全问题,特别是在身份验证尝试后重新生成会话ID。

答案 1 :(得分:0)

您可以在onclose事件上使用ajax调用来终止会话...从未尝试过但它应该可以工作:

$(window).unload( function () { 
    // ajax to kill the session 
} );