Категории форума

Предупреждение Warning: unserialize(): Extra data starting in CommentsWidget.php

Фиксим предупреждения об ошибках в плагине "Comments" при добавлении комментариев

webitproff
webitproff • 29.08.2025 19:35 #356

Ошибка Warning: unserialize(): Extra data starting at offset 146 of 147 bytes указывает на то, что данные, которые пытаются десериализовать в файле CommentsWidget.php, повреждены или имеют неправильный формат, из-за чего функция PHP unserialize() завершается с ошибкой. Скорее всего, это связано с некорректными или подделанными данными в параметре GET ci, который декодируется из base64 и затем десериализуется. Чтобы исправить это, нужно добавить проверку данных и обработку ошибок, чтобы убедиться, что данные безопасны и правильно отформатированы перед попыткой десериализации.

Вот исправленный код с добавленной проверкой, обработкой ошибок

		// Get the URL parameters of the current page where the comment widget is displayed.
		if (COT_AJAX && Cot::$env['ext'] === 'comments' && isset($_GET['ci'])) {
			$ci = cot_import('ci', 'G', 'TXT'); // Берём параметр ci из GET
			if (!empty($ci)) {
				$decoded = base64_decode($ci, true); // Декодируем base64 (true = строгая проверка)
				if ($decoded !== false) {
					// trim убирает возможные пробелы/переносы, @ подавляет warning при ошибке
					$unserialized = @unserialize(trim($decoded));
					if ($unserialized !== false && is_array($unserialized)) {
						$this->currentUrlExtension = $unserialized[0]; // Расширение
						$this->currentUrlParams    = $unserialized[1]; // Параметры
					}
				}
			}
		} elseif (
			Cot::$env['ext'] !== 'comments'
			|| !isset($_GET['a'])
			|| $_GET['a'] !== 'display'
		) {
			$this->currentUrlExtension = Cot::$env['ext']; // Текущее расширение
			$this->currentUrlParams = $_GET;               // Все GET-параметры
			unset($this->currentUrlParams['e']);           // Убираем служебный параметр
			if (isset($_GET['rwr'])) {
				unset($this->currentUrlParams['rwr']);     // Убираем rwr если есть
			}
		}

 

или так

// Получаем параметры URL текущей страницы, где отображается виджет комментариев.
if (COT_AJAX && Cot::$env['ext'] === 'comments' && isset($_GET['ci'])) {
    $ci = cot_import('ci', 'G', 'TXT');
    if (!empty($ci)) {
        // Декодируем base64-строку с проверкой валидности
        $decoded = base64_decode($ci, true); // Строгий режим для base64
        if ($decoded !== false) {
            // Безопасно десериализуем данные, отключая поддержку классов
            $unserialized = @unserialize($decoded, ['allowed_classes' => false]);
            if ($unserialized !== false || $decoded === serialize(false)) {
                // Присваиваем значения, если десериализация успешна
                $this->currentUrlExtension = $unserialized[0] ?? '';
                $this->currentUrlParams = $unserialized[1] ?? [];
            }
        }
    }
} elseif (
    Cot::$env['ext'] !== 'comments'
    || !isset($_GET['a'])
    || $_GET['a'] !== 'display'
) {
    // Если не AJAX или не страница комментариев, используем текущие параметры
    $this->currentUrlExtension = Cot::$env['ext'];
    $this->currentUrlParams = $_GET;
    unset($this->currentUrlParams['e']);
    if (isset($_GET['rwr'])) {
        unset($this->currentUrlParams['rwr']);
    }
}

 

Пояснения:

Проверка base64: Используется base64_decode($ci, true) для строгой проверки валидности base64-строки.
Безопасная десериализация: Применяется @unserialize с опцией ['allowed_classes' => false] для защиты от уязвимостей и подавления предупреждений.
Проверка результата: Проверяется успешность десериализации или соответствие данным serialize(false).
Безопасное присваивание: Оператор ?? задаёт значения по умолчанию, если данные отсутствуют.

 

 

🗿

🧙‍♂️ Радуйся, странниче добрый и честный! Не понапрасну привела тя стезя в земли сии. Зде бо мужи мудры и искусники дела писменнаго и численнаго, что куют словеса и плетут узоры кода, тайны разгадывают и знанием делятся, летописи множа и ремесло цифровое творя.
⬅️ Аще налево пойдеши — обрящеши грамоты древния, писания старинныя и свитки учения. ⬆️ Аще прямо — слово мудрое и совет от мужей разумеющих, что в деле кодописном искусны, получиши. ➡️ Аще направо — сам в писцы и летописцы внидеши, и в ремесло цифровое, где строки и знаки в дело живое обращаются, слово свое в память веков вложиши.
📝 Не медли же — нареки имя свое, и вниди в чин наш, и стань с нами в братстве, где код есть магия, а строки — заклятия живыя, числом и буквою слово едины суть.
🏰 Не тайно есть собрание сие, и не инициации в нем, но многое сокрыто от пришлых и ступалого, понеже не всякому открывается знание, но токмо ищущим и пребывающим в деле сем.