Как проверить подсеть ip-адресов на вхождение в другую подсеть на PHP?

Пользователь

от hanna_jacobson , в категории: PHP , 2 года назад

Как проверить подсеть ip-адресов на вхождение в другую подсеть на PHP?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от kennedi_pfeffer , 2 года назад

@hanna_jacobson 

Для проверки вхождения одной подсети IP-адресов в другую подсеть на PHP можно использовать следующий код:

1
2
3
4
5
6
7
function is_subnet($subnet, $ip) {
    $subnet_arr = explode('/', $subnet);
    $subnet_ip = ip2long($subnet_arr[0]);
    $subnet_mask = ~((1 << (32 - $subnet_arr[1])) - 1);
    $ip_long = ip2long($ip);
    return (($ip_long & $subnet_mask) == $subnet_ip);
}


Эта функция принимает два параметра: $subnet и $ip. $subnet - это подсеть, которую мы хотим проверить на вхождение в другую подсеть, а $ip - это IP-адрес, который мы хотим проверить.


Функция разбивает $subnet на IP-адрес и маску подсети, используя функцию explode(). Затем она преобразует IP-адрес подсети и IP-адрес, который мы хотим проверить, в числовые значения с помощью функции ip2long(). Затем функция вычисляет маску подсети, инвертирует ее и применяет к IP-адресу, который мы хотим проверить. Затем она сравнивает результат с IP-адресом подсети и возвращает true, если они совпадают, и false в противном случае.


Пример использования функции:

1
2
3
4
5
6
7
8
$subnet = '192.168.1.0/24';
$ip = '192.168.1.10';

if (is_subnet($subnet, $ip)) {
    echo "IP-адрес $ip находится в подсети $subnet";
} else {
    echo "IP-адрес $ip не находится в подсети $subnet";
}


В этом примере функция is_subnet() проверяет, находится ли IP-адрес 192.168.1.10 в подсети 192.168.1.0/24. Если IP-адрес находится в подсети, то будет выведено сообщение "IP-адрес 192.168.1.10 находится в подсети 192.168.1.0/24", в противном случае будет выведено сообщение "IP-адрес 192.168.1.10 не находится в подсети 192.168.1.0/24".

Пользователь

от carlo.cummerata , 4 месяца назад

@hanna_jacobson 

Вот функция на PHP, которая проверят подсеть напрямую без перевода в int:

1
2
3
4
5
6
7
8
9
function is_subnet($subnet, $ip) {
    list($subnet_ip, $subnet_mask) = explode('/', $subnet);
    $subnet_ip = ip2long($subnet_ip);
    
    $ip_long = ip2long($ip);
    $ip_masked = $ip_long & ~((1 << (32 - $subnet_mask)) - 1);
    
    return $ip_masked === $subnet_ip;
}


Эта функция проверяет, находится ли IP-адрес $ip в подсети $subnet.


Пример использования функции:

1
2
3
4
5
6
7
8
$subnet = '192.168.1.0/24';
$ip = '192.168.1.10';

if (is_subnet($subnet, $ip)) {
    echo "IP-адрес $ip находится в подсети $subnet";
} else {
    echo "IP-адрес $ip не находится в подсети $subnet";
}


В данном примере будет выведено сообщение "IP-адрес 192.168.1.10 находится в подсети 192.168.1.0/24".