用正确的方式用cookies恢复会话吗?

问题描述:

纠正我,如果我错了,请:用正确的方式用cookies恢复会话吗?

  • 会议将持续的时间有限(从服务器刷新每隔15分钟左右,直到关闭浏览器) - 更安全/短期
  • 另一方面,曲奇可以持续到浏览器关闭或将来某个特定时间 - 最不安全/长期

鉴于此,如何让用户关闭他/她的计算机,回来几次几天后,打开一个网站,仍然使用cookie登录并仍然以某种方式安全?

某人喜欢,亚马逊如何做到这一点?

编辑:

更清楚,这里有一个例子:

if (!isset($_SESSION['id'])) 
{ 
    $_SESSION['id'] = $_COOKIE['id']; 
    $_SESSION['email'] = $_COOKIE['email']; 
} 

这显然是不好的,有什么更好的办法?

+0

我认为这个问题是完全不清楚的。用户失去他的会话,一旦发生这些事情之一:cookie过期,服务器端会话过期为什么你认为这是“不安全” ? – 2012-01-14 23:15:28

+0

谢谢,正是我在找的东西。 – lewicki 2012-01-15 02:53:12

您在用户的cookie数据中存储基于会话的安全性令牌,并将相同的令牌存储在用户的db表中。在创建会话时,您会检查此用户名/令牌对是否可以根据之前存储的数据登录您的网站,然后使令牌无效。

+0

什么是阻止某人抓取cookie数据并使用令牌伪造登录名? – lewicki 2012-01-14 23:27:52

+0

我更喜欢存储与令牌关联的机器的MAC地址,实际上是对随机令牌的串联字符串进行SHA-512处理,该机器的MAC地址并将其存储在数据库中。这样,就像您仅存储部分密码一样cookie,并将其余的与该计算机的唯一ID相关联。同样,您可以合并浏览器/ os/machine /等独有的其他ID数据。 – 2012-01-14 23:30:54

会话过期主要是因为在服务器上保持打开状态效率不高。您需要一个cookie(或其他一些机制,但通常是cookies)将它们与浏览器关联起来。

亚马逊通过三个级别的“正在登录”来处理安全问题。

1级:基本功能正常。

等级2:您必须重新输入密码才能访问某些事物(如订单历史记录)

3级:您必须重新输入付款信息访问某些东西(如添加新的送货地址)

首先,“会话”更多的是一种概念,而不是一个具体实现的。

对于PHP,我相信会话数据存储在文件系统上的默认方式,它与通常存储在cookie中的会话ID相关联(尽管它也可以通过查询字符串参数发送:http:/ /stackoverflow.com/a/455099/23822)。

这也有可能store session in a database。这样做可以让您完全控制会话数据的存储方式以及会话数据何时到期,因此可以让会话持续时间长达您希望的时间。您只需确保会话cookie也与数据库中的数据共享相同的到期时间。

至于你在评论关于“什么阻止某人抓取cookie数据并使用令牌伪造登录名的问题?“理论上可能发生,但存储在cookie中的会话ID应该是随机的,所以它很可能不会被猜测(攻击者会更容易猜测用户的密码)。事实上,同样的事情已经发生了可能与任何类型的会话