Блокировка к сайту по IP с маской
Пытаюсь сделать блокировку к сайту по IP + с маской диапазона. Вида 190.9.182.0/23
Загрузила на хостинг протестировать. Не работает. Что не так?
<?php
// Функция проверки вхождения IP-адреса в подсеть:
$ip = $_SERVER['REMOTE_ADDR'];
function ip_in_net($ip, $net, $mask) {
// Преобразование IP в беззнаковое десятичное целое число:
$ip = (int)sprintf("%u", ip2long($ip));
$mask = (int)sprintf("%u", ip2long($mask));
$net = (int)sprintf("%u", ip2long($net));
if (($ip & $mask) == $net) {
return 1;
}
else {
return 0;
}
}
// Поскольку подсети записаны в формате 127.0.0.0/8, то понадобится функция перевода CIDR в обычную маску: 127.0.0.0/255.0.0.0:
function cidr_to_mask($mask) {
return long2ip(pow(2, 32)-pow(2, (32-$mask)));
}
// Загружаем файл с базой подсетей, не забываем указать правильный путь к файлу:
$file = $_SERVER['DOCUMENT_ROOT'].'ipbase.txt';
// Если файл существует и доступен для чтения:
if (is_readable($file)) {
// Считываем файл в массив:
$nets = @file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
// Проходим массив циклом:
for($i = 0, $size = sizeof($nets); $i < $size; $i++) {
// Если строка существует:
if ($nets[$i]) {
// Разбиваем строку на массив, в качестве значений используются адрес и маска подсети:
$line = explode('/', $nets[$i]);
$mask = cidr_to_mask($line[1]); // Переводим CIDR в обычную маску
$net = $line[0];
// Проверяем вхождение IP-адреса в подсеть:
if (ip_in_net($ip, $net, $mask)) {
// Если IP-адрес входит в подсеть, выводим результат:
echo 'Адрес '.$ip.' входит в подсеть '.$net.'/'.$mask;
// Или задаем значение переменной $ip для использования за пределами данного цикла (в правиле ниже):
$ip = 'yes';
break; // Прерываем цикл
}
}
}
}
?>
Делалось там способом (рабочий) если без использования маски:
<?php
$file = file('black.txt', FILE_IGNORE_NEW_LINES);
$cr = array();
foreach($file as $value)
{
list($ip) = explode('|', $value);
$cr[] = $ip;
}
if(in_array($_SERVER['REMOTE_ADDR'],$cr) ){
echo "СТОП!";
exit();
}
?>