Безопасность сайта на WordPress — одна из ключевых задач для разработчиков и администраторов. Часто для своевременного обнаружения уязвимостей и атак требуется сбор логов и их анализ. В этой статье мы подробно разберем, как с помощью собственной функции WPDetect автоматизировать сбор логов ошибок и действий пользователей, а затем выполнять базовый анализ безопасности прямо в админке.
Почему важен автоматический сбор логов в WordPress
Стандартные логи сервера часто содержат огромный объем информации, не всегда структурированной и удобной для быстрого анализа. Особенно это актуально на shared-хостингах, где доступ к системным логам ограничен. Автоматический сбор логов внутри WordPress позволяет:
- Фильтровать события по важности и типу (ошибки, входы, попытки взлома);
- Сохранять логи отдельно, чтобы не терять важные данные при очистке кэша или обновлениях;
- Выполнять анализ и формировать отчеты для быстрого реагирования;
- Интегрировать с плагинами безопасности для расширенного мониторинга.
Рассмотрим, как это реализовать на примере собственного кода с префиксом WPDetect.
Создание функции для записи логов в отдельную таблицу
Лучше всего хранить логи в отдельной таблице базы данных, чтобы не нагружать стандартные таблицы WordPress. Для начала создадим функцию создания таблицы и функцию записи логов.
function wpdetect_create_log_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpdetect_logs';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (" .
"id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, " .
"log_type VARCHAR(50) NOT NULL, " .
"message TEXT NOT NULL, " .
"user_id BIGINT(20) UNSIGNED NULL, " .
"ip_address VARCHAR(45) NOT NULL, " .
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " .
"PRIMARY KEY(id)) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
function wpdetect_log_event($log_type, $message, $user_id = null) {
global $wpdb;
$table_name = $wpdb->prefix . 'wpdetect_logs';
$ip_address = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
$wpdb->insert($table_name, [
'log_type' => $log_type,
'message' => $message,
'user_id' => $user_id,
'ip_address' => $ip_address,
'created_at' => current_time('mysql')
]);
}
Первую функцию нужно вызывать при активации плагина или темы, чтобы создать таблицу. Второй — использовать для записи любых событий.
Пример автоматического логирования ошибок и входов пользователей
Теперь добавим хуки, которые будут автоматически записывать в лог ошибки PHP и успешные входы пользователей:
add_action('wp_login', function($user_login, $user) {
wpdetect_log_event('login', 'Пользователь вошел: ' . $user_login, $user->ID);
}, 10, 2);
set_error_handler(function($errno, $errstr, $errfile, $errline) {
$message = "Ошибка PHP: [$errno] $errstr в $errfile на строке $errline";
wpdetect_log_event('php_error', $message);
return false; // позволяет стандартному обработчику продолжить работу
});
Так мы фиксируем два важных типа событий — логины и ошибки, что уже дает фундамент для анализа безопасности.
Анализ логов: поиск подозрительной активности
Для анализа можно создать функцию, которая будет искать в логах аномалии, например, множественные ошибки входа с одного IP, частые ошибки PHP или попытки доступа к запрещенным страницам.
function wpdetect_analyze_logs() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpdetect_logs';
$results = [];
// Пример: поиск IP с более чем 5 ошибками входа за последний час
$one_hour_ago = date('Y-m-d H:i:s', strtotime('-1 hour'));
$sql = $wpdb->prepare(
"SELECT ip_address, COUNT(*) as error_count FROM $table_name " .
"WHERE log_type = %s AND created_at > %s GROUP BY ip_address HAVING error_count > 5",
'login_failed', $one_hour_ago
);
$results['suspicious_ips'] = $wpdb->get_results($sql);
// Аналогично можно добавить другие проверки
return $results;
}
Такой анализ можно запускать по cron или вручную, выводя результаты в админке.
Интеграция с плагинами безопасности
Если вы используете плагины безопасности, например Clearfy Pro, можно расширять их возможности своими логами и анализом. Например, отправлять на email уведомления при обнаружении подозрительной активности или автоматически блокировать IP.
Выводы и рекомендации
Автоматический сбор и анализ логов — незаменимый инструмент для мониторинга безопасности WordPress. Используя небольшой собственный код с функциями WPDetect, можно быстро настроить эффективный сбор важных событий и выполнять базовый анализ без сложных систем. Для более глубокой защиты рекомендуется дополнять систему популярными плагинами безопасности и регулярно обновлять WordPress и все компоненты.
Таким образом, данная статья дала практическое руководство по созданию интегрированной системы логирования и анализа, что поможет повысить устойчивость вашего сайта к атакам и быстро реагировать на инциденты.