Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Cookie в PHP 7.4

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

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

Слева как куки ставились до ПХП 7.4, справа — как ставятся теперь, пробел кодировался как «+», «плюс» — как «%2B»

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

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

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

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

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

2 комментария
Oleg Gorbunov 2020

Я кстати помню, что в эгее был баг, не позволяющий подписаться со знаком + в почте. Бирману писал, но он проигнорировал. А я часто пользуюсь этим способом: в джимейла можно писать на любой адрес в формате имяпользователя+чтоугодно@gmail.com письма потом легко фильтровать, искать, добавлять в спам, итд.

Евгений Степанищев 2020

Да я и сам пользуюсь. Напишу Илье.

Fyodor Ustinov 2020

А я помню удивился, почему у меня + оказался. Тоже подумал — мало-ли, сам накосячил при вводе.

Евгений Степанищев 2020

Илье про проблему рассказал, но он пока ничего не ответил, надо наверное самому патч изготовить.