不,不是远程安全的。您无法保证 cookie 不会以纯文本形式存储(事实上,大多数实现都将它们存储为纯文本形式)。
请注意,“记住我”本质上是不安全的,因为任何拦截 cookie 的人都可以访问应用程序。但是暴露用户的密码会使它在不安全的阶梯上更进一步。:-) 如果他们发现的话,可能会让用户非常生气。
我使用了一个加密的 cookie 字符串,它结合了用户的帐户名称和一个令牌,该令牌与用户帐户没有(其他)方式关联,除了在我的服务器上的一个表中。当用户返回站点时,我们解密 cookie 并查看该令牌是否实际上与该帐户相关联。令牌(以及因此的 cookie)会更改每次自动登录,并使用于该自动登录的令牌无效。(令牌和帐户之间存在多对一的关系,以允许从多个位置自动登录。您可以根据需要对其进行限制。)如果在 X 天内未使用令牌,则会超时。(这不仅是通过限制 cookie 的持续时间来完成的;它也是在服务器端完成的。)还有一些其他的东西我放在那里让生活变得有点对于试图解码 cookie(已成功解密)或使用偷来的 cookie(不需要解密)的人来说,这是很困难的,但是过度杀伤是没有意义的(同样,“记住我”本质上是不安全的)。
我在一个不需要强大安全性(显然)并且具有大量动态IP客户端的站点上使用它,因此我不会尝试将其锁定到IP。但即使将其锁定到 IP 也不能保证其安全性,它只会稍微减少攻击面。
您可能想知道为什么我的 cookie 中有用户名。出于直接“记住我”的目的,我不建议将它放在那里,即使它是加密的(毕竟,它是用户名+密码系统中身份验证对的一半)。当我在提醒自己我们是如何为这个问题做这个时查看格式时,我在我们的 cookie 中发现它有点惊讶;但是后来我看到评论解释了它为什么在那里,并且有一些与“记住我”无关的原因(事后看来,不一定是有说服力的原因,而是原因)。
最后一点,“记住我”本质上是不安全的这一事实是站点日志非常重要的众多原因之一,也是为什么在允许更改重要帐户信息的过程中需要重新验证密码(以使其更难有人窃取了 cookie 以获取帐户的所有权)。