我有一个包含两个用户类的站点 - 管理员和访客。预计,管理员可以访问普通访客无法访问的某些功能。目前,分隔管理员/访客的用户标志 (admin/guest) 以 X:Y 格式存储在 cookie 中,其中 X 是用户标志(1 代表管理员,2 代表用户),Y 是唯一的用户 ID数据库中的用户。
可以通过更改 cookie 中的“X”来提升权限。因此,我想知道是否有任何方法可以防止这种情况发生?泰!
我有一个包含两个用户类的站点 - 管理员和访客。预计,管理员可以访问普通访客无法访问的某些功能。目前,分隔管理员/访客的用户标志 (admin/guest) 以 X:Y 格式存储在 cookie 中,其中 X 是用户标志(1 代表管理员,2 代表用户),Y 是唯一的用户 ID数据库中的用户。
可以通过更改 cookie 中的“X”来提升权限。因此,我想知道是否有任何方法可以防止这种情况发生?泰!
不要将权限存储在客户端上。存储验证用户所需的信息(一般来说,这意味着会话 id)。在服务器上保留处理授权级别所需的所有数据。
您应该将用户(管理员/访客)的角色存储在数据库中,并在登录时将其放入会话中。
像这样的东西:
$authUser = authenticateUser($email, $password);
//if authentication successful :
$_SESSION['role'] = $authUser['role'];
然后你可以像这样检查右边:
function isAdmin() {
return $_SESSION['role'] == 'admin';
}
您的方法存在多个安全漏洞:它允许任何人获得管理员访问权限,并且允许入侵者(非管理员、非访客)修改 cookie 值以完全错误地识别自己。基于 Quentin 和 pinouchon 的回答,您应该使用会话来控制用户访问级别......这总是比在客户端存储标志更安全。这样,存储在客户端的唯一值就是会话 ID,然后您可以使用它来获取现有会话值 ( $_SESSION['privilege_level']
) 或针对用户权限数据库。
我什至有点不愿意发布这个,但是如果由于某种原因你绝对不能使用会话,至少你应该避免发送未加密/散列的 cookie 值。它远不如使用会话安全,但您可以存储类似 X:Y:Z 的内容,其中 x 是加密的用户 ID,Y 是加密的权限标志,Z 是一个巨大的盐渍哈希,包括 X,Y,User Agent , IP 等然后在用户做某事时重新创建哈希值,并确保它与 cookie 中的哈希值匹配(这将使某人更难接管其他人的角色,这将使其更难供用户手动更改其角色。