为什么在Cookie中存储登录信息不安全?

Eri*_*ith 1 php security cookies session web

我已经读过,在cookie中存储登录信息存在安全风险,因为用户可以轻松编辑它们.我的问题是,如果我存储的所有内容都是cookie中的用户名和密码,那么为什么它存在风险?如果我只是创建了一个简单的身份验证脚本,以确保在从数据库中检索信息之前密码和用户名匹配,为什么这会有风险?编辑cookie的用户仍然需要知道匹配在一起的正确用户名和密码才能获得访问权限.我打算这样做,这样用户可以在会话结束后保持登录状态.

Maj*_*ssi 8

好吧,如果您将用户名和密码存储在cookie中,那么任何有权访问计算机的人都可以访问它们.

这不是很安全.

  • @EricSmith如果你像那样来回触发哈希,那么哈希本质上就成了密码,而你实际上并不需要知道"真正的"密码是什么. (2认同)

Sam*_*tch 5

不,不要这样做.这几乎是最糟糕的方式.

更好的解决方案是:

  1. 让用户登录.
  2. 生成随机令牌,即: $token = md5( time() . rand() . $username );
  3. 将令牌存储在cookie中,以及与用户ID一起存储在数据库中,以及用于登录的IP地址.
  4. 开始一个会话.

这样,当会话到期时,您仍然可以检查cookie中的令牌,将其与存储在数据库中的令牌以及IP地址进行比较,然后为用户处理非交互式登录.

通过这种方式你这样做:

  1. 不将用户凭据存储在服务器外的任何位置.
  2. 提供针对cookie劫持的基线保护.

您还应该将时间戳与令牌一起存储,并在30或60天等合理时间段后使其到期,以便用户不会永久登录到他们可能不想登录的计算机.同样,用户可以选择查看所有登录令牌并使其无效,这样他们就可以对自己的帐户安全负责.

回复:@Gumbo的评论:

我觉得你有点模糊rand().即使您知道用户的名字以及他们[通过服务器的时钟]登录的确切秒数,仍然会留下20亿个可能的值rand().[在我的系统上]如果你想开始猜测MD5哈希值是2 ^ 128种可能性,如果你不在与令牌一起存储在数据库中的同一IP地址上,那就完全没有意义了.

由于以下原因,这些项目是从我的头顶选择的:

  1. $username:所以令牌应该是每个用户唯一的.
  2. time():所以令牌每秒都是唯一的
  3. rand():所以令牌是合理随机的
  4. md5():因为我觉得这样.MD5的十六进制字符串易于在代码中使用,在这种情况下,可逆性是一个有争议的问题.我们只对令牌难以猜测感兴趣.

使用mt_rand()和sha512或bcrypt或我不在乎什么,但事实仍然是在这种情况下没有必要.