11

(我很惊讶这个问题现在没有在 Stack 上被问到,但是我做了一些搜索并且找不到任何东西 oO)

我正在开发基于服务的 webapp,我想知道处理用户登录的最佳方式是什么。到目前为止,我有:

  1. 当用户登录时,他们提供信用。密码在本地加盐和散列,而不是通过 POST 传输到服务器(因此嗅探用户将无法检索原始密码,即在其他站点上检查它们)
  2. 登录和散列密码存储在 cookie 中,TTL 为 15 分钟(每一个 webaction 都被撤销)
  3. Passwod 在服务器端进行了加盐和哈希处理,并且与存储在数据库中的密码进行了比较(因此,密码使用不同的盐进行了双重哈希处理,这适用于将闯入数据库的人 - 他们仍然无法恢复登录贷记)
  4. 用户每 5 分钟最多可以从单个 IP 进行 3 次登录尝试
  5. 用户获取有关上次成功和不成功登录尝试的信息以及日期和 IP

有人注意到最好在 cookie 中存储唯一的会话 id 而不是散列密码,我想知道为什么它如此重要——如果有人嗅探数据包,而不是不管会话 id 与否——他们仍然可以从登录中获取包含所有数据的数据包需要冒充合法用户并自己登录。那么,与在 cookie 方法中存储登录名和哈希密码相比,存储会话 ID 方法还有其他优点吗?

4

3 回答 3

13

将散列密码存储为 cookie 是非常严重的漏洞,并且是OWASP 违规。散列密码的全部意义在于您迫使攻击者破坏散列以便登录。如果攻击者可以从数据库中提取哈希然后登录,那么你就有了一个相当于以纯文本形式存储密码的系统。

每个平台都有一个会话处理程序,在 php 中只需使用session_start()$_SESSION 超级全局。通过编写自己的会话处理程序,您将变得不那么安全。

于 2012-10-30T23:41:07.960 回答
7

通过存储会话 ID,您可以识别同一用户的不同会话,并且您可能希望以任何特殊方式处理它们(例如,只允许单个会话,或者拥有与会话相关联的数据而不是与用户相关联的数据)。

而且您可以轻松地将活动与不同的会话区分开来,因此如果您在计算机中保持打开状态,则无需更改密码即可终止会话,而其他会话不会注意到差异。

于 2012-10-30T19:50:48.713 回答
0

双重哈希并不能保护您免受攻击。如果从 cookie 中获取存储的用户 ID 和散列密码并将其发送到服务器,他将立即获得访问权限。使用会话 ID,它至少会超时。

于 2015-11-20T20:21:46.360 回答