Ошибка Error at offset X при unserialize данных из cookie
При возникновении ошибки
PHP Notice: unserialize(): Error at offset 5 of 43 bytes in /var/www/test.php on line 7
$serialized=$_COOKIE['whoiam'];
$_GET += unserialize($serialized);
что десериализует представление вида(в таком виде оно хранится на стороне клиента)
a:1:{s:6:"mynick";s:12:"glowingsword";}
стоит проверить, что за строка поступает на вход функции unserialize().
Как видно, в примере выше, мы получаем сериализованное представление из $_COOKIE. По идее десериализая должна работать корректно. Но, она не работает.
Пытаемся вывести значение $serialized в скрипте до того, как отдаём его функции unserialize()
$serialized=$_COOKIE['whoiam'];
print_r($serialized);
$_GET += unserialize($serialized);
в моём случае я получил
a:1:{s:6:\"mynick\";s:12:\"glowingsword\";}
что странно, ведь мы не экранировали кавычки функцией вроде addslashes().
Вспоминаем, что у старых версий PHP(до PHP 5.4) был такой интересный параметр, как magic_quotes_gpc, который автоматически экранировал кавычки у данных, полученных в GET, POST и COOKIE.
Если данный параметр выставлен в On в настройках используемой вашими скриптами сборке php – его необходимо выставить в Off.
Проверить его значение можно с помощью простого скрипта phpinfo.php вида
<?php
phpinfo();
?>
Ищем в выхлопе phpinfo() нужный нам параметр magic_quotes_gpc, и если он в On, добавляем в php.ini себе
magic_quotes_gpc = Off
Полезные ссылки: * https://www.php.net/manual/ru/security.magicquotes.what.php * https://www.php.net/manual/ru/info.configuration.php#ini.magic-quotes-gpc * https://www.php.net/manual/ru/security.magicquotes.disabling.php