Здравствуйте. Как можно сделать блокировку IP по маске? Например, есть IP c маской вида: 94.206.209.204/30 Вставляю этот IP с мaской 94.206.209.204/30 в black_list.txt Чтобы произошла блокировка по всей маске. P.S. Скрипт блокировки доступа к сайту по IP. Это сработает? PHP: <?php $file = file('black_list.txt', FILE_IGNORE_NEW_LINES); $cr = array(); foreach($file as $value) { list($ip, $date) = explode('|', $value); $cr[] = $ip; } if(in_array($_SERVER['REMOTE_ADDR'],$cr) ){ echo "Blocked!"; exit(); } ?>
Нет конечно посмотрите что выведет $_SERVER['REMOTE_ADDR'] ... и все станет ясно ну и разделом для Профи - тут не пахнет... скорее для новичков
Вот допустим, но всё равно не работает... на хостинге. Может кто подсказать? PHP: <?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'].'black_list.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; // Прерываем цикл } } } } ?>