вхождение IP в подсеть CIDR

106
06 мая 2021, 07:10

есть файл cidr.txt :

37.228.104.0/21
46.211.0.0/16
58.67.157.0/24
59.151.95.128/25
59.151.98.128/27

нужно определить текущий IP и проверить входит ли данный IP в список подсетей из файла.

Хелп (

Answer 1

Используй этот метод для определения вхождения:

function isIpInRange($ip, $IpRange) {
    // Получаем массив, состоящий из IP и номера маски
    $IpRange = explode('/', $IpRange);
    /*
     * Элемент массива [0] является начальным IP (сеть)
     * Конвертируем строку, содержащую IPv4-адрес в целое число
     */
    $range_start  = ip2long($IpRange[0]); 
    /*
     * Выделяем число адресов в диапазоне как 2^(32-номер_маски)
     * Делаем -1, иначе закхватываем широковещательный канал
     */
    $range_end  = $range_start + pow(2, 32-intval($IpRange[1])) - 1;
    $ip = ip2long($ip);
    return ($ip >=$range_start && $ip <= $range_end) ? 1 : 0;
}
echo $result = isIpInRange('31.173.80.80', '31.173.80.0/21'); // true
echo $result = isIpInRange('31.173.79.255', '31.173.80.0/21'); // false 

Для получения текущего IP:

function getUserIpAddr(){
    if(!empty($_SERVER['HTTP_CLIENT_IP'])){
        //ip from share internet
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    }elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
        //ip pass from proxy
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    }else{
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
echo 'User Real IP - '.getUserIpAddr();

Считываешь каждую строку из файла и проверяешь по методам выше:

if ($fh = fopen('cidr.txt', 'r')) {
    while (!feof($fh)) {
        $line = fgets($fh);
        echo $line;
    }
    fclose($fh);
}
READ ALSO
ООП в Java. Относится ли абстракция к принципам ООП?

ООП в Java. Относится ли абстракция к принципам ООП?

Хотел спросить, относится ли абстракция к принципам ООП? Почему на некоторых ресурсах только: наследование, инкапсуляция, полиморфизм?

93
Curved Bottom Navigation

Curved Bottom Navigation

Я делаю меню по этому видеоИ проект на Гитхаб

81
Пишу приложение &ldquo;Викторина&rdquo; на java под Android

Пишу приложение “Викторина” на java под Android

Пишу приложение "Викторина" на java под Android

111