Функция cot_log в Cotonti

Функция cot_log предназначена для записи события в журнал, обеспечивая возможность отслеживания различных операций в системе, таких как действия администраторов, изменения в модулях и плагинах.

Функция cot_log предназначена для записи события в журнал, обеспечивая возможность отслеживания различных операций в системе, таких как действия администраторов, изменения в модулях и плагинах.

/**
 * Logs an event
 *
 * @param string $text Event description
 * @param string $group Event group (Variants: adm/sec/ext/{ext_code} where {ext_code} is extension code ex. 'forums' or 'comments')
 * @param string $type Event type
 * @param string $status Event status
 * @param array $extra_data Event additional data for extrafields
 */
function cot_log($text, $group = 'adm', $type = '', $status = '', $extra_data = [])
{
    global $cot_plugins_enabled, $cot_modules;

    // If the application has not been initialized yet
    if (
        empty(Cot::$cfg)
        || empty(Cot::$db)
        || !isset(Cot::$cfg['loggerlevel'])
        || Cot::$cfg['loggerlevel'] === 'none'
    ) {
        return false;
    }

    $log_work = false;
    if (Cot::$cfg['loggerlevel'] == 'all') {
        $log_work = true;
    } else {
        $loggerlevel = [Cot::$cfg['loggerlevel']];
        if (stripos(Cot::$cfg['loggerlevel'], '+') !== false) {
            $loggerlevel = explode('+', Cot::$cfg['loggerlevel']);
        }
        if (
            in_array('ext', $loggerlevel)
            && isset($cot_plugins_enabled)
            && is_array($cot_plugins_enabled)
            && isset($cot_modules)
            && is_array($cot_modules)
        ) {
            foreach (array_merge(array_keys($cot_plugins_enabled), array_keys($cot_modules)) as $ext) {
                if ($ext == $group) {
                    if (isset($cfg[$ext]['loggerlevel'])) {
                        if (Cot::$cfg[$ext]['loggerlevel'] != 'none') {
                            if (Cot::$cfg[$ext]['loggerlevel'] == 'all') {
                                $log_work = true;
                            } else {
                                if ($type) {
                                    if (stripos(Cot::$cfg[$ext]['loggerlevel'], '+') !== false) {
                                        $loggerlevel_ext = explode('+', Cot::$cfg[$ext]['loggerlevel']);
                                        if (in_array($type, $loggerlevel_ext)) {
                                            $log_work = true;
                                        }
                                    } elseif (Cot::$cfg[$ext]['loggerlevel'] == $type) {
                                        $log_work = true;
                                    }
                                }
                            }
                        }
                    } else {
                        $log_work = true;
                    }
                    break;
                }
            }
        }
        if (!$log_work && in_array($group, $loggerlevel)) {
            $log_work = true;
        }
    }

    if (!$log_work) {
        return false;
    }

    $loger_data = [
        'log_date'  => (int) Cot::$sys['now'],
        'log_ip'    => (!empty(Cot::$usr['ip'])) ? Cot::$usr['ip'] : '',
        'log_uid'   => isset(Cot::$usr['id']) ? Cot::$usr['id'] : 0,
        'log_name'  => isset(Cot::$usr['name']) ? Cot::$usr['name'] : '',
        'log_uri'   => cot_cutstring(Cot::$sys['uri_curr'], 255),
        'log_group' => (!empty($group) || $group == '0') ? $group : '',
        'log_type'  => $type,
        'log_status'=> $status,
        'log_text'  => cot_cutstring($text, 255)
    ];

    if (!empty($extra_data)) {
        if (!empty(Cot::$extrafields[Cot::$db->logger])) {
            foreach (Cot::$extrafields[Cot::$db->logger] as $exfld) {
                if (isset($extra_data[$exfld['field_name']])) {
                    $loger_data['log_' . $exfld['field_name']] = $extra_data[$exfld['field_name']];
                }
            }
        }
    }

    /* === Hook === */
    foreach (cot_getextplugins('loger.event') as $pl) {
        include $pl;
    }
    /* ===== */

    Cot::$db->insert(Cot::$db->logger, $loger_data);

    return true;
}


Разберем функцию cot_log построчно:

Параметры функции:

1. $text (string) — описание события, которое будет записано в журнал.


2. $group (string) — группа события (например, adm для администрирования, sec для безопасности, ext/{ext_code} для расширений, где {ext_code} — это код расширения).


3. $type (string) — тип события (например, create, update, delete).


4. $status (string) — статус события (например, success, failure).


5. $extra_data (array) — дополнительные данные, которые могут быть добавлены к записи события (например, дополнительные поля для расширений).


Алгоритм работы функции:


Проверка и инициализация:

