如何防止授权用户通过链接查看或修改


How to prevent authorized users to view or modify via links?

我想知道如何防止授权用户查看和修改其他用户的资源。

例如,假设我有一个链接 http://something.com/dashboard/show_data/34。现在,如何防止我在浏览器地址栏中编写类似 http://something.com/dashboard/show_data/75 的内容并查看该页面,即使我无权查看该资源,因为它属于其他用户?问题也出在代码结构上,因为即使列表为空,我也想显示列表。未经授权的用户无法查看数据,但页面仍会显示。如果该页面由未经授权的用户访问,我希望不显示该页面。查询对于空列表和未经授权的用户都返回 null。如何区分是空列表还是未经授权的用户?

我是查询某些参数还是在代码本身中执行此操作?

此外,我有一个函数,可以获取数据 ID(34 和 75)并显示用户数据。

    public function __construct()
    {
        parent::__construct();
        Authenticate::handleLogin(); //checks if $_SESSION['user_logged_in'] is set
    }
    public function show_list($list_id)
    {
        if (isset($list_id)) {
            //how to change this code so unauthorized users cant get this rendered view
            $task_model        = $this->loadModel('TaskModel');
            $tasks             = $task_model->showTasks($list_id);
            $this->view->tasks = $tasks;
            $this->view->render('task/task');
        } else {
            header('location:' . URL . 'dashboard/index');
        }
    }
    //in model
    public function showTasks($list_id)
    {
        if (isset($_GET['sort_task']) and !empty($_GET['sort_task'])) {
            $sort_parameter = strip_tags($_GET['sort_task']);
            $sort_order     = $this->sortData($sort_parameter);
            $sort_order     = 't.task' . $sort_order;
        } else {
            $sort_order = 't.task_name';
        }
        $sql = "SELECT t.task_name, t.task_id, t.task_priority, t.task_deadline, t.task_completed, l.list_id
                FROM task AS t
                LEFT JOIN list AS l ON l.list_id = :list_id AND l.list_id = t.list_id
                WHERE l.user_id = :user_id
                ORDER BY $sort_order";
        $query = $this->db->prepare($sql);
        $query->execute(array(':list_id' => $list_id, ':user_id' => $_SESSION['user_id']));

        return $query->fetchAll();
    }

事实上,可能是我错了,但从我所看到的,你只需要改变你的LEFT JOIN一个INNER JOIN

如果 34 和 75 是列表 ID,则您已验证此列表是否与连接的用户相关:

您的查询中有这个:

WHERE l.user_id = :user_id

然后你有:

:user_id' => $_SESSION['user_id']

因此,如果您更改JOIN,则仅当列表 ID 也与连接的用户相关时,才会输出数据...

更新:

show_list函数更改为如下所示:

public function show_list($list_id)
{
    if (isset($list_id)) {
        $sql = "SELECT count(*) as count 
                FROM list
                WHERE user_id = :user_id";
        $query = $this->db->prepare($sql);
        $query->execute(array(':user_id' => $_SESSION['user_id']));
        $row = $query->fetch();
        if ($row['count'] != 0) { //At least one list is related to this user, authorized
            //how to change this code so unauthorized users cant get this rendered view
            $task_model        = $this->loadModel('TaskModel');
            $tasks             = $task_model->showTasks($list_id);
            $this->view->tasks = $tasks;
            $this->view->render('task/task');   
        } else { //No list is related to this user, nonauthorized
            header('location:' . URL . 'dashboard/index');
        }
    } else {
        header('location:' . URL . 'dashboard/index');
    }
}

您可能希望根据有权使用所请求资源的用户列表检查当前登录的用户。您可能希望在从数据库返回数据之后,但在将其输出给用户之前立即运行此检查。

$user = isset($_SESSION['user_id']) ? $_SESSION['user_id'] : '';    
if(!in_array($user, $authorized_users)){
    header('HTTP/1.1 403 Forbidden');
    die("<h1>Sorry $user! You are not approved for accessing this resource.</h1>
    <br>Please contact the webmaster if this is in error<br>");
}

我不确定上面包含的代码如何适应实际向用户显示内容,但如果请求资源的用户不在有权查看它的用户列表中,您将使用此代码片段退出 PHP 脚本。