2

我在这里阅读了一些关于这个主题的答案,人们说使用会话比只使用 cookie 更安全,但我不明白这怎么可能是真的。

假设您正在使用会话,并且在客户端的计算机上仅存储会话 ID。如果黑客获得了对客户计算机的访问权并窃取了会话 ID cookie,那么他实际上获得了对我网站上客户帐户的访问权,对吗?

现在,如果您只使用本地 cookie,并像客户端密码的散列部分 + 结合只有您的服务器知道的盐一样存储,黑客仍然可以通过从他的 PC 窃取他的 cookie 来访问他的帐户。

所以最终这两种方法没有区别,对吧?还是我错过了什么?

4

3 回答 3

3

没错,如果黑客获得了对您计算机的完全访问权限,那么无论哪种方式,您都会被塞满,直到会话在服务器端失效。

如果您只依赖 cookie 进行会话,那么使用会话 ID 或用户凭据的哈希值以及该用户唯一的盐值并不重要。它们是等效的,只要您可以调整服务器上的 salt 以使 cookie 值无效。通常您会应用两种盐:一种为每个用户定义,另一种适用于所有用户。这样,您可以根据需要使所有用户的所有会话无效,或者仅使选定的用户无效。

但是,有一个很好的理由不使用 cookie 进行会话:防止跨站点请求伪造 (XSRF)。例如,当您访问攻击者的网站时,它会调用您银行网站上的一个页面并将资金从您的帐户中转出。如果您的银行网站使用 cookie 进行会话,它将成功登录,因为浏览器会自动将会话 cookie 传递给站点。

避免这种情况的方法是在请求的有效负载中传递会话 ID 而不是作为 cookie 传递,并且在服务器端,只查看有效负载中的会话令牌来确定会话,而不是 cookie。

于 2012-10-06T09:09:24.370 回答
1

您缺少的是必须有一个team play在 cookie、数据库和会话中的点。

要获得相当多的安全性,请执行以下步骤:

  1. 当用户在选中记住我的情况下成功登录时,除了标准会话管理 cookie 之外,还会发出一个登录 cookie。

  2. 登录 cookie 包含用户的用户名和一个来自适当大空间的随机数(从这里开始的“令牌”)。用户名和令牌作为一对存储在数据库表中。

  3. 当未登录用户访问该站点并显示登录 cookie 时,会在数据库中查找用户名和令牌。

    • 如果该对存在,则认为用户已通过身份验证。使用的令牌将从数据库中删除。生成一个新令牌,与用户名一起存储在数据库中,并通过新的登录 cookie 发给用户。
    • 如果该对不存在,则忽略登录 cookie。
  4. 仅通过此机制进行身份验证的用户不得访问某些受保护的信息或功能,例如更改密码、查看个人身份信息或花钱。要执行这些操作,用户必须首先成功提交正常的用户名/密码登录表单。

  5. 由于这种方法允许用户从不同的浏览器或计算机中获得多个记住的登录信息,因此为用户提供了一种机制,可以在一次操作中清除所有记住的登录信息。

这来自 Charles Miller 的文章《持久登录 Cookie 最佳实践》

于 2012-10-06T09:07:34.870 回答
1

只是为了回答您的问题,仅此而已,会话更安全,因为存储在客户端(会话 ID)中的数据只能被黑客使用一段时间,然后自动过期。但是,如果您将登录信息的任何部分保留在客户端(作为 cookie),只要用户不更改它们,它们就会有效。您甚至可以通过每个请求重新生成会话 ID,以尽可能缩短会话 ID 的生命周期。

[编辑]

让我们调用存储在 client 中的信息The Key。它可以是会话 ID 或散列登录信息。使用此密钥用户可以验证他的请求。现在如果别人偷了The Key,他可以做任何用户可以做的事情。冒名顶替者不需要解密The Key就可以使用它,只要他可以复制它就可以了。阻止冒名顶替者的唯一方法是使The Key. 所以不管你的密钥是什么,只要它可以被复制。重要的是您何时以及如何使其无效。

于 2012-10-06T09:16:27.017 回答