【问题标题】:Is restoring a session with cookies the right way?使用 cookie 恢复会话是否正确?
【发布时间】:2012-02-10 13:50:39
【问题描述】:

如有错误请指正:

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

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

有人喜欢怎么做,例如亚马逊?

编辑:

为了更清楚,这里是一个例子:

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

这显然很糟糕,有什么更好的方法?

【问题讨论】:

  • 我认为这个问题完全不清楚。一旦发生以下情况之一,用户就会失去他的会话:cookie 过期,服务器端会话过期。为什么你认为这是“不安全的”?

标签: php security session cookies


【解决方案1】:

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

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

也可以store session in a database。这样做可以让您完全控制会话数据的存储方式和过期时间,这样您就可以拥有可以持续多久的会话。您只需要确保会话 cookie 也与数据库中的数据共享相同的过期时间。

关于您在评论中提出的问题:“是什么阻止了某人获取 cookie 数据并使用令牌伪造登录?”理论上这可能会发生,但存储在 cookie 中的会话 ID 应该是随机的,因此它被猜到的可能性很小(攻击者会更容易猜到用户的密码)。事实上,任何类型的会话都可以实现同样的事情。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 谢谢,正是我想要的。
    【解决方案3】:

    会话过期主要是因为在服务器上保持打开状态效率低下。无论如何,您都需要一个 cookie(或其他一些机制,但通常使用 cookie)来将它们与浏览器相关联。

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

    第 1 级:基本功能正常工作。

    第 2 级:您必须重新输入密码才能访问某些内容(例如订单历史记录)

    第 3 级:您必须重新输入付款信息才能访问某些内容(例如添加新的收货地址)

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 是什么阻止了某人获取 cookie 数据并使用令牌伪造登录?
      • 我更喜欢存储与令牌关联的机器的 MAC 地址。我实际上对随机令牌的连接字符串和机器的 MAC 地址进行了 SHA-512,并将其存储在数据库中。这样,就好像您只在 cookie 中存储密码的一部分,并将其余部分与该计算机的唯一 ID 相关联。同样,您可以合并浏览器/操作系统/机器/等独有的其他 ID 数据。
      猜你喜欢
      • 2011-02-05
      • 2013-10-14
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 2017-05-22
      • 2012-07-08
      • 2020-11-08
      • 2011-06-24
      相关资源
      最近更新 更多