我创建了一个使用 cookie 并将会话 ID 存储在数据库中的登录系统,因此您的登录仅适用于该特定会话 ID。我意识到这有几个问题:
- 如果您在另一台设备上登录,则会话 ID 会更改(没有多次登录)
- 会话 ID 实际上是唯一将用户标识为已登录的东西(我不确定这是否存在安全风险,因为 cookie 是特定于域的)
但是,我想保留 cookie 附带的持久登录,同时仍然保持安全。
实际上,我想知道是否有更好的方法可以使用 cookie 将用户安全地登录到网站。
首先,保持东西的安全和持久登录不能一起使用。您总是会通过以某种方式引入持久登录来损害安全性。
话虽如此,查尔斯米勒的一篇文章概述了这样一个系统:
创建一个(足够大的)随机键,最好使用/dev/urandom
oropenssl_random_pseudo_bytes()
并将其与帐户相关联(在数据库术语中:一个单独的表,其中随机键作为主(或唯一)索引,帐户作为外键);关键将是 cookie 值。
当未登录的用户出示 cookie 时,会查找密钥和帐户并登录用户;之后,使用的密钥被一个新的随机密钥替换(cookie 也被更新)。
仅通过 cookie 登录的用户在访问敏感(帐户)信息时应再次被要求输入密码。
用户应该可以选择从他的所有设备中注销。
session_regenerate_id()
每当用户登录时(通过表单或 cookie),使用更新会话 ID 也是一个好习惯。这可以防止某人对其他人发起会话固定攻击并可能窃取他们的身份。
可以在此处找到 Barry Jaspen 对这种设计的改进,它还可以处理身份盗窃检测。