Найти в Дзене
PHP Боярин

Печенье для забывчивых

Когда я говорю о том, что компьютер тупой, я недоговариваю. Дело в том, что он не просто тупой, он еще и страдает от болезни Альцгеймера.

Наиболее часто на ранних стадиях распознаётся расстройство кратковременной памяти, например, неспособность вспомнить недавно заученную информацию. С развитием болезни происходит потеря долговременной памяти... (Источник - Википедия)

Как PHP-боярин, я, конечно, воспринимаю "компьютер" в значении "веб-сервер". И вот как раз этот парень (безразлично, что там под капотом: nginx, apache, еще бог знает что) ничегошеньки не помнит о том, что с ним происходило буквально 10 миллисекунд назад.

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

Мясник прекрасно помнит, сколько стоят продукты, где лежит гиря для весов, моментально взвешивает и обвешивает на нужный процент. Он обладает всеми навыками для торговли, но принципиально не собирается запоминать клиентов.

Когда вы открываете любимую веб-страницу, браузер сначала отправляет запрос на получение HTML-кода этой страницы. Затем, если на странице встретились картинки, файлы CSS, скрипты и еще что-то, каждый из дополнительных файлов будет скачан отдельным запросом.

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

Для браузера все это похоже на сюжет американского фильма "50 первых поцелуев". Персонаж фильма встречает несчастную больную девушку, с утра забывающую обо всем, что с ней произошло до определенной даты в далеком прошлом. Она находится в своем уме, способна себя обслуживать, но каждый раз, ложась спать, возвращает память к определенной дате.
При помощи хитрых махинаций, при содействии её родителей (которым, похоже, надоело держать её на своей шее), злодею удается увезти её в неизвестном направлении, убедив в том, что она по доброй воле согласилась выйти за него замуж.
Нетрудно представить себе, как этот негодяй воспользуется девушкой дальше. Очевидно, она легко внушаема (утром он загружает в неё "новую прошивку" с помощью видеокассеты), не запомнит ни единого его промаха, а когда проходимец наиграется, он сможет оставить её в любом месте - девушка не вспомнит ни его имени, ни лица.

Но мы отвлеклись.

Возникает разумный вопрос - как же тогда веб-страницы помнят посетителей? Они, оказывается, и не помнят.

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

Если вы пользуетесь европейской частью интернета, наверняка вам уже приходилось сталкиваться с проявлениями заботы о гражданах: каждая веб-страница норовит сообщить вам о том, что она использует механизм cookies.

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

Это могут быть какие-то простые вещи. Например, если вы выбрали на сайте темную тему, сервер может записать просто "выбранная тема=темная", и браузер будет каждый раз отсылать это серверу, чтобы он не забыл.

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

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

Стандартный метод PHP для создания такого идентификатора - md5-хеш от случайного числа. Алгоритм md5 допускает довольно много разных значений, поэтому просто подобрать идентификатор чужой сессии - весьма сложная задача.

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

Так что берегите cookies с молоду. Потому что серверу - ну вот прям совсем - плевать. Он как байкер-склеротик - живет моментом.