【发布时间】:2011-10-29 14:24:56
【问题描述】:
我的登录系统目前工作如下:
- 从 POST 表单中获取用户的用户名和密码。
- 对照数据库检查用户名和加盐+散列密码。
- 如果身份验证成功,则生成一个长的、随机的字母数字字符串。
- 将此字符串存储在 MySQL 中,以及与用户名一起存储在
$_SESSION变量中。- 这与将用户密码放在
$_SESSION中相反。我觉得这为间谍软件进入并窃取用户凭据敞开了大门。
- 这与将用户密码放在
- 在每个需要身份验证的页面(例如非敏感帐户设置、仅限会员区域等)上,将
$_SESSION用户名和字符串与 MySQL 中存储的内容进行对比。 - 如果它们匹配,请继续并显示页面。否则,显示登录表单。(?)
- 当用户明确注销时,从 MySQL 和
$_SESSION中删除随机字符串。
我坚持的是当用户隐式退出时如何处理。也就是说,当他/她没有点击网站上的任何“注销”按钮而关闭浏览器窗口时。我很确定我仍然需要从 MySQL 中删除随机字符串,所以以后有人不能使用被盗的 cookie 登录。但是我怎么知道用户什么时候关闭了浏览器窗口呢?
(“记住我”功能暂时无关紧要。)
【问题讨论】:
-
你的随机字符串本质上就像一个会话。为什么将其存储在
$_SESSION中而不是作为 cookie?使用会话涉及文件系统访问,并且它在处理请求期间获得对会话文件的排他锁,阻止它处理其他请求,直到请求被分派(或直到session_write_close()被调用) - 基本上使一切变慢. PHP 创建的会话 id 已经和你的随机字符串几乎一样了......你最好将它直接存储在 cookie 中。