这个问题在这里已经有一个答案:

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

有帮助吗?

解决方案

虽然您可以哈希user_id和secret_key,但任何拦截此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不能完全安全,因此对于高度敏感的数据或应用程序功能,应需要重新输入密码。

我还建议将您的cookie命名以外的东西,以使其难以找到。虽然它不会增加太多的安全性,但如果有的话,命名您的cookie“ ht33424''需要将其命名为'rememan_me'或'hack_me'的命名。

其他提示

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

“记住我”表的问题是,如果黑客可以访问此表,他可以创建并登录到他想要的尽可能多的帐户。您可以争辩说,它加强了记住我功能的安全性,但是需要权衡它,以减轻膝盖安全区域的风险。

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

您最终可以使用会话来存储用户状态。但是举行会话会导致相同的问题,当会话ID被盗时。您可以与其他一些(例如浏览器或IP地址)一起加入Cookie信息,但是当用户没有静态IP时,它会引起问题。

无论如何,持有会话ID更安全,仅将用户的SHA1递送密码放在cookie上。

HMAC

我通常这样做,所以我什么也没存储在数据库或类似的服务器端。

您必须生成随机字符串,该字符串成为您的“秘密密钥”,并且必须存储在服务器端(可能是在配置PHP脚本中作为常数),并且您永远不得不告诉任何人。我称这个秘密钥匙 SECRET_KEY.

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

  • USER_ID: :将自动登录的用户ID
  • HASH: :安全的加密哈希 USER_IDSECRET_KEY. 。所以,例如, md5(USER_ID . "-" . SECRET_KEY). 。 (首选与MD5不同的东西,例如SHA1或SHA256)。

因此,您的最终饼干可能是: 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 那是未知的 除服务器以外的任何人! :)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top