Ошибка 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).
Безопасное присваивание: Оператор ?? задаёт значения по умолчанию, если данные отсутствуют.