Как запретить авторизованным пользователям просматривать или изменять ссылки?

0

Мне интересно, как запретить авторизованным пользователям просматривать и изменять другие ресурсы пользователей.

Например, скажем, у меня есть ссылка http://something.com/dashboard/show_data/34. Теперь, как помешать мне написать что-то вроде http://something.com/dashboard/show_data/75 в адресной строке браузера и просмотреть эту страницу, хотя я не уполномочен просматривать этот ресурс, потому что он принадлежит другому пользователю? Проблема также в структуре кода, потому что я хочу показать список, даже если он пуст. Несанкционированный пользователь не может видеть данные, но страница все равно отображается. Я хочу, чтобы страница не отображалась, если она доступна не авторизованному пользователю. Query возвращает null для пустого списка и неавторизованного пользователя. Как отличить ли он пустой список или неавторизованный пользователь?

Выполняю ли я запрос некоторых параметров или самого кода?

Кроме того, у меня есть функция, которая принимает идентификатор данных (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();
    }
  • 0
    Хорошо, если пользователь авторизован или скорее аутентифицирован, вы знаете, кто он. Вы можете обосновать свое решение показывать контент на этой предпосылке.
  • 0
    Да, но запросы становятся раздутыми и трудно читаемыми (я должен был бы делать это для каждого запроса, который имеет дело с данными). Мне интересно, есть ли более простое решение. Я не могу ничего понять, чтобы сделать это в коде функции.
Показать ещё 4 комментария
Теги:

2 ответа

1
Лучший ответ

На самом деле, возможно, я ошибаюсь, но из того, что я вижу, вам просто нужно изменить свой LEFT JOIN INNER JOIN

Если 34 и 75 являются идентификаторами списка, вы уже проверяете, что этот список связан с подключенным пользователем:

У вас есть это в вашем запросе:

WHERE l.user_id = :user_id

И тогда у вас есть:

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

Таким образом, если вы измените JOIN, данные будут выводиться, только если идентификатор списка также связан с подключенным пользователем...

ОБНОВИТЬ:

Измените функцию 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');
    }
}
  • 0
    INNER JOIN выводит правильный результат, но это не решает проблему, потому что я хочу показать список, даже если он пуст.
  • 0
    Значит, с тобой уже все в порядке ... нет? Может быть, я предлагаю удалить WHERE и поместить l.user_id = :user_id на уровень JOIN
Показать ещё 5 комментариев
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-скрипта, если пользователь, запрашивающий ресурс, не был в списке пользователей, которым было разрешено просматривать Это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню