Безопасность URL в приложении CodeIgniter - PullRequest
3 голосов
/ 08 января 2012

Отказ от ответственности : я новичок в веб-разработке.

Сценарий : я создал приложение с использованием CodeIgniter, которое лучше всего описать как календарь событий,В приложении есть общая функция, которая позволяет вам делиться своим календарем событий с другим человеком.После входа в систему пользователь может перейти на общую страницу и выбрать из списка тех, кто поделился с ними своими календарями событий.В настоящее время, когда пользователь выбирает имя человека, который поделился с ним своим календарем событий, генерируется следующий URI:

http://example.com/folder/controller/method/id

Раздел id представляет собой owner_id в базе данныхпользователь, который поделился своим календарем с отдельным человеком.

Проблема : можно легко изменить раздел id URL-адреса на другого пользователя owner_id в базе данных.Это позволяет любому, кто делает это, получить доступ к календарю событий человека, который не разрешил совместное использование своего календаря событий.

Вопрос : Какими методами можно устранить этот пробел в безопасности?Пожалуйста, дайте мне знать, если есть что-то, что мне нужно предоставить, или объясните более четко.Заранее благодарим за ваше время и энергию.

Модель :

class Shares_model extends crud_model {

    public function __construct()
    {
        parent::__construct();

        $this->pk = 'id';
        $this->table_name = 'shares';
    }

    public function get($shared_to_user_id)
    {
        $this->db->where('shared_to_id', $shared_to_user_id);
        $ids = parent::get_all();

        $users = array();

        foreach ($ids as $id)
        {
            $users[$id->owner_id]['owner_id'] = $id->owner_id;
            $users[$id->owner_id]['owner_first_name'] = $id->owner_first_name;
            $users[$id->owner_id]['owner_last_name'] = $id->owner_last_name;
        }

        return $users;
    }   
}

Просмотр :

<div class="panel">
    <h4>Shared Planners</h4>
        <ol>
            <?php foreach($sharers as $s): ?>
            <li><a href="<?php echo base_url('user/shared/view/'.$s['owner_id']) ?>"><strong><?php echo $s['owner_first_name']." ".$s['owner_last_name'] ?></strong></a></li>
            <?php endforeach; ?>
        </ol>
</div>

Контроллер :

class Shared extends Common_Auth_Controller {

    private $end_user;

    public function __construct()
    {
        parent::__construct();

        $this->end_user = $this->ion_auth->user()->row();
        $data['end_user'] = $this->end_user;
        $this->load->vars($data);

        $this->load->model('events_model', 'events');
    }

    public function index()
    {
        $title['title'] = 'Shared';

        $this->load->model('shares_model','shares');

        $data['sharers'] = $this->shares->get($this->end_user->id);

        $this->load->view('public/head_view', $title);
        $this->load->view('user/header_view');
        $this->load->view('user/shared_view', $data);
        $this->load->view('user/footer_view');
    }

Ответы [ 6 ]

5 голосов
/ 19 января 2012

Используйте приведенную ниже логику

 <?php
            // Check if user is logged in 
            if (!$this->ion_auth->logged_in())
            {
                //Not logged in , so redirect them to login page
                redirect('account/login', 'refresh');
            }

            else{
            // So the user is logged in 
            // Get the id of the currently logged in user ( The user who is trying to view the page )
            $current_user = $this->ion_auth->get_user();
            $current_userid = $current_user->id;


            // you need an array of users who have been invited to that event by the event creator
            // As you mentioned you are storing the users who have been invited in db, get the ids to an array 

            $invited_users = getIdsOfusers();

            if (in_array($current_userid, $invited_users)) {
                // Yes, The user who is trying to view the page has access
                // you can show him the respective view
            }
            else {
                // No, The user who is trying to view the page Doesn't have  access
                show_error('You dont have access !' ,500 );
            }
    }

    ?>      
4 голосов
/ 08 января 2012

Это - то, где права доступа входят. В основном перед загрузкой страницы, проверьте из своей таблицы, чтобы видеть, действительно ли пользователь (owner_id) поделился с пользователем, который просматривает.Если это не так, просто отобразите сообщение об ошибке или в обычном режиме.

1 голос
/ 23 января 2012

Существует два этапа обеспечения надлежащего доступа к странице в защищенной системе.

  1. Аутентификация - вы должны определить, что пользователь - это тот, кем он себя считает.Обычно это выполняется с использованием файлов cookie, чтобы гарантировать, что отправленный ими файл соответствует сеансу вошедшего в систему пользователя.Этот файл cookie будет создан вами при первом входе в систему и сохранении копии токена в базе данных.Каждый раз, когда пользователь запрашивает страницу, вы делаете проверку, чтобы убедиться, что текущая PHP SESSION принадлежит вошедшему в систему пользователю и что он все еще вошел в систему.
  2. Авторизация - определите, что AUTHENTICATED пользователю действительно разрешено просматриватьчто они пытаются посмотреть.Хорошо и хорошо знать, что человек действительно тот, кем они себя называют, но это не значит, что среднестатистический Джо получает доступ к ВСЕЙ правительственной базе данных, когда ему нужно только посмотреть, кто он.Это ключевая часть вашей проблемы - действительно ли идентификатор, переданный в URI, принадлежит аутентифицированному пользователю ?Если так, покажите это.В противном случае ваш хороший друг 403. находится в режиме ожидания.

На форуме CodeIgniter есть ресурсы по настройке системы аутентификации / авторизации, доступные в виде плагинов.

1 голос
/ 23 января 2012

Если вы хотите, чтобы вошедший в систему пользователь видел только его календарь, вам не нужно передавать идентификатор через URL. Просто возьмите идентификатор пользователя из сессии и используйте этот идентификатор для получения данных календаря.

И если вы хотите, чтобы любой авторизованный / зарегистрированный пользователь видел календарь любого пользователя, вы можете просто проверить, вошел ли он в систему или нет. Если вы не вошли в систему, используйте redirect() для перенаправления на страницу с ошибкой.

А для проверки приглашенного пользователя просто извлеките идентификатор приглашенного пользователя из базы данных и используйте in_array(), чтобы проверить, приглашен или нет конкретный вошедший в систему пользователь, а затем перенаправьте, как хотите ...

1 голос
/ 19 января 2012

Вы можете защитить URL, используя CodeIgniters Encryption-Library .

1 голос
/ 08 января 2012

У вас может быть таблица, которая отслеживает все календари, к которым пользователь может получить доступ. Затем первое, что вы делаете, когда пользователь пытается получить доступ к календарю, - это проверяют, разрешено ли его просматривать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...