Функция cot_check_xp в Cotonti

Функция cot_check_xp — это важный элемент системы безопасности Cotonti, защищающий от CSRF-атак и обеспечивающий обработку только доверенных POST-запросов.

Функция cot_check_xp — это важный элемент системы безопасности Cotonti, защищающий от CSRF-атак и обеспечивающий обработку только доверенных POST-запросов. Она встроена в основные процессы фреймворка и гарантирует, что данные пользователей остаются защищёнными.

/**
 * Checks POST anti-XSS parameter
 *
 * @return bool
 */
function cot_check_xp()
{
    return (defined('COT_NO_ANTIXSS') || defined('COT_AUTH'))
        ? $_SERVER['REQUEST_METHOD'] === 'POST'
        : isset($_POST['x']);
}


Проверка POST-параметра для защиты от XSS (Cross-Site Scripting).

 

function cot_check_xp()
{
    return (defined('COT_NO_ANTIXSS') || defined('COT_AUTH'))
        ? $_SERVER['REQUEST_METHOD'] === 'POST'
        : isset($_POST['x']);
}

Комментарии и пояснения:

Эта функция проверяет, есть ли в POST-запросе определённый параметр защиты от XSS. Она возвращает true, если условие защиты выполнено, или false в противном случае. Рассмотрим каждую часть функции подробнее:

defined('COT_NO_ANTIXSS') || defined('COT_AUTH'):

Эта часть проверяет, определены ли константы COT_NO_ANTIXSS или COT_AUTH.

Если определена COT_NO_ANTIXSS, это указывает на то, что проверка XSS в текущем запросе отключена.
Если определена COT_AUTH, это означает, что запрос связан с аутентификацией пользователя, и проверка XSS осуществляется другим образом.
$_SERVER['REQUEST_METHOD'] === 'POST':
Если одна из упомянутых констант определена, функция просто проверяет, является ли текущий запрос методом POST. Если это так, функция возвращает true.

isset($_POST['x']):
Если ни COT_NO_ANTIXSS, ни COT_AUTH не определены, проверяется наличие параметра x в массиве POST-запроса.

Этот параметр (x) обычно генерируется автоматически при создании форм в Cotonti для защиты от XSS-атак.
Если параметр x отсутствует, это может быть признаком попытки XSS-атаки или некорректной отправки данных.
Общий вывод:
Эта функция защищает от XSS-атак, проверяя либо метод запроса (POST), либо наличие специального анти-XSS параметра x в POST-данных.

Пример использования в Cotonti CMF:
Функция может вызываться перед обработкой POST-запросов, чтобы убедиться, что запрос безопасен. Например:


if (!cot_check_xp()) {
    cot_die_message(950, true); // Если защита не пройдена, выдать сообщение об ошибке
}


Пояснение:
XSS-атаки позволяют злоумышленникам внедрять вредоносный код в веб-страницы. В Cotonti для защиты используется специальный параметр x, который автоматически добавляется в формы. Функция cot_check_xp проверяет наличие этого параметра в POST-запросе, чтобы убедиться, что данные были отправлены через безопасную форму, созданную самим сайтом.


Возьмем реальный код и проанализируем.
Данный код проверяет отправленные через POST данные для выполнения массовой валидации страниц в админке Cotonti, проверяет безопасность запроса с помощью функции cot_check_xp() и выполняет действия по публикации страниц, ведению логов и очистке кеша.


$paction = cot_import('paction', 'P', 'TXT');
$s = cot_import('s', 'P', 'ARR');

