记住我的最佳做法功能

时间:2010-08-20 13:42:42

标签: php cookies remember-me autologin

我在cookie中使用了2个变量(7天到期),即用户ID和哈希值。哈希是用户代理和用户ID的sha1编码。在这种情况下,一些黑客可以登录谁知道被盗cookie的浏览器。我应该遵循哪种方式或哪种方法最适合记住我的安全问题?

5 个答案:

答案 0 :(得分:6)

虽然您可以散列user_id和secret_key,但拦截此cookie的任何人都可以登录您的应用程序。除此之外,你可以做到这一点,以便你记住我的饼干很快就会陈旧。没人喜欢陈旧的饼干。

您可以将每个用户上次访问的时间戳存储在数据库和cookie中。每次读取cookie以记录用户时,都会检查两个时间戳是否匹配。如果他们不这样做,则拒绝用户。如果是,请更新时间戳。

使用此方法,只要您的用户返回您的网站,所有旧Cookie都会过时。截获cookie的黑客现在拥有一个毫无价值的陈旧cookie,因为他不知道当前cookie中的确切时间戳。当然,黑客可以根据需要使用新的cookie,直到用户重新登录。

//check for cookie
if(isset($_COOKIE['remember_me'])) {
   // get hash and time stamp from cookie
   $hash = substr($_COOKIE['remember_me'],0,40);
   $last_visit = substr($_COOKIE['remember_me'],41);

   // query your db with $hash and $last_visit

   // if hash and time stamp match up
      // log in

      // store the current time stamp in a variable to use for both
      $time = date("Y-m-d H:i:s");
      // update the time stamp in your cookie
      $cookie = $pass . "-" . $time;
      setcookie('remember_me', $cookie, time()+60*60*24*100, '/');
      // update the time_stamp in your database
   else {
      // remove the remember me cookie
      setcookie('remember_me', '', time()-42000, '/')
   }

这种方法提供了少量的安全性,当然也应该与其他答案中提出的方法一起使用。散列密钥应存储在cookie中。记住我的cookie不能完全安全,因此对于高度敏感的数据或应用程序功能的任何其他访问都需要重新输入密码。

我还建议在“remember_me”之外命名你的cookie,使其更难找到。虽然它没有增加太多安全性,但如果有的话,命名你的'ht33424'只需要命名'remember_me'或'hack_me'。

答案 1 :(得分:1)

你可以简单地将过期日期设置为现在加上一年的cookie,但是在所有敏感区域都有一个输入密码字段,就像亚马逊使用的实现一样。被劫持的cookie将授予访问权限,但购买或修改任何个人需要重新输入的密码。

“记住我”表的问题在于,如果黑客可以访问此表,他可以创建并登录到他想要的任意数量的帐户。你可以说它可以增强记忆我特征的安全性,但需要考虑到软化膝盖安全区域的风险。

答案 2 :(得分:0)

就个人而言,我创建一个随机哈希并将其存储在“记住我”表中。该表还具有用户代理,用户标识和IP地址。我每次从remember-me功能重新登录用户时都会检查两者。如果用户手动注销,我只需从表中删除该行。然后,如果他们再次登录,它会创建一个新的随机哈希。实际上没有办法打击使用记忆我系统嗅探数据包的人(除非您使用仅设置HTTPS标志的安全cookie)。因此,请使用仅支持HTTPS的cookie的安全连接。如果你不能,那么至少使哈希随机,所以如果发现它你至少可以生成一个新的哈希来杀死该登录......

答案 3 :(得分:0)

您最终可以使用会话来存储用户状态。但是当会话ID被盗时,持有会话这么长导致同样的问题。您可以将Cookie信息与其他浏览器或IP地址一起加入,但如果用户没有静态IP,则会导致问题。

无论如何,持有会话ID更安全,只需将用户的sha1端口密码放入cookie即可。

答案 4 :(得分:0)

HMAC

我通常这样做,所以我没有在数据库或类似的服务器端存储任何东西。

你必须生成随机字符串,它成为你的“秘密密钥”,并且你必须存储在服务器端(可能在配置php脚本中作为常量),你永远不会告诉任何人。我会将此密钥称为SECRET_KEY

然后你的cookie必须设置两个值:

  • USER_ID:将获得自动登录的用户的用户ID
  • HASHUSER_IDSECRET_KEY的安全加密哈希。例如,md5(USER_ID . "-" . SECRET_KEY)。 (与md5不同的东西,例如sha1或sha256是首选)。

所以你的最终cookie可能是:USER_ID:HASH

然后,当你必须检查一个cookie是否是真正记住我的cookie时,你必须这样做:

function isCookieGenuine($cookie_value) {
  list($value, $hash) = explode(':', $cookie_value, 2);

  if (md5($value . "-" . SECRET_KEY) == $hash)
    return true;
  else
    return false;
}

关键是只有你可以生成一个传递此检查的哈希,因为哈希不仅需要USER_ID,还需要其他人不知道的SECRET_KEY 比服务器! :)

如评论中所述,您可以使用PHP中的hash_hmac函数> = 5.1.2:http://us.php.net/manual/en/function.hash-hmac.php