Php 饼干+;db令牌+;会话身份验证,我可以取消会话吗
我有一个小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 所以我只需要一个小函数来解析这个字符串,然后做所有的事情。有人可以更改值,但显然哈希不匹配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
这可以吗?身份验证根本不需要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中生成和存储匹配的令牌,没有问题。我会在他们注销/登录时重新创建它们。但由于该应用程序的工作方式,大多数人会长时间保持登录状态