не знаю что у тебя такое в $screen и $browser, но нет никаких проблем держать в одной куке Код (PHP): secookie('mycookiename', $id.':'.md5($чтоугодно), $expire, '/'); и потом получать как Код (PHP): list($id, $хешотчтоугодно) = explode(':', $_COOKIE['mycookiename']); Добавлено спустя 3 минуты 37 секунд:т.е. выбири в качестве разделителя любой символ, который не может присутствовать в ID и в выдаче хеш-функции.
Ааааааа!!!!1 Вы гений. Точно, именно так это делается. Я еще думал, почему в этих заметках обсуждают "разделители". Теперь понятно. Ну, один запрос снят. Благодарю! Осталось понять 1. Какие задачи решает хранение сессий в БД 2. Как правильно делать "запомни меня" с запоминанием на нескольких устройств. Подскажете?
1. не знаю. у меня такой потребности не возникало. 2. не понял, а зачем нужно запоминание на нескольких устройствах? на каждом устройств пользователь сам решает надо его запоминать или нет. кука хранится в конкретном браузере конкретного устройства. если я со свого телефона зашел, то скорее всего захочу запомниться. если я с чужого компа зашел, то определенно не надо меня запоминать.
слушайте, я кажется понял. Просто раньше я думал как: Для устройства №1 генерим хэш1, пишем в базу и в куку этого устройства. Для устройства №2 генерим хэш2 и пишем в куку этого устройства. И т.д. В результате надо хранить в БД N хэшей для N кук, хранящихся в N устройств. А когда вы показали схему с разбором составной строки, которая состоит из логина и параметров системы, то получается так: хэш генерим один. А уникальные куки образуются за счет хэш+уникальные параметры устройства (например, юзер агент, разрешение экрана, локал тайм и пр.). В результате в БД хранится один хэш. Круть. Похоже, все вопросы сняты)) Спасибо!
Игорь (правильно я расшифровал из логина ваше имя?) Я новичок, но возьму на себя смелость изложить гипотезу. Я основываюсь на комментарии в этом обсуждении 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, логин). Ищем по этому идентификатору пользователя в БД. Если есть, берем его данные из БД, например, логин. И те данные из «среды, что использовались для составления зашифрованной части куки. Браузер, разрешения экрана, локальное время и пр. Генерируем такую же структуру строки и сравниваем ее с тем, что было в куке. Если сходится – пускаем. Смысл этой проверки в том, что если мы просто будем хранить в куке некий хэш, то его можно стырить и просто поставить себе. Все. А так взломщику придется подобрать точно такую же комбинацию, как и взламываемого. В той ветке форума обсуждаются еще более жесткие формы зашиты. Например, в принципе пресечь возможность перебора: при каждом неправильном сравнении перезаписывать куку. Или играть со временем жизни куки – перезаписывать по времени или по каким-то событиям и пр. Теперь представим, что пользователь зашел с нового устройства. Куки пока нет. Если он верно залогинился, ему пишется кука по тому же принципу: берем логин и замешиваем с параметрами окружения. У нового устройства свое разрешения экрана, юзер-агент, операционка и пр. Получается, сколько бы не было у тебя устройств ты не хранишь ничего связанного с конкретным устройством. Это просто микс идентификатора пользователя с параметром окружения. Готов принять критику и разъяснения. Изложил, как понял. Спасибо
не, в бд не надо, смысла в этом нет наверное стоит делать куку «идентификатор пользователя» . «разделитель» . md5($login.$user_agent.соль) время не нужно, потом не сможешь воссоздать. и если канает кука, то считать, что всё хорошо и создавать сессию на него.