我有一个网站有两个用户类别-管理员和访客。不出所料,管理员已经访问了普通访客不能访问的某些功能。目前,区分管理员/访客的用户标志( admin /guest)以X:Y格式存储在cookie中,其中X是用户标志(1代表管理员,2代表用户),Y是数据库中用户的唯一用户in。
权限提升可以通过更改cookie中的"X“来完成。因此,我想知道是否有任何方法可以防止这种情况发生?泰!
发布于 2012-11-30 08:31:51
您的方法存在多个安全漏洞:它允许任何人获得管理员访问权限,并允许入侵者(非管理员、非访客)修改cookie值以完全错误标识自己。基于Quentin和pinouchon的回答,您应该使用会话来控制用户访问级别……这将始终比在客户端存储标志更安全。这样,客户端上存储的惟一值就是会话ID,然后您可以使用它来获取现有的会话值($_SESSION['privilege_level'])或针对用户权限数据库。
我甚至有点不愿意发布这篇文章,但如果由于某种原因,你绝对不能使用会话,至少你应该避免发送未加密/散列的cookie值。它远不如使用会话那样安全,但您可以存储类似X: Y :Z的内容,其中X是加密的userID,Y是加密的权限标志,Z是一个巨大的加盐哈希,其中包括X、Y、用户代理、IP等。然后,每当用户执行某些操作时重新创建哈希,并确保它与cookie中的哈希匹配(这将使某人接管其他人的角色变得更加困难,也会使用户手动更改其角色变得更加困难。
发布于 2012-11-30 08:15:36
不要将权限存储在客户端上。存储对用户进行身份验证所需的信息(一般来说,这意味着会话id)。在服务器上保留处理授权级别所需的所有数据。
发布于 2012-11-30 08:21:13
您应该将用户(admin/guest)的角色存储在数据库中,并在登录时将其放入会话中。
就像这样:
$authUser = authenticateUser($email, $password);
//if authentication successful :
$_SESSION['role'] = $authUser['role'];然后你可以像这样勾选右边:
function isAdmin() {
return $_SESSION['role'] == 'admin';
}https://stackoverflow.com/questions/13637072
复制相似问题