登录系统的 cookie 中应该存储啥?

Posted

技术标签:

【中文标题】登录系统的 cookie 中应该存储啥?【英文标题】:What should be stored in a cookie for a login system?登录系统的 cookie 中应该存储什么? 【发布时间】:2010-11-27 12:13:23 【问题描述】:

在 cookie 中存储什么以保持持久的登录状态最好?

我见过许多网站(和初学者教程!)只是将类似 validUser=1 的内容存储在 cookie 中。很明显,我可以对其进行欺骗,网站会认为我是有效用户。

如果用户名存储在 cookie 中,我可以通过在我的请求中发送带有他/她的用户名的 cookie 来伪装成任何用户。

因此,如果您将用户名密码存储在cookie中,那么我必须知道用户名和密码才能登录。实际上用户是自动登录的——就像密码被保存了一样他的浏览器。浏览器不必每次都自己在框中输入凭据,而是在每次页面请求时自动发送它们。

但这仍然是个坏主意吗?存储纯文本密码不是一个好主意,但这就是登录时在 POST 数据中发送的方式。此外,它可以存储为散列。但我还是觉得不舒服。

也许 cookie 不应该用于存储会话 ID 以外的任何内容,并且用户数据存储在服务器本身上。假设服务器不是共享的,这可能是一个更安全的位置。

看一些开源软件,比如论坛软件,他们使用的系统比较复杂,但是我通过浏览代码无法理解它到底在做什么。

什么是标准的“最佳实践”?

【问题讨论】:

那么在会话中存储一个用户ID那么简单吗?那是安全的,并且不需要在数据库中存储有关特定登录的更多信息? (例如 IP),并在他们重新访问时更改所有会话/数据,正如我所看到的这些大型脚本所做的那样? 您应该尽可能重用现有的身份验证框架,因为它确实很复杂。例如,看看github.com/delight-im/php-Auth 【参考方案1】:

唯一应该在 cookie 中的是 PHP 生成的 sessionid(这在您使用会话时自动完成)。您不应该在 cookie 中存储任何内容,除了可能为“记住我”复选框而记住的用户名。

【讨论】:

【参考方案2】:

最佳做法是存储随机生成的会话 ID。然后会话存储用户 ID 或您需要存储的任何其他内容。在 PHP 中,session_start() 方法会自动生成会话 id 和一个名为 PHPSESSID 的 cookie,因此您只需担心将数据存储在 $_SESSION 数组中,而不是存储在 cookie 中。

【讨论】:

【参考方案3】:

最佳做法是使用 SESSION 而不是 COOKIE 来使用数据。 COOKIES 用于存储通用信息而不是关于用户的特定信息,这就是 SESSIONS 的用途。

【讨论】:

【参考方案4】:

2 篇好文章是:

Persistent Login Cookie Best Practice

Improved Persistent Login Cookie Best Practice

【讨论】:

第二个链接现在断开了。 仅包含链接的答案不是好的答案。应编辑此答案以包含链接文章的摘要。 (是的,我知道这已经是一个非常古老的答案了。但是,关于断开链接的评论完美地说明了总结链接的必要性。)

以上是关于登录系统的 cookie 中应该存储啥?的主要内容,如果未能解决你的问题,请参考以下文章

PHP登录系统:记住我(持久cookie)[重复]

HybridAuth 身份验证 cookie

使用 Cookie 和 Salted Hashes 的 PHP 登录系统

单点登录

大家好: 我用c#编写模拟登录系统,现在返回set-cookie里面没有cqweb_session值,不知道啥原因引起的啊

登录系统的 Set-Cookie