if ($paction == 'validate' && is_array($s)) {
    cot_check_xp();

    $perelik = '';
    $notfoundet = '';
    foreach ($s as $i => $k) {
        if ($s[$i] == '1' || $s[$i] == 'on') {
            /* === Hook  === */
            foreach (cot_getextplugins('page.admin.checked_validate') as $pl) {
                include $pl;
            }
            /* ===== */

            $sql_page = Cot::$db->query('SELECT * FROM ' . Cot::$db->pages . ' WHERE page_id = ?', $i);
            if ($row = $sql_page->fetch()) {
                $id = $row['page_id'];
                $usr['isadmin_local'] = cot_auth('page', $row['page_cat'], 'A');
                cot_block($usr['isadmin_local']);

                $sql_page = Cot::$db->update(
                    Cot::$db->pages,
                    ['page_state' => COT_PAGE_STATE_PUBLISHED],
                    'page_id= ?',
                    $id
                );

                cot_log(
                    Cot::$L['Page'] . ' #' . $id . ' - ' . Cot::$L['adm_queue_validated'],
                    'page',
                    'validate',
                    'done'
                );

                if (Cot::$cache && Cot::$cfg['cache_page']) {
                    Cot::$cache->static->clearByUri(cot_page_url($row));
                    Cot::$cache->static->clearByUri(cot_url('page', ['c' => $row['page_cat']]));
                }

                $perelik .= '#' . $id . ', ';
            } else {
                $notfoundet .= '#' . $id . ' - ' . Cot::$L['Error'] . '<br  />';
            }
        }
    }

    if (Cot::$cache) {
        Cot::$cache->db->remove('structure', 'system');
        if (Cot::$cfg['cache_index']) {
            Cot::$cache->static->clear('index');
        }
    }

    if (!empty($notfoundet)) {
        cot_error($notfoundet);
    }

    if (!empty($perelik)) {
        cot_message($perelik . ' - ' . Cot::$L['adm_queue_validated']);
    }

    cot_redirect(cot_url('admin', $urlParams, '', true));
}


Проверка действия и входных данных:

$paction = cot_import('paction', 'P', 'TXT');
$s = cot_import('s', 'P', 'ARR');

cot_import — используется для безопасного получения входных данных из POST.
Переменная $paction получает значение действия (paction), ожидается строка (TXT).
Переменная $s получает массив значений (ARR) — список страниц для обработки.

