什么是最好的方式来实现“记住我”的网站?
我想我的网站有一个checkbox,用户可以点击,这样他们就不必每次访问我的网站时都要login。 我知道我需要在他们的计算机上存储一个cookie来实现这个function,但是这个cookie中应该包含什么?
另外,是否还有一些常见的错误需要注意保持这个cookie不会出现一个安全漏洞,这个安全漏洞可以避免,同时还能提供“记住我”function?
改进的持久loginCookie最佳实践
您可以使用这里描述的这个策略作为最佳实践 (2006)或这里描述的更新策略 (2015):
- 当用户使用“记住我”选中成功login时,除了标准会话pipe理cookie之外,还会发出一个login cookie。
- logincookie包含一个系列标识符和一个标记 。 该系列和标记是从适当的大空间不可猜测的随机数 。 两者一起存储在数据库表中, 令牌被散列 (sha256很好)。
- 当一个未login的用户访问该站点并显示logincookie时,系列标识符将在数据库中查找 。
- 如果系列标识符存在并且令牌的散列与该系列标识符的散列相匹配,则认为用户被authentication 。 生成一个新的令牌 , 令牌的一个新的哈希存储在旧的logging上,并向用户发出一个新的logincookie(可以重新使用系列标识符 )。
- 如果系列存在但令牌不匹配,则认为是盗窃 。 用户收到措辞强烈的警告,并删除所有用户的记忆会话。
- 如果用户名和系列不存在,logincookie将被忽略 。
这种方法提供了纵深防御。 如果有人设法泄漏数据库表,那么攻击者就不会冒充用户的模仿者。
存储他们的UserId和一个RememberMeToken。 当他们login时记得我检查生成一个新的RememberMeToken(这使任何其他标记的机器都记住我)。
当他们返回时通过记住我的标记来查找它们,并确保UserId匹配。
我会存储一个用户ID和一个令牌。 当用户回到站点时,将这两条信息与数据库条目等持久性信息进行比较。
至于安全性,就是不要在那里放置任何可以让别人修改cookie来获得额外好处的东西。 例如,不要存储他们的用户组或密码。 任何可以被修改的规避安全性的东西都不应该存储在cookie中。
调查持续的会议我自己,我发现这是不值得的安全风险。 如果你绝对必须使用它,但你应该考虑这样一个会话只是弱authentication,并强迫一个新的login,任何可能有价值的攻击者。
原因当然是你的包含你的持久会话的cookies很容易被盗用。
4种方式来窃取你的cookies(从Jens Roland的评论中,根据他的回答,在@splattne
的页面上):
- 通过在不安全的线路上拦截它(数据包嗅探/会话劫持)
- 通过直接访问用户的浏览器(通过恶意软件或物理访问框)
- 通过从服务器数据库中读取(可能是SQL注入,但可以是任何东西)
- 通过XSS黑客(或类似的客户端漏洞利用)