Функция начинает с проверки нескольких условий для того, чтобы убедиться, что конфигурация системы (Cot::$cfg), база данных (Cot::$db) и уровень логирования установлены. Если они не инициализированы или уровень логирования выключен (none), функция не будет выполнять запись в журнал.

Определение необходимости логирования:

Если уровень логирования установлен как all, то логирование выполняется для всех событий.
В противном случае анализируется список разрешённых уровней логирования, и если событие соответствует этим уровням, то оно будет зафиксировано.

Проверка уровня логирования для расширений:

Если событие относится к определенному расширению (плагин или модуль), проверяется, разрешено ли логирование для этого расширения и его типа. Для этого анализируются настройки логирования для конкретного расширения.

Заполнение данных для записи в журнал:

Если логирование разрешено, собираются данные для записи в журнал, включая информацию о времени события, IP-адресе пользователя, идентификаторе пользователя, его имени, текущем URI и других данных.
Если переданы дополнительные данные через параметр $extra_data, они добавляются к данным события (например, дополнительные поля, определённые для базы данных журналов).


Расширения и плагины:

До записи события в журнал, функция вызывает хуки для внешних плагинов, которые могут дополнительно модифицировать процесс записи (например, добавление новых данных в журнал).


Запись события в базу данных:

В завершение все собранные данные записываются в таблицу журнала базы данных с помощью метода insert объекта базы данных (Cot::$db).


Возврат значения:

Если событие успешно записано в журнал, функция возвращает true. Если по каким-либо причинам запись не была произведена, возвращается false.

Применение:

Функция cot_log используется для отслеживания действий в системе, таких как создание, редактирование или удаление данных, а также для записи информации о действиях пользователей или администраторов. Это полезно для ведения учёта событий в системе, аудита и диагностики.

Пример записи события:
 
cot_log('New user registered', 'adm', 'create', 'success');


В этом примере фиксируется событие о регистрации нового пользователя, которое относится к группе "adm" (администрирование), имеет тип "create" (создание) и статус "success" (успешно).

Эта функция позволяет гибко настроить логирование в зависимости от конфигурации и уровня логирования, предоставляя подробную информацию о действиях в системе.


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

if (empty($userSelectCondition)) {
        Cot::$env['status'] = '401 Unauthorized';
        cot_log("Log in failed, user : " . $rusername, 'users', 'login', 'error');
        cot_redirect(cot_url('message', 'msg=151', '', true));
    }

Разберем по шагам, что происходит:

Условие:

 
 

if (empty($userSelectCondition))

Здесь проверяется переменная $userSelectCondition, которая, вероятно, используется для проверки успешности поиска пользователя в базе данных (например, проверка пароля или существования учетной записи). Если переменная пустая, значит, пользователь не найден или не прошел проверку (например, неверный логин/пароль).


Установка статуса HTTP:

Cot::$env['status'] = '401 Unauthorized';

Устанавливается статус HTTP 401, который указывает на то, что запрос был отклонён из-за несанкционированного доступа. Это означает, что пользователь не прошел аутентификацию.

Запись события в журнал с помощью функции cot_log:

 cot_log("Log in failed, user : " . $rusername, 'users', 'login', 'error');

Эта строка вызывает функцию cot_log, чтобы записать информацию о неудачной попытке входа в систему:
$text: "Log in failed, user : " . $rusername — описание события, в данном случае сообщение о том, что вход в систему не удался, и добавляется имя пользователя $rusername, что позволяет позже понять, какая учетная запись попыталась войти.
$group: 'users' — событие относится к группе пользователей, то есть это связано с системой аутентификации пользователей.
$type: 'login' — тип события, указывающий, что ошибка произошла при попытке входа.
$status: 'error' — статус события, который в данном случае указывает на ошибку, т.е. вход не удался.

Перенаправление:

cot_redirect(cot_url('message', 'msg=151', '', true));


Если вход не удался, выполняется редирект на страницу с сообщением о неудачной попытке входа. Сообщение с кодом 151 вероятно соответствует ошибке входа и будет отображаться пользователю.


Зачем используется cot_log в этом контексте?

Функция cot_log используется для записи в журнал информации о неудачной попытке входа в систему. Это важно для:

Отслеживания активности: можно узнать, кто именно (какой пользователь) пытался войти в систему, что полезно для безопасности.
Аудита: если попытки входа часто неудачны, это может быть признаком атак или попыток несанкционированного доступа.
Диагностики: помогает администраторам системы диагностировать проблемы с аутентификацией пользователей.

Пример лога:

Запись в журнал будет выглядеть примерно так:

[Дата и время] [IP-адрес] [Пользователь] [URL] users login error Log in failed, user: johndoe

Эта информация будет доступна в журнале для дальнейшего анализа.

 

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

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

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

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

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 22.01.2025 11:48
  • Последнее обновление: 22.01.2025 11:50