Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 饼干+;db令牌+;会话身份验证,我可以取消会话吗_Php_Mysql_Authentication_Cookies - Fatal编程技术网

Php 饼干+;db令牌+;会话身份验证,我可以取消会话吗

Php 饼干+;db令牌+;会话身份验证,我可以取消会话吗,php,mysql,authentication,cookies,Php,Mysql,Authentication,Cookies,我有一个小web应用程序,它使用了大量ajax。有人登录后,我们需要保持持久性的是他们的用户id和组id 按照我第一次进行身份验证的方式,我只是将它们以明文形式存储在cookies中($\u COOKIE['user\u id'],$\u COOKIE['group\u id'])。显然,这很糟糕,因为您可以修改这两个值 我不是一个经验丰富的程序员,也不需要为这个应用程序提供惊人的安全性。但那很糟糕 因此,我继续在数据库中创建一个令牌,它存储用户id、组id和散列令牌,然后将该令牌仅放在cook

我有一个小web应用程序,它使用了大量ajax。有人登录后,我们需要保持持久性的是他们的用户id和组id

按照我第一次进行身份验证的方式,我只是将它们以明文形式存储在cookies中($\u COOKIE['user\u id'],$\u COOKIE['group\u id'])。显然,这很糟糕,因为您可以修改这两个值

我不是一个经验丰富的程序员,也不需要为这个应用程序提供惊人的安全性。但那很糟糕

因此,我继续在数据库中创建一个令牌,它存储用户id、组id和散列令牌,然后将该令牌仅放在cookie中。一旦令牌经过身份验证(cookie匹配数据库),用户标识和组标识将创建为会话

这更安全,但管理用户id和组id会话(超时、重新初始化)与从Cookie中抓取这些会话的整个过程造成了很多麻烦,并使我的应用程序的实际运行不太可靠

现在接受我的技术水平,我的应用程序的简单管理+强大功能比高级别安全性更重要。。。我想知道我是否可以取消会话,并通过将用户id和组id存储在cookie中,但与散列一起进行折衷,即

COOKIE['token']=用户\u id\u val+组\u id\u val+哈希值

看起来像:23-144-JHWR8324398FJK2J4908323N23

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


这可以吗?

身份验证根本不需要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更安全。

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