应该在Cookie(PHP)中保存什么类型的信息

时间:2009-09-12 20:42:55

标签: php security cookies login

我正在创建一个登录用户的登录/注销课程,根据用户的选择设置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;
  }
}

它不是我试图提出的一个详细的例子,但我相信你可以得到它的要点......有没有人看到任何可能有问题。如果你们有任何建议id喜欢听他们......还有,你们是否使用oop来记录用户或其他任何方式。

3 个答案:

答案 0 :(得分:8)

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

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

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

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

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

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

答案 1 :(得分:1)

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

基本上,不要这样做。

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

答案 2 :(得分:0)

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

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

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

相关问题