为啥不为不同用户的设备使用相同的 cookie?
Posted
技术标签:
【中文标题】为啥不为不同用户的设备使用相同的 cookie?【英文标题】:Why not have an identical cookie for different user's devices?为什么不为不同用户的设备使用相同的 cookie? 【发布时间】:2016-10-29 14:40:27 【问题描述】:这是我的表结构:
// users
+----+--------+------------------------+------------------+-------------------------------+
| id | name | email | cookie | /* some other columns */ |
+----+--------+------------------------+------------------+-------------------------------|
| 1 | Jack | jack0948@gmail.com | ojer0f934mf2... | |
| 2 | Peter | P_2009@ymail.com | ko4398f43043... | |
| 3 | John | mx_pro34@gmail.com | 0243hfd348i4... | |
+----+--------+------------------------+------------------+-------------------------------+
cookie
列包含一个字符串(作为保持用户登录的cookie),该字符串也设置在用户的设备中。如您所见,我对每个用户只有 一个 字符串 (作为 cookie)。所以所有用户的设备都有一个相同的cookie。
我的问题是什么:最专业的程序员告诉我:
如果每个设备都有自己的cookie会更安全(每个设备的cookie应该不同于其他设备的cookie,而不是所有设备的恒定cookie)
嗯,为什么?为所有设备设置相同的 cookie 有什么问题?同样如您所见,我在数据库中只有一条 cookie 记录。因此,如果我为新设备更新该记录,那么之前的设备将被注销。
【问题讨论】:
如何防止会话劫持? @CD001 什么?我认为 session 与为所有设备使用相同的 cookie 无关。 说 Jack 在一个开放的 WiFi 上,我“窃听”并将他的 cookie 复制到我的手机并访问您的网站,它怎么知道我 不是 Jack? @CD001:-)
够公平的..!不过,你说的发生的可能性很低。
即便如此——这几乎就是会话劫持的定义;登录应仅在会话期间绑定到具有某种指纹/令牌系统的单个设备 - 使用设置了 secure
和 httpOnly
标志的 cookie。这可能就是为什么大多数专业人士会告诉您“如果每个设备都有自己的 cookie 会更安全”
【参考方案1】:
我猜你所说的 cookie 是指会话 ID。 Cookies 实际上可以代表任何东西。
您不应该在数据库中存储会话 ID。会话 ID 是临时值,应在每个新会话上更改。通过存储它们,您会遇到几个问题:
会话窃取:如果有人发现他不拥有的会话 ID,它将始终有效。这是错误的。 collisions :我想您使用某种散列方法生成这些值。在这种情况下,您可能会在具有相同会话 ID 的帐户之间发生冲突。 可能还有其他问题...通过在每个新会话上生成会话 ID,您可以避免这些问题。但这意味着您的设备可能不会为同一用户提供相同的会话 ID。
通过存储会话 ID,您在此处实际执行的操作不是会话 ID。这是一个密码,以纯文本形式存储。这是非常错误的。
【讨论】:
以上是关于为啥不为不同用户的设备使用相同的 cookie?的主要内容,如果未能解决你的问题,请参考以下文章