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