我正在为框架构建一个用户系统插件,但我目前设置它的方式并不能让我满意。当“记住我”框被选中时,我创建了一个cookie
setcookie('rmb', md5('salt'.$id), ...);
有一些我不喜欢的事情。当我从这个cookie重新创建会话时,我会执行以下操作
$db->prepare('SELECT id FROM users WHERE md5(CONCAT("salt",id)) = ?')
->execute([$_COOKIE['rmb']])
->fetch();
这似乎没问题,但如果我解释一下这是我得到的问题
非常低效,可能会持续数小时。除了使用md5进行散列非常不安全之外,这个系统似乎并不可靠。你们能否给我一些关于如何有效和安全地从记住我的cookie哈希中识别用户的一些指示?
答案 0 :(得分:3)
我认为你可以创建一个challenge
客户端应该在后续请求中作为cookie发送。当用户登录时:
setcookie('username', put_username_here, ...);
setcookie('challenge', long_random_char_sequence, ...);
// UPDATE users SET challenge = ... WHERE username = ...
当用户再次连接时:
// SELECT ... FROM users WHERE username = $_COOKIE['username'] AND challenge = $_COOKIE['challenge']
这不会编译,没有输入清理等等......这只是您可能尝试实施的工作流程。
如果您想做得更好,请参阅this。