Мы Сохраняем Идентификатор В Cookie

Ваш сайт становится все более популярным, еженедельно бьются рекорды посещаемости.

Вы включаете кеширование, разбираетесь в нюансах настроек и оптимизируете.

Но наступает момент, когда одного сервера уже недостаточно, и переход на самую крутую железку в мире не находит полного понимания у властей.

Ах да, вы храните ID пользователя в PHP Session в файле и вроде бы морально готовы занести всё в базу данных, как рекомендует Интернет. Но что-то вас останавливает.



Сомнения!

Сомнения в целесообразности использования базы данных для хранения Сессий.

Сессии, в которых всего пара элементов — идентификатор пользователя и его роль.

Или даже просто идентификатор администратора.

Вас преследуют сетевые издержки, новые сущности и теорема CAP. Каждую ночь вас преследует один и тот же кошмар — не забывайте букву Б в слове Memcached… Всё, давайте посмотрим на альтернативу — хранение идентификатора клиента на своей стороне, в Cookies.

Итак, постановка задачи.

Так что

  • Масштабируемый
  • Безопасно
  • Быстрый
  • Только
Автор уважает краткость и очень широко применяет этот принцип.

«Порядок и беспорядок — это вопрос количества».



Решение

В Cookies выбираем две переменные — одна будет хранить открытый ключ, другая — данные.

Пишем бессмысленную строку текста в коде программы; это будет наш секретный ключ.

Во время инициализации мы генерируем вектор инициализации — наш открытый ключ.

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

Не будем забывать о сериализации.

Это позволит вам хранить данные разных типов.

Выгода.

Вы только что стали на шаг ближе к архитектуре без общего доступа.



Преимущества и недостатки

С масштабированием здесь все в порядке — оно ограничено только фильтрацией Кука на стороне клиента.

Передача пары по запросу решает эту проблему.

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

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

Давайте попробуем их по порядку.

Теперь давайте улучшим защиту.

Давайте установим время жизни Кука равным 0. Тогда закрытие браузера приведет к повторной генерации открытого ключа в следующий раз.

Для усложнения расшифровки будем использовать «длинный» алгоритм с ключом в 256 бит. Далее мы привяжем открытый ключ к IP-адресу клиента.

Например, потому что мд5 И MCRYPT_RIJNDAEL_256 прекрасно дополняют друг друга:

   

$secret = md5(md5('My secret key') .

md5($_SERVER['REMOTE_ADDR']));

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

Охранники могут заменить его штампом и заблокировать IP вместе с аккаунтом.

Отправить вертолёт. Симметричное шифрование быстрее, чем сетевая связь.

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

«Привет, %ID%» мы можем показать сразу, без накладных расходов.

Работать с Cookies в приложении сложнее, чем с сеансом.

Особенно, если последняя используется как мини-база данных и отображается на экране в разных местах программы.

Мы знаем, что это плохая практика; темное прошлое усложнит вам путь к светлому будущему.

Так пусть же популярность вашего сервиса станет мотиватором для рефакторинга! В конце концов, вы нужны вашим клиентам, а они нужны вам.

С фреймворками MVC определенно проще.



Нужно больше кода!

Класс для Zend Framework 1.x, реализующий хранилище файлов cookie аутентификации — здесь .

Даже если вы не используете ZF при высоких нагрузках (хм, автор почему-то в этом уверен), то среднестатистическому джедаю достаточно пары сотен строк кода, чтобы понять и воспроизвести принцип в своем любимом рамки или session_set_save_handler .

Вторник.

Автор будет благодарен за любые найденные где-либо ошибки.

Теги: #php #Cookies #аутентификация #php #Zend Framework

Вместе с данным постом часто просматривают: