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

时间:2014-12-11 17:20:01

标签: php

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

例如,假设我有一个链接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();
    }

2 个答案:

答案 0 :(得分:1)

事实上,可能是我错了,但从我看到的情况来看,你只需要用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');
    }
}

答案 1 :(得分:0)

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

$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脚本有权查看。