За последние 24 часа нас посетили 22920 программистов и 1226 роботов. Сейчас ищут 792 программиста ...

Логика работы с чек-боксом "Запомнить меня"

Тема в разделе "PHP для новичков", создана пользователем bocharsky, 25 дек 2014.

  1. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    не знаю что у тебя такое в $screen и $browser, но нет никаких проблем держать в одной куке
    Код (PHP):
    1. secookie('mycookiename', $id.':'.md5($чтоугодно), $expire, '/'); 
    и потом получать как
    Код (PHP):
    1. list($id, $хешотчтоугодно) = explode(':', $_COOKIE['mycookiename']); 
    Добавлено спустя 3 минуты 37 секунд:т.е. выбири в качестве разделителя любой символ, который не может присутствовать в ID и в выдаче хеш-функции.
     
  2. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Ааааааа!!!!1
    Вы гений. Точно, именно так это делается.
    Я еще думал, почему в этих заметках обсуждают "разделители". Теперь понятно.

    Ну, один запрос снят. Благодарю!

    Осталось понять
    1. Какие задачи решает хранение сессий в БД
    2. Как правильно делать "запомни меня" с запоминанием на нескольких устройств.

    Подскажете?
     
  3. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    1. не знаю. у меня такой потребности не возникало.
    2. не понял, а зачем нужно запоминание на нескольких устройствах? на каждом устройств пользователь сам решает надо его запоминать или нет. кука хранится в конкретном браузере конкретного устройства.

    если я со свого телефона зашел, то скорее всего захочу запомниться. если я с чужого компа зашел, то определенно не надо меня запоминать.
     
  4. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    слушайте, я кажется понял.

    Просто раньше я думал как:
    Для устройства №1 генерим хэш1, пишем в базу и в куку этого устройства. Для устройства №2 генерим хэш2 и пишем в куку этого устройства. И т.д. В результате надо хранить в БД N хэшей для N кук, хранящихся в N устройств.

    А когда вы показали схему с разбором составной строки, которая состоит из логина и параметров системы, то получается так:
    хэш генерим один. А уникальные куки образуются за счет хэш+уникальные параметры устройства (например, юзер агент, разрешение экрана, локал тайм и пр.). В результате в БД хранится один хэш.

    Круть. Похоже, все вопросы сняты)) Спасибо!
     
  5. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    а с разных компов как помниться?
     
  6. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Игорь (правильно я расшифровал из логина ваше имя?)
    Я новичок, но возьму на себя смелость изложить гипотезу.

    Я основываюсь на комментарии в этом обсуждении http://www.php.su/forum/topic.php?forum=74&topic=1799
    И комментарий выше мистера artoodetoo

    Итак,
    Пользователь заходит на сайт, логинится. В случае успешного логина создается кука вида «идентификатор пользователя» . «разделитель» . md5($login.$user_agent.$screen.$time)

    Идентификатор пользователя – id из базы, или логин, то по чему мы будем выбирать строку пользователя в БД.

    $user_agent.$screen.$time - "идентификаторы окружения". Параметры, которые характерируют среду текущего пользователя, например, разрешения экрана, ОС, браузер, локальное время и пр.

    Создаем такую строку, и если пользователь нажимает на «Запомнить меня», пишем ее в куку и в БД к пользователю.

    Ситуация 1. Пользователь заходит с этого же устройства.
    Мы берем его куку. Зная принцип ее составления, выделяем из нее идентификатор пользователя (id, логин).
    Ищем по этому идентификатору пользователя в БД. Если есть, берем его данные из БД, например, логин. И те данные из «среды, что использовались для составления зашифрованной части куки. Браузер, разрешения экрана, локальное время и пр.
    Генерируем такую же структуру строки и сравниваем ее с тем, что было в куке.
    Если сходится – пускаем.

    Смысл этой проверки в том, что если мы просто будем хранить в куке некий хэш, то его можно стырить и просто поставить себе. Все.

    А так взломщику придется подобрать точно такую же комбинацию, как и взламываемого.
    В той ветке форума обсуждаются еще более жесткие формы зашиты. Например, в принципе пресечь возможность перебора: при каждом неправильном сравнении перезаписывать куку. Или играть со временем жизни куки – перезаписывать по времени или по каким-то событиям и пр.

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

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

    Готов принять критику и разъяснения.
    Изложил, как понял. Спасибо
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    не, в бд не надо, смысла в этом нет
    наверное стоит делать куку
    «идентификатор пользователя» . «разделитель» . md5($login.$user_agent.соль)
    время не нужно, потом не сможешь воссоздать.

    и если канает кука, то считать, что всё хорошо и создавать сессию на него.
     
  8. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Кстати, да. Вы правы. Можно вообще обойтись без БД. Круть!)))
     
    glorsh66 нравится это.