Десериализация PHP-сессии в Битриксе: как расшифровать и проанализировать данные пользователей

Иногда при возникает необходимость посмотреть какие данные хранятся в пользовательских сессиях, причин для этого множество. Так работая над задачей по ускорению работы сайта наткнулся на то что в сессии огромный объем данных у пользователей - по 5Мб. Получив данные в виде закодированной строки мало что понятно

deserialize1.png

В настройках php.ini можно посмотреть какой обработчик используется для сериализации данных перед сохранением. Чаще всего это значение - php
deserialiaze2.png

В сети можно найти примеры php кода для десериализации данных, например этот


function unserialize_php($session_data)
{
    $return_data = array();
    $offset = 0;
    while ($offset < strlen($session_data)) {
        if (!strstr(substr($session_data, $offset), "|")) {
            throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
        }
        $pos = strpos($session_data, "|", $offset);
        $num = $pos - $offset;
        $varname = substr($session_data, $offset, $num);
        $offset += $num + 1;
        $data = unserialize(substr($session_data, $offset));
        $return_data[$varname] = $data;
        $offset += strlen(serialize($data));
    }
    return $return_data;
}

// для битрикса нужно дважды декодировать данные
$sesionData = 'VTBWVFUxOUJWeEpRMW...';
$sesionData = base64_decode($sesionData);
$sesionData = base64_decode($sesionData);
// $sesionData = 'SESS_AUTH|a:1:{s:6:"POLICY";....';

print_r(unserialize_php($sesionData));

В итоге из полученного представления стало возможным выявить причины большого объема данных в сессии и исправить.

deserialize_4.png

Обратно к списку