我希望我的网站上有一个复选框,用户可以单击它,这样他们每次访问我的网站时都不必登录。 我知道我需要在他们的计算机上存储cookie才能实现此目的,但是该cookie中应包含什么?
另外,是否有一些常见的错误需要提防,以防止此Cookie出现安全漏洞,而在仍然提供“记住我”功能的情况下可以避免该错误?
#1楼
存储他们的UserId和RememberMeToken。 当他们使用“记住我”身份登录时,将生成一个新的“ RememberMeToken”(使其他所有标记为“记住我”的计算机无效)。
当他们返回时,请通过“记住我”令牌进行查找,并确保UserId匹配。
#2楼
我将存储一个用户ID和一个令牌。 当用户返回该站点时,将这两部分信息与诸如数据库条目之类的持久性内容进行比较。
至于安全性,请不要在其中放任何东西,以免有人修改Cookie以获得额外的好处。 例如,不要存储其用户组或密码。 不能修改任何会破坏您安全性的内容都不应存储在cookie中。
#3楼
改进的持久登录Cookie最佳做法
您可以使用此处描述为最佳实践的策略(2006)或此处描述的更新策略 (2015):
- 当用户在选中“记住我”的情况下成功登录时,除了标准会话管理cookie外,还会发出一个登录 cookie。
- 登录cookie包含系列标识符和令牌 。 系列和令牌是来自适当大空间的不可猜测的随机数 。 两者都存储在数据库表中, 令牌被散列 (sha256可以)。
- 当非登录用户访问站点并显示登录cookie时,将在数据库中查找系列标识符。
- 如果存在系列标识符 ,并且令牌的哈希与该系列标识符的哈希匹配,则认为用户已通过身份验证 。 生成一个新令牌 ,该令牌的新哈希存储在旧记录上,并向用户发布一个新的登录cookie(可以重新使用系列标识符 )。
- 如果存在该系列但令牌不匹配,则认为是盗窃 。 用户收到措辞强烈的警告,并且删除了用户记住的所有会话。
- 如果用户名和系列不存在,则登录cookie被忽略 。
这种方法提供了深度防御。 如果有人设法泄漏数据库表,它就不会给攻击者敞开大门来冒充用户。
#4楼
我自己调查持久性会话,我发现这根本不值得承担安全风险。 如果绝对必要,请使用它,但是您应该考虑仅对这种会话进行弱认证,并对可能对攻击者有价值的任何事情强制进行新的登录。
原因当然是包含持久会话的cookie很容易被盗。
窃取Cookie的4种方法( 根据Jens Roland在@splattne
页面上的@splattne
基于他的回答):
- 通过不安全的线路拦截(数据包嗅探/会话劫持)
- 通过直接访问用户的浏览器(通过恶意软件或对该框的物理访问)
- 通过从服务器数据库读取它(可能是SQL Injection,但可以是任何东西)
- 通过XSS黑客(或类似的客户端漏洞利用)