2014-12-11 3 views
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

Ну, если пользователь авторизован или, скорее, аутентифицирован, вы знаете, кто он. Вы можете основывать свое решение на показе контента в этом помещении. – Rangad

+0

Да, но запросы раздуваются и трудно читаются (я должен был бы сделать это для каждого запроса, имеющего деловые отношения с данными). Мне интересно, есть ли более простое решение. Я не могу понять что-либо сделать в функциональном коде. – 3ND

+0

«Раздутый» довольно расплывчатый. Без информации о том, как вы обрабатываете аутентификацию и разрешения, и по каким параметрам вы определяете, что пользователь имеет доступ к определенному ресурсу, ваш вопрос очень широк. – Rangad

ответ

1

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

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

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

WHERE l.user_id = :user_id 

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

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

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

UPDATE:

Измените 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 выводит правильный результат, но это не решает проблему, потому что я хочу показать список, даже если он пуст. – 3ND

+0

Итак, вы должны быть уже в порядке ... нет? Может быть, я предлагаю удалить 'WHERE'clause и поставить' l.user_id =: user_id' на уровне 'JOIN' –

+0

Noup, к сожалению – 3ND

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 скрипта, если пользователь запрашивает ресурс не был в списке пользователей, которым было разрешено его просматривать.

Смежные вопросы