Например, я хотел бы заблокировать каждый IP из базы 89.95 (89.95 … ). У меня нет файлов .htaccess
на моем сервере, поэтому мне придется делать это с PHP.
if ($_SERVER['REMOTE_ADDR'] == "89.95.25.37") die();
Блокирует определенный IP-адрес. Как заблокировать целые блоки IP?
Большое спасибо.
Попробуйте strpos()
if(strpos($_SERVER['REMOTE_ADDR'], "89.95") === 0) { die(); }
Если вы заметили, оператор ===
убедится, что 89.95
находится в начале IP-адреса. Это означает, что вы можете обезопасить столько IP-адресов, сколько захотите, и оно будет блокировать независимо от того, какие цифры будут после него.
Например, все они будут заблокированы:
89,95 -> 89.95.12.34
, 89.95.1234.1
, 89.95.1.1
89,95,6 -> 89.95.65.34
, 89.95.61.1
, 89.95.6987
(некоторые из них не являются действительными IP-адресами, хотя)
Используйте ip2long()
для преобразования десятичного десятичного ip2long()
в реальный IP-адрес. Тогда вы можете легко делать диапазоны.
Просто сделайте ip2long()
и нижнем диапазонах, чтобы получить значение, а затем используйте их как константы в своем коде.
Если вы знакомы с маскировкой подсети, вы можете сделать это следующим образом:
// Deny 10.12.*.* $network = ip2long("10.12.0.0"); $mask = ip2long("255.255.0.0"); $ip = ip2long($_SERVER['REMOTE_ADDR']); if (($network & $mask) == ($ip & $mask)) { die("Unauthorized"); }
Или если вы знакомы с этим форматом 10.12.0.0/16
:
// Deny 10.12.*.* $network = ip2long("10.12.0.0"); $prefix = 16; $ip = ip2long($_SERVER['REMOTE_ADDR']); if ($network >> (32 - $prefix)) == ($ip >> (32 - $prefix)) { die("Unauthorized"); }
Вы можете превратить их в функции и иметь очень управляемый код, что упрощает добавление IP-адресов и настройку диапазонов.
Преобразуйте пунктирный квадрат в целое число:
$ip = sprintf('%u', ip2long($_SERVER['REMOTE_ADDR'])); // only allow 10.0.0.0 – 10.255.255.255 if (!($ip >= 167772160 && $ip <= 184549375)) { die('Forbidden.'); }
Сделайте подстроку 🙂 Например, для блокировки 89.95.25. * Вы создаете подстроку IP, отсекая последние два числа и сравнивая его с «89.95.25».
$user_ip = $_SERVER['REMOTE_ADDR']; // get user ip $denyIPs = array("111.111.111", "222.222.222", "333.333.333"); if (in_array ($user_ip, $denyIPs)) { // blocked ip } else { // not blocked }
Это всегда срабатывало для меня очень хорошо: это проверяет правильные серверные переменные и сравнивает их со списком известных IP-адресов .. и да, PHP действительно понимает подстановочные знаки, поэтому используйте * внутри IP-адреса, помогая блокировать диапазоны IP-адресов.
// The blacklisted ips. $denied_ips = array( '1.2.3.4', '2.3.*', ); // The function to get the visitor's IP. function getUserIP(){ //check ip from share internet if (!empty($_SERVER['HTTP_CLIENT_IP'])){ $ip=$_SERVER['HTTP_CLIENT_IP']; } //to check ip is pass from proxy elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip=$_SERVER['REMOTE_ADDR']; } return $ip; } //The user $visitorIp = getUserIP(); // Now let's search if this IP is blackliated $status = array_search($visitorIp, $denied_ips); // Let's check if $status has a true OR false value. if($status !== false){ echo '<div class="error">Your IP has been banned! Stop spamming us!</div>'; // header("Location: http://zombo.com"); // exit; }
В скоропортящейся прессе есть отличная статья: http://perishablepress.com/how-to-block-ip-addresses-with-php/
используя код возрождения, используйте это для поиска подстановочного поиска
// Now let's search if this IP is blackliated $status = false; foreach($denied_ips as $val) { if (strpos($val,'*') !== false) { if(strpos($visitorIp, array_shift(explode("*", $val))) === 0) { $status = true; break; } } else { if(strcmp($visitorIp, $val) === 0) { $status = true; break; } } }
$deny = array("111.111.111", "222.222.222", "333.333.333"); if (in_array($_SERVER['REMOTE_ADDR'], $deny)) { header("location:http://www.google.com/"); exit(); }