if ($paction == 'validate' && is_array($s)) {
    cot_check_xp();
    
Проверяется, что действие равно 'validate', и данные $s действительно являются массивом.
cot_check_xp() — выполняется проверка безопасности POST-запроса (анти-XSS). Если защита не пройдена, скрипт завершится.
Перебор массива и обработка страниц:

$perelik = '';
$notfoundet = '';
foreach ($s as $i => $k) {
    if ($s[$i] == '1' || $s[$i] == 'on') {
        /* === Hook  === */
        foreach (cot_getextplugins('page.admin.checked_validate') as $pl) {
            include $pl;
        }
        /* ===== */

        $sql_page = Cot::$db->query('SELECT * FROM ' . Cot::$db->pages . ' WHERE page_id = ?', $i);
        if ($row = $sql_page->fetch()) {
            ...
        }
    }
}

Переменные $perelik и $notfoundet будут хранить результаты обработки страниц (списки обработанных и не найденных страниц).
foreach ($s as $i => $k) — перебираются все страницы из массива $s.
Если значение страницы равно '1' или 'on', выполняются дальнейшие действия.
Хук page.admin.checked_validate: позволяет расширить функционал через плагины. Все файлы подключаются циклом foreach.

Валидация и публикация страницы:

$sql_page = Cot::$db->query('SELECT * FROM ' . Cot::$db->pages . ' WHERE page_id = ?', $i);
if ($row = $sql_page->fetch()) {
    $id = $row['page_id'];
    $usr['isadmin_local'] = cot_auth('page', $row['page_cat'], 'A');
    cot_block($usr['isadmin_local']);

    $sql_page = Cot::$db->update(
        Cot::$db->pages,
        ['page_state' => COT_PAGE_STATE_PUBLISHED],
        'page_id= ?',
        $id
    );

    cot_log(
        Cot::$L['Page'] . ' #' . $id . ' - ' . Cot::$L['adm_queue_validated'],
        'page',
        'validate',
        'done'
    );
    ...
}

Выполняется запрос для получения данных о странице с page_id.
cot_auth — проверяет, есть ли у текущего пользователя права администратора в категории этой страницы.
cot_block — если прав нет, выполняется принудительная остановка выполнения скрипта.
Статус страницы обновляется на опубликованный (COT_PAGE_STATE_PUBLISHED).
cot_log — добавляет запись о публикации страницы в лог системы.

Очистка кеша:

if (Cot::$cache && Cot::$cfg['cache_page']) {
    Cot::$cache->static->clearByUri(cot_page_url($row));
    Cot::$cache->static->clearByUri(cot_url('page', ['c' => $row['page_cat']]));
}

Если включён кеш, очищаются статические файлы кеша для страницы и категории.

Финальная обработка:

if (Cot::$cache) {
    Cot::$cache->db->remove('structure', 'system');
    if (Cot::$cfg['cache_index']) {
        Cot::$cache->static->clear('index');
    }
}

if (!empty($notfoundet)) {
    cot_error($notfoundet);
}

if (!empty($perelik)) {
    cot_message($perelik . ' - ' . Cot::$L['adm_queue_validated']);
}

cot_redirect(cot_url('admin', $urlParams, '', true));


Кеш структуры удаляется, а индексный кеш очищается при необходимости.

Если были страницы, которые не удалось найти, отображается сообщение об ошибке через cot_error.
Для успешно опубликованных страниц выводится сообщение с их ID через cot_message.
В конце происходит редирект на страницу админки.
Роль cot_check_xp():
Функция предотвращает обработку POST-запросов, отправленных злоумышленником, обеспечивая, что запросы происходят только из безопасных форм системы.

Описание и назначение функции cot_check_xp в Cotonti
1. Описание функции:
cot_check_xp — это системная функция в фреймворке Cotonti, которая выполняет проверку POST-запросов на наличие анти-XSS параметра. Она обеспечивает дополнительный уровень защиты от атак с использованием подделки запросов (CSRF) и инъекций через POST-формы.

2. Назначение функции:
Основная задача функции — убедиться, что POST-запрос, обрабатываемый сервером, является допустимым, т.е. был отправлен с формы, сгенерированной самим фреймворком, а не с внешнего источника. Это достигается путём проверки наличия специального ключа безопасности (анти-XSS токена).

3. Логика работы функции:

function cot_check_xp()
{
    return (defined('COT_NO_ANTIXSS') || defined('COT_AUTH'))
        ? $_SERVER['REQUEST_METHOD'] === 'POST'
        : isset($_POST['x']);
}
Проверка флагов COT_NO_ANTIXSS и COT_AUTH:

Если один из этих флагов определён:

COT_NO_ANTIXSS указывает, что проверка анти-XSS токена не требуется (например, в особых случаях).
COT_AUTH указывает, что пользователь уже авторизован, и проверка анти-XSS также может быть пропущена.
В этих случаях функция проверяет только метод HTTP-запроса (должен быть POST).

Проверка наличия анти-XSS токена:
Если флаги не определены, функция проверяет наличие параметра x в массиве $_POST. Этот параметр представляет собой анти-XSS токен, который автоматически добавляется в формы фреймворка Cotonti.

4. Роль и использование в Cotonti:
Защита от CSRF-атак:
Функция cot_check_xp предотвращает обработку POST-запросов, отправленных злоумышленниками с внешних сайтов, так как в них отсутствует корректный анти-XSS токен. Это особенно важно для операций, связанных с изменением данных (например, публикация, удаление, изменение записей).

Обеспечение целостности данных:
Функция гарантирует, что данные, поступающие на сервер, были отправлены из доверенной формы Cotonti, что исключает несанкционированное вмешательство.

Широкое применение:

cot_check_xp вызывается перед обработкой POST-запросов в таких сценариях, как:

Авторизация пользователей.
Валидация и публикация контента.
Массовая обработка данных в административной панели.
5. Пример работы функции в Cotonti:
Код:

$paction = cot_import('paction', 'P', 'TXT');
$s = cot_import('s', 'P', 'ARR');

if ($paction == 'validate' && is_array($s)) {
    cot_check_xp(); // Проверка POST-запроса на валидность

    foreach ($s as $i => $k) {
        if ($s[$i] == '1' || $s[$i] == 'on') {
            // Выполнение действия
        }
    }
}


Объяснение:

Функция cot_check_xp() проверяет, что текущий POST-запрос безопасен.
Если проверка не пройдена (например, отсутствует токен или запрос отправлен неверным методом), фреймворк автоматически завершает выполнение скрипта, защищая систему от атаки.

 

 

7 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 03.08.2026 13:51

  • Страница размещена: 23.01.2025 10:36
  • Последнее обновление: 23.01.2025 10:36