Cookie + db令牌+会话身份验证,我可以取消会话

时间:2010-11-16 21:04:59

标签: php mysql authentication cookies

我有一个小的网络应用程序,它使用了很多ajax。有人登录后,我们需要保持持久性的是他们的user_id和group_id

我第一次进行身份验证的方式,我只是将它们存储为cookie中的明确txt($ _COOKIE ['user_id'],$ _COOKIE ['group_id'])。显然这很糟糕,因为你可以修改这两个值!

我不是一位经验丰富的程序员,并且不需要为此应用程序提供大量惊人的安全性。但那非常糟糕。

因此,我继续在数据库中创建一个令牌,该令牌存储user_id,group_id和一个哈希令牌,然后将该令牌仅放在cookie中。一旦认证了令牌(cookie匹配数据库),就会将user_id和group_id创建为会话。

这更安全,但是必须管理user_id和group_id会话(超时,重新初始化)与仅从cookie中抓取它们的全部事情已经引起了很多悲痛并使我的应用程序的实际功能不太可靠。

现在接受我的技能水平,我的应用程序的简单管理+强大功能比高级安全性更重要...我想知道我是否可以取消会话,并且仍然做出妥协将user_id和group id存储在cookie中,但与hash一起存储 - 即

COOKIE ['token'] = user_id_val + group_id_val + hash_in_db

看起来像:23-144-jhwr8324398fjk2j49083223n23

所以我需要的只是一个小函数来解析该字符串并从中做所有事情。有人可以更改值,但显然哈希值不匹配。

这可以吗?

1 个答案:

答案 0 :(得分:2)

您根本不需要cookie(除了会话cookie)以进行身份​​验证。这是一个简单的无cookie验证的例子:

session_start();

// $db is a pseudo object for database access

// Verify login
$auth = false;
if (isset($_SESSION['user_id']) && isset($_SESSION['user_hash'])) {
   $user = $db->getUserById($_SESSION['user_id']);
   if ($user) {
      $hash = sha1($user->id.$user->salt);
      if ($hash === $_SESSION['user_hash']) $auth = true;
   }
}

// Make login
if (isset($_POST['login'])) {
   $user = $db->getUserByCredentials($_POST['login'], $_POST['password']);
   if ($user) {
      $_SESSION['user_id'] = $user->id;
      $_SESSION['user_hash'] = sha1($user->id.$user->salt);
      // redirect...
   }
   // redirect to error page
}

当然,这可以改进,以增加针对各种攻击,存储用户信息等的防御机制,但这是基本的想法。它比使用cookie更安全。