Cookie в PHP 7.4

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

Выяснилось, что плюс появился сам собой, люди его и не думали ставить. Так я понял, что столкнулся с каким-то багом.

Сравнение значений HTTP-заголовков: в левом — "test=test+test%2Btest", в правом — "test=test%20test%2Btest", что демонстрирует разное кодирование пробелов и плюсов в URL.
Слева как куки ставились до ПХП 7.4, справа — как ставятся теперь, пробел кодировался как «+», «плюс» — как «%2B»

В чём примерно дело, понятно стало почти сразу — в вебе пробел иногда кодируется как «+», видимо ошибка как-то связана с этим. Сначала я неправильно подумал, что «плюс» появляется в урле, но данные пользователей туда не попадают, потом сообразил заглянуть в «куки», провёл пару экспериментов и всё встало на свои места.

Проблема воспроизводится у тех комментаторов, которые оставили свой первый комментарий до того, как мой сайт перешёл на ПХП 7.4. В этой версии сменился способ кодирования пробела в «куках» (см. на скриншоте) — был +, стало %20.

В принципе, можно вернуть «статус-кво» следующим кодом:

if (strpos($_SERVER['HTTP_COOKIE'], '+') !== false) {
    parse_str(strtr($_SERVER['HTTP_COOKIE'], ['; ' => '&']), $_COOKIE);
}

Но хорошо бы внедрить в движок блога код, который будет перекодировать такие куки у пользователей.

4 комментария

Три новые старые статьи

Свой собственный сайт появился у меня в ноябре 2000 года, кажется по адресу bolk.chat.ru. Позже мы познакомились с Алексом Экслером, который предложил хостится у него по адресу bolk.exler.ru, а в 2008-м году, после какого-то дискового сбоя, я переехал на свой домен bolknote.ru, где мой сайт обитает до сих пор. Недавно я перепечатал сюда часть своих бумажных дневников, начиная с 1989 года, и внизу, в подвале сайта у меня теперь в качестве старта сайта значится этот год.

Естественно моё присутствие в интернете началось не в 1989 году, но и до двухтысячного года что-то в интернет я писал. В частности, в 1999-м году опубликовал три статьи на «Цитфоруме» — «Хабре» того времени. В те времена это было очень круто, родители показывали бумажные распечатки своим знакомым.

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

Точные даты публикаций, к сожалению, неизвестны, но я восстановил примерные, ориентируясь на дату появления моих заметок на сайте «Веб-архива»:

Что нового в JavaScript версии 1.3 от Netscape
Найди картинку. Неизведанные возможности Web-дизайна
Блоки try… catch… finally… в JScript 5

Оставить комментарий