【问题标题】:Cookie + db token + session authentication, can i do away with the sessionsCookie + db token + session 身份验证,我可以取消会话吗
【发布时间】:2011-05-11 01:56:57
【问题描述】:

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

我第一次进行身份验证的方式是,我只是将这些作为 clear txt 存储在 cookie ( $_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 中,但与哈希一起存储 - 即

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

看起来像:23-144-jhwr8324398fjk2j49083223n23

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

这样好吗?

【问题讨论】:

  • 作为替代方案,读取每个脚本顶部的 cookie 值,每次都将用户 ID 和组 ID 拉入新的。这样,只要 cookie 存在,您的会话就不会超时。
  • 你仍然需要维护一个有效令牌的列表,否则有人可能会开始在其中放入不同的 id 并且你们都在:22_345_fasfsdfdfklsdflk... 当然,哈希可能不匹配,但是使用彩虹表和蛮力,找出您正在使用的任何静态盐不会太难。再次提醒我仅使用常规会话有什么问题(基于 PHP 的会话)?
  • 对于这个应用程序,“记住我”行为是默认行为,因为它通常在后台保持打开状态。所以cookie是必要的。因此,为简单起见,如果我可以从 cookie 中完成所有操作,那就更好了。此外,目前,我正在尝试对 cookie 进行身份验证,并在每个脚本顶部需要时重新创建会话,但这似乎有点不稳定。对不起,我不能更准确。我意识到适当的会话管理会很好,但我似乎更容易坚持仅使用 cookie 的路线,只要它不太不安全。
  • 那么为什么您认为将用户 ID 和组 ID 与散列一起存储比仅存储散列更好?您是否希望跳过哈希查找并在不验证数据的情况下使用用户 ID 和组 ID?
  • 是的,我仍然会在 MySQL 中生成和存储匹配的令牌,没有问题。我会在他们注销/登录时重新创建它们。但由于这个应用程序的工作方式,大多数人会长时间保持登录状态

标签: php mysql authentication cookies


【解决方案1】:

您根本不需要 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 更安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多