В администрировании WordPress часто возникает задача блокировки IP-адресов, которые вызывают подозрительную активность или атаки. Но что делать, если блокировка должна быть временной, и IP нужно автоматически удалять из черного списка спустя заданное время? В этой статье подробно разберем, как реализовать автоматическое удаление IP из черного списка на WordPress с помощью кода и подскажем, какие плагины помогут упростить задачу.
Что такое временный черный список IP и зачем его использовать
Черный список IP — это механизм, который запрещает доступ на сайт с определенных адресов. Он помогает защитить ресурс от нежелательного трафика, спама, брутфорс-атак и других угроз.
Однако жёсткая блокировка навсегда не всегда оправдана. Часто нужна временная блокировка, чтобы дать IP-адресу «остыть» или прекратить подозрительную активность на некоторое время. Автоматическое удаление IP из черного списка позволяет:
- Снизить нагрузку на базу данных и файлы с блокировками;
- Избежать ситуации, когда легитимный пользователь заблокирован навсегда;
- Автоматизировать процесс управления безопасностью без постоянного ручного контроля.
Такой функционал полезен для сайтов с высокой посещаемостью и риском автоматических атак.
Реализация временного черного списка на WordPress: структура и логика
Для реализации временной блокировки IP нам понадобится:
- Хранить IP-адреса с меткой времени, когда они были заблокированы;
- Проверять время блокировки при каждом заходе;
- Автоматически убирать IP из списка, если срок блокировки истек.
Рассмотрим простой пример реализации на базе функций WordPress и собственного хранения данных в таблице базы данных.
Создание таблицы для хранения заблокированных IP
Используем функцию dbDelta для создания таблицы при активации плагина или темы. Таблица будет содержать IP и timestamp блокировки.
function wpall_create_blacklist_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpall_ip_blacklist';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id bigint(20) NOT NULL AUTO_INCREMENT,
ip varchar(45) NOT NULL,
blocked_at datetime NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY ip (ip)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'wpall_create_blacklist_table');Добавление IP в черный список с текущим временем
Функция для добавления IP с отметкой времени блокировки.
function wpall_add_ip_to_blacklist($ip) {
global $wpdb;
$table_name = $wpdb->prefix . 'wpall_ip_blacklist';
$now = current_time('mysql');
$wpdb->replace(
$table_name,
[
'ip' => $ip,
'blocked_at' => $now
],
['%s', '%s']
);
}Проверка IP и автоматическое удаление по времени
При каждой загрузке сайта проверяем IP посетителя, если он в черном списке и время блокировки не истекло — блокируем доступ. Если время блокировки прошло — удаляем IP.
function wpall_check_ip_blacklist() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpall_ip_blacklist';
$ip = $_SERVER['REMOTE_ADDR'];
$blocked = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE ip = %s", $ip));
if ($blocked) {
$blocked_time = strtotime($blocked->blocked_at);
$now = current_time('timestamp');
$block_duration = 3600; // Время блокировки в секундах, например 1 час
if (($now - $blocked_time) > $block_duration) {
// Время блокировки истекло, удаляем IP
$wpdb->delete($table_name, ['ip' => $ip], ['%s']);
} else {
// Блокируем доступ
wp_die('Доступ с вашего IP временно заблокирован. Попробуйте позже.');
exit;
}
}
}
add_action('init', 'wpall_check_ip_blacklist');Примеры плагинов с поддержкой временного черного списка
Если не хочется писать код самостоятельно, можно использовать готовые решения:
- Wordfence Security — мощный плагин безопасности с функцией блокировки IP и возможностью настроить время блокировки в настройках.
- All In One WP Security & Firewall — предлагает управление черными списками IP, включая временные блокировки.
- Clearfy Pro — среди множества оптимизаций и улучшений безопасности есть функции управления доступом, которые можно использовать для временных блокировок. Подробнее на wpshop.ru.
Эти плагины позволяют управлять безопасностью без глубокого погружения в код, но для кастомных задач часто удобнее реализовать свой механизм.
Советы по безопасности и производительности при реализации черного списка
1. Храните IP в отдельной таблице, чтобы не нагружать основную базу данных.
2. Ограничивайте длительность блокировки — постоянные блокировки могут привести к ошибочным блокам и ухудшению опыта пользователей.
3. Используйте кеширование, чтобы не делать запросы к базе при каждом заходе, особенно если список большой.
4. Регулярно очищайте таблицу блокировок от просроченных записей с помощью WP Cron или серверных задач.
5. Логируйте причины блокировок, чтобы понимать и анализировать угрозы, а также улучшать правила.
Автоматизация очистки устаревших записей из черного списка
Для удаления просроченных IP можно добавить WP Cron задачу, которая будет запускаться ежедневно:
function wpall_schedule_blacklist_cleanup() {
if (!wp_next_scheduled('wpall_cleanup_blacklist_hook')) {
wp_schedule_event(time(), 'daily', 'wpall_cleanup_blacklist_hook');
}
}
add_action('wp', 'wpall_schedule_blacklist_cleanup');
function wpall_cleanup_blacklist() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpall_ip_blacklist';
$expiration = date('Y-m-d H:i:s', current_time('timestamp') - 3600); // 1 час назад
$wpdb->query($wpdb->prepare("DELETE FROM $table_name WHERE blocked_at < %s", $expiration));
}
add_action('wpall_cleanup_blacklist_hook', 'wpall_cleanup_blacklist');Так вы избавитесь от устаревших блокировок без ручного вмешательства.