我已经读过将登录信息存储在 cookie 中存在安全风险,因为它们很容易被用户编辑。我的问题是,如果我存储的只是 cookie 中的用户名和密码,那为什么会有风险?如果我只是制作了一个简单的身份验证脚本来确保在从数据库中检索信息之前密码和用户名匹配,为什么会有风险?编辑 cookie 的用户仍然需要知道正确的用户名和密码才能获得访问权限。我计划这样做,以便用户可以在会话结束后保持登录状态。
问问题
1196 次
2 回答
8
好吧,如果您将用户名和密码存储在 cookie 中,那么任何可以访问计算机的人都可以访问它们。
这不会很安全。
于 2013-01-09T19:37:53.797 回答
5
不,不要这样做。这几乎是最糟糕的方法。
更好的解决方案是:
- 让用户登录。
- 生成一个随机令牌,即:
$token = md5( time() . rand() . $username );
- 将令牌存储在 cookie 中,以及用户 ID 和用于登录的 IP 地址旁边的数据库中。
- 开始一个会话。
这样,当会话到期时,您仍然可以检查 cookie 中的令牌,将其与存储在数据库中的内容以及 IP 地址进行比较,然后为用户处理非交互式登录。
通过这样做,你是:
- 不在服务器之外的任何地方存储用户的凭据。
- 提供针对 cookie 劫持的基线保护。
您还应该将时间戳与令牌一起存储,并在 30 或 60 天等合理期限后过期,这样用户就不会将自己永久登录到他们可能不想登录的机器上。此外,用户还可以选择查看并使其所有登录令牌无效,以便他们可以对自己的帐户安全负责。
回复:@Gumbo 的评论:
我认为你对做什么有点模糊rand()
。即使您知道用户的姓名和他们登录的确切秒数 [通过服务器的时钟],仍然会为您留下 20 亿个可能的值rand()
。[在我的系统上] 如果您只想开始猜测 MD5 哈希值,那是 2^128 种可能性,如果您不在与令牌一起存储在数据库中的同一个 IP 地址上,那么这一切都没有实际意义。
出于以下原因,这些项目被从我的脑海中选中:
$username
:所以每个用户的令牌应该是唯一的。time()
:所以令牌每秒是唯一的rand()
:所以令牌是相当随机的md5()
: 因为我觉得。MD5 的十六进制字符串很容易在代码中使用,在这种情况下,可逆性是一个有争议的问题。我们只对使猜测代币变得困难感兴趣。
使用mt_rand()
and sha512 或 bcrypt 或 I-don't-care-what,但事实仍然是在这种情况下没有必要。
于 2013-01-09T19:58:45.443 回答