Функция 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-запрос безопасен.
Если проверка не пройдена (например, отсутствует токен или запрос отправлен неверным методом), фреймворк автоматически завершает выполнение скрипта, защищая систему от атаки.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 03.08.2026 13:51
- Страница размещена: 23.01.2025 10:36
- Последнее обновление: 23.01.2025 10:36