gpt4 book ai didi

来自数据库的 PHP 权限级别

转载 作者:行者123 更新时间:2023-11-30 23:49:13 24 4
gpt4 key购买 nike

我有一个包含列的表格:

  1. 顺序
  2. 页面名称
  3. level_user
  4. level_support
  5. level_accounts
  6. level_admin

最后 4 列是访问级别(用户、支持、帐户和管理员)

这是我用来检查权限的代码:

$permission_sql="SELECT * from admin_permissions where page_name = '".$_SERVER["REQUEST_URI"]."' ";
$permission_rs=mysql_query($permission_sql,$conn);
if(mysql_num_rows($permission_rs) == 0)
{
echo '<h2 align="center">An Error has occurred!</h2>';
exit();
}
else
{
$permission_result=mysql_fetch_array($permission_rs);
if($usertype_user != $permission_result["level_user"])
{
echo '<h2 align="center">Access Denied</h2>';
echo '<h2 align="center">Please contact your administrator quoting \'Permission Error\' and number \''.$permission_result["sequence"].'\'</h2>';
exit();
}
if($usertype_support != $permission_result["level_support"])
{
echo '<h2 align="center">Access Denied</h2>';
echo '<h2 align="center">Please contact your administrator quoting \'Permission Error\' and number \''.$permission_result["sequence"].'\'</h2>';
exit();
}
if($usertype_admin != $permission_result["level_admin"])
{
echo '<h2 align="center">Access Denied</h2>';
echo '<h2 align="center">Please contact your administrator quoting \'Permission Error\' and number \''.$permission_result["sequence"].'\'</h2>';
exit();
}
if($usertype_accounts != $permission_result["level_accounts"])
{
echo '<h2 align="center">Access Denied</h2>';
echo '<h2 align="center">Please contact your administrator quoting \'Permission Error\' and number \''.$permission_result["sequence"].'\'</h2>';
exit();
}
}

我正在访问:/admin/index.php 所以我的查询是说

select * from admin_permissions where page_name = '/admin/index.php'

然后我的 if 语句运行,我登录的用户 $usertype_admin 设置为“yes”并且 $permission_result["level_admin"] 等于 ' yes' 但它显示访问被拒绝的错误,这不应该像 $usertype_admin 那样 == $permission_result["level_admin"]

我做错了什么?

最佳答案

虽然我在下面的第二部分提出了一个建议,但她根据更新的问题/信息解释了“为什么”代码不起作用。

Then my if statements run and the user i am logged in as has $usertype_admin set as 'yes' and $permission_result["level_admin"] is equal to 'yes' but its displaying the Access denied error which shouldn't be as $usertype_admin does == $permission_result["level_admin"]

这是因为 if any if 分支为真时将显示错误消息并调用 exit - 请注意每个案例的条件 !=。想象一下这个数据:

(permission)  $user   database  $user != database
------------ ------ -------- -----------------
user yes no TRUE
support yes no TRUE
admin yes yes FALSE
accounts yes no TRUE

那么可以看出,即使用户是管理员(例如$user(user)是'yes'),页面只是“请求”管理员权限,授权将失败,因为 $user(user) 为“yes”,而 database(user) 为“no”。糟糕。

这是一种方法,仅当在数据库中设置为非“否”时才需要匹配权限:

function hasAllPermissions ($permissions) {
// Note the use of a NEGATIVE selector on the database value
if($permission_result["level_admin"] != 'no'
&& $usertype_admin != $permission_result["level_admin"]) {
// Only here if a permission is set OTHER than 'no' and it does
// not equal the currently assigned user permission.
return FALSE;
}
// .. the other checks
// If we haven't rejected yet, the the database either asks for
// no permissions or we pass all permission checks.
return TRUE;
}

// In check:
if (!hasAllPermissions($permission_result)) {
// display warning and exist
}

或者,也许我们想要相反的结果:

function hasAnyPermission ($permissions) {
// Note the use of a POSITIVE selector on the database value
if($permissions["level_admin"] != 'no'
&& $usertype_admin == $permissions["level_admin"]) {
// We matched, so accept as having permission and return to
// avoid the additional checks.
return TRUE;
}
// .. the others checks
// And if nothing succeeded in matching, then we fail.
return FALSE;
}

// In check:
if (!hasAnyPermission($permission_result)) {
// display warning and exit
}

请注意这两种形式几乎相同,除了测试和返回结果的反转。

除了重做整个模式(我也推荐)之外,我建议进行一些更改:

  • 明确定义与权限相关的业务规则
  • 使用函数 - 用于条件逻辑和显示警告消息
  • $usertype_xyx 使用数组,这样 $usertype["xyz"] 镜像 $permission_result["xyz"] 并且可以传递给适当的功能

(以下是为解决原始问题而写的,我觉得它仍然有值(value)。)

SQL 旨在沿展开,而不是 - 列名应该不包含信息

当使用面向列的方法时,您必须添加对每个列名的支持并赋予其含义(请参阅“列名不应包含信息”)。虽然这可以基于启发式方法和读取动态 列形状(例如从 SELECT *)来完成,但我建议不要采用这种方法。

相反,对于具有基于角色的权限的数据库架构,以下结构可能更合适。

Users
- Username

Pages
- PageTitle

Roles
- RoleName

Users_Roles -- Granted Roles
- FK Users
- FK Roles

Pages_Roles -- Required (or Denied) Roles
- FK Pages
- FK Roles

然后,给定一个函数hasAllRequiredPermissions($user, $page),就可以构建一个查询,该查询将使用上述表格来确定特定用途是否有所有 查看页面所需的权限和添加新角色时不需要更新 的功能。这是因为信息存在于行中,而不是列中。

此外,上述关系允许轻松扩展模型以允许诸如“如果用户具有角色则允许访问”和“如果用户具有角色则拒绝访问”之类的事情.


此外,不使用占位符是一个问题,使用$_SERVER["REQUEST_URI"] 发布的查询可能会被利用。确保在编写新的身份验证代码时使用占位符

关于来自数据库的 PHP 权限级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20255001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com