Мне интересно, как запретить авторизованным пользователям просматривать и изменять другие ресурсы пользователей.
Например, скажем, у меня есть ссылка 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();
}
На самом деле, возможно, я ошибаюсь, но из того, что я вижу, вам просто нужно изменить свой 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');
}
}
WHERE
и поместить l.user_id = :user_id
на уровень JOIN
Вы бы хотели проверить, что текущий пользователь вошел в список пользователей, которым было разрешено использовать запрошенный ресурс. Вы захотите запустить эту проверку сразу после возвращения данных из базы данных, но перед ее выходом к пользователю.
$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-скрипта, если пользователь, запрашивающий ресурс, не был в списке пользователей, которым было разрешено просматривать Это.