Как реализовать систему защиты IP-адреса админ-панели через конфигурационный файл и функцию get_ip()?
Защита административной панели по IP-адресу — один из базовых, но эффективных способов ограничить несанкционированный доступ. Рассмотрим полную реализацию на примере PHP, но принципы применимы к любому языку.
## 1. Структура конфигурационного файла
Создайте файл `config.php` или `config.ini`, в котором будут храниться разрешённые IP-адреса:
php
// config.php
return [
‘allowed_ips’ => [
‘192.168.1.100’,
‘10.0.0.1’,
‘203.0.113.45’,
],
‘admin_path’ => ‘/admin’,
];
Вынесение IP-адресов в конфиг позволяет изменять список без правки основного кода и исключает хранение чувствительных данных в логике приложения.
## 2. Реализация функции get_ip()
Функция должна корректно определять реальный IP клиента, учитывая прокси и заголовки:
php
function get_ip(): string {
$headers = [
‘HTTP_CLIENT_IP’,
‘HTTP_X_FORWARDED_FOR’,
‘HTTP_X_FORWARDED’,
‘HTTP_FORWARDED_FOR’,
‘HTTP_FORWARDED’,
‘REMOTE_ADDR’,
];
foreach ($headers as $header) {
if (!empty($_SERVER[$header])) {
$ip = trim(explode(‘,’, $_SERVER[$header])[0]);
if (filter_var($ip, FILTER_VALIDATE_IP)) {
return $ip;
}
}
}
return ‘0.0.0.0’;
}
Важно: заголовки `HTTP_X_FORWARDED_FOR` и подобные могут быть подделаны клиентом. Если ваш сервер стоит за доверенным прокси или балансировщиком, доверяйте только `REMOTE_ADDR` или заголовкам, установленным самим прокси.
## 3. Middleware для проверки доступа
php
function check_admin_access(): void {
$config = require __DIR__ . ‘/config.php’;
$allowed_ips = $config[‘allowed_ips’];
$client_ip = get_ip();
if (!in_array($client_ip, $allowed_ips, true)) {
http_response_code(403);
echo ‘Доступ запрещён. Ваш IP: ‘ . htmlspecialchars($client_ip);
exit;
}
}
// Вызов в начале каждого файла админ-панели
check_admin_access();
## 4. Поддержка диапазонов IP (CIDR)
Для гибкости добавьте проверку подсетей:
php
function ip_in_range(string $ip, string $cidr): bool {
[$subnet, $mask] = explode(‘/’, $cidr);
return (ip2long($ip) & ~((1 << (32 — (int)$mask)) — 1)) === ip2long($subnet);
}
## 5. Логирование попыток доступа
Всегда логируйте неудачные попытки:
php
file_put_contents(
__DIR__ . '/logs/access_denied.log',
date('Y-m-d H:i:s') . ' | IP: ' . $client_ip . PHP_EOL,
FILE_APPEND
);
## Лучшие практики
— Храните конфиг вне публичной директории (`public_html`).
— Дополняйте IP-фильтрацию двухфакторной аутентификацией.
— Регулярно обновляйте список разрешённых IP.
— Используйте HTTPS для всех запросов к админ-панели.
— Рассмотрите использование `.htaccess` или nginx-правил как дополнительный слой защиты.
Такой подход обеспечивает надёжный первый рубеж защиты административного раздела вашего приложения.
