基于cookie的“保持登录状态”最安全的方法是什么?

时间:2009-11-11 13:57:18

标签: php

“保持登录”功能最安全的方法是什么?

我认为考虑用户登录存储他们的用户ID,时间戳和cookie中的timestamp + salt + hash of their pw哈希值。然后当他们访问该网站时,检查cookie timestamp + salt + hash of their pw的哈希值是否有效

(即...(未经测试,并忽略缺少mysql_real_escape_string())

(这是在php中)

 /*
 cookie contains these fields:
 username
 timestamp
 hash
 */

 $row  = mysql_fetch_array($result); 
            ## sql would be something like select salt,
            ## username from users where user = $_COOKIE['username']

 $generated_cookie_data = my_hash_func(
            $_COOKIE['timestamp'] . 
            $row['salt_from_db'] .
             my_hash_func([$row['password'])
             )

 if ($generated_cookie_data == $_COOKIE['hash']) {
 #logged in!
 }
 else {
 #not logged in!
 }

4 个答案:

答案 0 :(得分:1)

只需生成一个长而纯的随机唯一ID。无论如何,绝对没有必要以盐+密码+ IP为基础,它绝对不能有一个模式(即不要使用IP,时间戳等)。拥有一个包含user_session(PK)和session_id(FK)列的数据库表user_id(如有必要,还有session_ttluser_ip等等)。生成会话ID并检查表中是否存在。如果没有,则将其与表中的用户ID一起保存。将完全相同的会话ID存储在长期存在的cookie中,并在每次新请求时进行检查。

答案 1 :(得分:1)

你最有可能自己这样做 - 重新发明轮子会让你受伤。使用您的Web编程框架提供的任何会话管理。什么,你没有使用框架?那你疯了,我祝你好运。

答案 2 :(得分:0)

我认为你应该在哈希中包含IP地址。这样,如果另一个用户以某种方式偷走了cookie,他们将无法访问该会话。

更安全的方法是每次用户登录并在用户表中存储随机ID时生成随机ID。哈希random + salt + password + ip

答案 3 :(得分:0)

IMO你永远不应该透露有关用户密码的信息(即使是哈希)。如果有人可以访问此哈希,他们可以在猜测用户密码时尝试多次。它们不受任何安全机制的限制,您必须保护帐户免受随机猜测。

如果我使用您描述的方法,我至少会创建一个存储在数据库中的随机数,而不是使用密码。

相关问题