За последние 24 часа нас посетили 23326 программистов и 1512 роботов. Сейчас ищут 785 программистов ...

Права доступа

Тема в разделе "PHP для новичков", создана пользователем machetero, 8 май 2016.

  1. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Тут в одном топике недавно вскольз упоминалось что нельзя только лишь на основании куки давать или не давать пользователю доступ к тем или иным разделам ресурса.
    Как я вижу управление доступом сейчас:
    1)Пользователь у нас уже зареган.
    2)Далее он входит и ставит галочку "Запомнить меня". Ему летит кука например с логином.
    3)Обращается к разделу сайта для которого требуются привелегии.
    4)Где нибудь в контроллере(а может это будет в мидлвэрэ) вытягиваем пользователя из базы, его роль(например он у нас админ)
    5) Если для этой роли (админ) его можно пустить в нужный раздел сайта (админка) пускаем, если нет редирект.
    Пункты 4 и 5 повторяются для каждого запроса, если для отображения нужны привилегии.
    Так это делается правильно ?
    --- Добавлено ---
    Удивительно, а сейчас у меня кнопка "редактировать" есть
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Надо логин пользователя писать только в сессию. Куки сессии это идентификатор, очень длинный, чтобы его не подобрали.
    Только кто имеет этот идентификатор в куки и по нему найден файл в папке с сессиями, то значит этот пользователь входил на сайт.
    Если просто в куки записать логин, то можно его будет поменять на логин админа или заменить логином другого пользователя.
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Идентификационну куку защищают подписью. Например как устроена кука WordPress:
    "username|expiration|token|hmac"
    По логину из таблицы users вытягивается запись пользователя. Затем token, username, expiration, соль из конфига и пароль из базы пропускаются через хеш-функцию и сравниваются с hmac.
    Expiration здесь присутствует чтобы нельзя было предъявить старое однажды украденное значение.

    Если expiration > time(), авторизация не состоится. Если ручками изменишь expiratiuon, то хеш hmac станет неверным.
    Если заменить логин на административный — опять же проверочный хеш не сойдется. При этом зная куку вычислить пароль тоже не получится, ибо не все параметры известны. Теоретически можно зная свой пароль брутфорсом подобрать значение секретной соли, но это весьма трудоёмкая процедура, на простом компе замучишся считать.
    --- Добавлено ---
    В сессии тоже часто хранят данные. Но сложно реализовать "запомнить меня". Потому что сессия не может жить долго! Всё равно придется заводить какую-то долгоживущую куку по которой восстанавливается сессионный user_id. Я считаю это лишней сложностью.

    Моя упрощенная проверка куки WP: https://gist.github.com/artoodetoo/0d8cd9be2c67483976d1
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768