可能的重复:
为网站实施“记住我”的最佳方式是什么? https://stackoverflow.com/questions/244882/what-is-the-best-way-to-implement-remember-me-for-a-website
每个用户都有唯一的 32 个字符的 ID(如下所示:md5("salt" . $username . $user_password . "salt2");
)。我将此值存储在表 users 的“unique_id”字段下。将此值分配给用户的 cookie 并仅在分配后才让他登录,这是一个好方法吗?当然还要检查该值是否存在于数据库中?
我认为这不是一个好的做法,因为如果有人窃取了您的 cookie,他们将能够登录您的帐户。
其他/更好的解决方案是什么?当然,最安全的事情可能只是将其存储在会话中,但我想实现这个记住我的功能。
Thanks.
假设持久 cookie 的数据库表名称是pcookies包含以下列:
- cookie_id(字符)
- 用户 ID (INT)
- 到期(日期时间)
- 盐(字符)
Cookie创建步骤:
- 登录成功后,在数据库中创建一个具有唯一id的cookie记录。您可以通过 hash_hmac('sha512', $token, $salt) 生成它,其中 $token=uniqid($user_id, TRUE) 和 $salt=md5(mt_rand()) 。
- 将“用户 ID”、“过期时间”和“盐”以及“cookie id”存储在数据库中。
- 将“cookie id”和“令牌”存储在 cookie 中。
认证步骤:
- 如果找到持久性cookie,首先检查该记录在数据库中是否可用。
- 如果记录可用,则检查 cookie 是否过期。
- 如果 cookie 没有过期,则通过 $cookie_id == hash_hmac('sha512',$token_from_cookie,$salt_from_db) 验证 cookie id。
- 一旦 cookie 被验证,从数据库中删除它并根据上述 cookie 创建步骤创建一个新的 cookie。
- 如果发现 cookie 无效,则从设备中清除 cookie,并从数据库中删除用户的所有其他 cookie 记录,注意盗窃企图的使用,然后继续手动登录过程。
Notes:
- 当会话可用时,忽略检查 cookie。
- 注销后,清除 cookie 以及数据库记录。
- 绝不允许用户执行敏感请求,例如更改密码或通过持久 Cookie 登录查看信用卡信息。调用密码登录并在会话中添加标志以允许所有后续操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)