【问题标题】:What type of information should be saved in a Cookie (PHP)什么类型的信息应该保存在 Cookie (PHP) 中
【发布时间】:2009-09-13 05:11:27
【问题描述】:

我正在创建一个登录/注销类来让用户登录,根据用户的选择设置 cookie。用户输入他们的电子邮件/密码并检查数据库,电子邮件/密码组合存在创建会话,并设置 cookie(使用用户 ID)并重定向用户......然后我有一个记录用户的功能通过获取保存在该cookie中的用户ID,检查该用户ID是否存在,然后再次将用户数据保存在会话中......我想知道是否有人看到这有任何潜在的错误/不安全。

简短的例子,我相信你们可以得到它的要点......

function login($email, $password, $remember){
  // Check the database for email/password combo
  if(/*user exists*/){ // if the user exists
    $_SESSION = /*User data*/ // save the users data in a session
    if($remember){
      setcookie('user_id', /*User id*/); // save the user id in a cookie
    }
    header("location: index.php");// redirect
  }
}

function Check_Cookie(){
  if(isset($_COOKIE['user_id'])){
    return $this->Log_In_ID($_COOKIE['user_id']);
  }else{
    return false
  }
}

function Log_In_ID($id){
  //Check the database if the user id exists
  if(/*user exists*/){ // if the user exists
    $_SESSION = /*User data*/ // save the users data in a session
    header("location: index.php");// redirect
  }else{
    return false;
  }
}

这不是我试图询问的详细示例,但我确信您可以了解它的要点......有人认为这有什么潜在的问题吗?如果你们有任何建议,我很乐意听到它们......另外,你们是使用 oop 来登录用户,还是使用其他任何方式。

【问题讨论】:

    标签: php security cookies login


    【解决方案1】:

    如果您的用户 ID 是一个序列号,这是非常不安全的,因为任何人都可以根据自己的情况将他们的 cookie 更改为另一个看起来合理的数字(例如,如果我的用户 ID 是 1274,我可以尝试该范围内的其他数字)并立即欺骗该用户。

    您最好分配一个与该用户关联的临时 ID,例如 GUID。由于 GUID 在天文学上是独一无二的并且实际上是防碰撞的,因此它们也几乎不可能从系统外部猜测或预测。

    当用户登录时,您创建一个新的 GUID 并将其与用户一起存储:

    UserID        TokenID                                        Expires
    1274          {3F2504E0-4F89-11D3-9A0C-0305E82C3301}         9/25/2009 12:00:00
    

    当用户返回时,通过令牌查找他们的用户 ID,确保令牌没有过期并登录。然后更改他们的令牌。这可以保护您免受以下情况的影响:

    • 攻击者无法猜测和欺骗其他用户的令牌
    • 无法通过忽略 cookie 的过期日期来规避令牌过期
    • 由于令牌不断变化,即使攻击者确实设法访问了用户的 cookie,接管的机会窗口也非常小。

    【讨论】:

    • 除此之外,您还可以检查用户的IP地址是否在同一范围内和浏览器字符串,以确保它是同一台计算机。
    • @Milan 好建议 - 也是要检查的好东西,尽管 IMO 稍微超出了这个特定问题的范围。
    • 很好的解决方案,雷克斯。另一种选择是仅依赖 cookie 的 sessionid——假设您可以控制和理解会话设置。没有理由不设置较长的会话生命周期。您的解决方案仍然优越,因为您正在切换令牌 - 尽管您可以在每个请求上设置一个最后访问 cookie,并在用户“离开”足够长的时间时重新生成用户的 sessionid。
    【解决方案2】:

    您不应信任 cookie 数据。如果我编辑我的 cookie 并将我的 ID 设置为“1”(可能是管理用户)会发生什么?

    基本上,不要这样做。

    如果您想要“记住我”类型的功能,只需将用户名保存在 cookie 中,这样您就可以在用户返回时预先填充登录表单 - 但强制他们重新进行身份验证。

    【讨论】:

    • 很明显,并非所有网站都如此严苛并且仍然足够安全。我认为问题是如何为用户实现这种程度的轻松。
    【解决方案3】:

    Cookie 很容易更改 - 因此,如果您只存储 ID,用户可以更改它。通过猜测他们可以访问其他帐户,甚至可能获得管理员访问权限。通常,当我使用 cookie 进行身份验证时,我会将 ID 与令牌一起存储。

    您可以获取 ID 和盐值的哈希值并将其存储 - 然后您可以在用户连接时验证令牌。它并不完美,对于高安全性站点还有更多考虑因素 - 但对于标准站点来说,这应该是一个良好的开端。

    另一种策略是存储一个长的唯一会话 ID 并使用它来重新登录用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 2014-09-28
      相关资源
      最近更新 更多