我的登录系统目前的工作原理如下:如何实现隐式注销?
- 抓住用户的用户名和密码从POST形式。
- 检查数据库的用户名和salted +哈希密码。
- 如果认证成功,则生成一个长且随机的字母数字字符串。
- 将此字符串与用户名一起存储在MySQL以及
$_SESSION
变量中。- 这与仅将用户密码置于
$_SESSION
中相反。我觉得这样会让间谍软件进入并窃取用户的凭证。
- 这与仅将用户密码置于
- 在需要认证的每个网页(例如非敏感帐户设置,只有成员的地区,等等),检查
$_SESSION
用户名和串对那些存储在MySQL。 - 如果它们匹配,请继续并显示页面。否则,显示登录表单(?)
- 当用户明确注销时,从MySQL和
$_SESSION
中删除随机字符串。
我卡在的是如何处理当用户隐式注销。也就是说,当他/她关闭浏览器窗口而不点击网站上的任何“注销”按钮时。我很确定我仍然需要从MySQL中删除随机字符串,所以有人不能使用被盗的cookie来登录。但是,我怎么知道用户何时关闭浏览器窗口?
(“记住我”的功能是无关紧要的现在)
你的随机字符串本质上就像一个会话。为什么你将它存储在'$ _SESSION'中而不是cookie?使用会话涉及文件系统访问,并在处理请求期间获得对会话文件的独占锁定,阻止它在调用请求之前(或直到调用session_write_close())之前处理其他请求) - 基本上一切都变慢。由PHP创建的会话ID已经与随机字符串几乎相同......您最好将其直接存储在cookie中。 – shesek
让会话过期。 http://stackoverflow.com/questions/3068744/php-session-timeout – BlueDog