Ограничение на основе диапазонов IP - PullRequest
0 голосов
/ 31 мая 2011

Я строю админку.и я хочу заблокировать определенные диапазоны IP.Я тестирую это на моем локальном wamp-сервере, но я, кажется, не перенаправляю меня.

<?php
   if($_SERVER['REMOTE_ADDR'] == '127.0.0..*') 
      header("Location: http://google.com");
   else
      echo "Hai";
?>

Любой вклад приветствуется.

Ответы [ 3 ]

4 голосов
/ 31 мая 2011

Достаточно использовать сравнение строк

if (strncmp('127.0.0.', $_SERVER['REMOTE_ADDR'], 8) === 0)
  header("Location: http://google.com");
else
  echo "Hai";

Обновление: взято из коментариев начального ответа

Предположим, я хочу заблокировать любой IP-адрес из этого диапазона: 192.168.0.1-255. Каково было бы лучшее решение для этого? Спасибо.

Тогда просто сделайте такое же сравнение строк с этим блоком

if (strncmp('192.168.0.', $_SERVER['REMOTE_ADDR'], 10) === 0)
  header("Location: http://google.com");
else
  echo "Hai";

Если вы хотите проверить удаленный адрес для обоих блоков одновременно, вы, вероятно, объедините их в одно выражение. На этот раз нам нужен другой подход

if (in_array(substr($_SERVER['REMOTE_ADDR'], 0, strrpos($_SERVER['REMOTE_ADDR'], '.')), array('127.0.0', '192.168.0'))) {
  header("Location: http://google.com");
else
  echo "Hai";

substr() -часть принимает IP до последнего .. Мы можем просто попытаться найти эту строку в наборе (-> массива) IP-префиксов.

3 голосов
/ 31 мая 2011
$ip0 = ip2long("127.0.0.1");
$ip1 = ip2long("127.0.0.254");
$ip  = ip2long($_SERVER['REMOTE_ADDR']);

if ($ip0 <= $ip && $ip <= $ip1) {
    echo long2ip($ip) . " is inside  range " . long2ip($ip0) . "-" . long2ip($ip1);
}
else {
    echo long2ip($ip) . " is outside range " . long2ip($ip0) . "-" . long2ip($ip1);
}
0 голосов
/ 31 мая 2011

Это был бы лучший подход, используя регулярное выражение:

// returns true for IPs 127.0.0.0-255
if (preg_match("'^127[.]0[.]0[.][0-9]+'",$_SERVER['REMOTE_ADDR']))
{
    header("Location: http://google.com");
}
else
{
    echo "Hai";
}

РЕДАКТИРОВАТЬ: Хорошо, перенесите его на другой уровень, возможно, не самый эффективный, но проще в настройке:

$mask = "192.168.1.1-255";

$ip = explode(".",$_SERVER['REMOTE_ADDR']);
$in = 0;
foreach (explode(".",$mask) as $k => $v)
{
    if (preg_match("'^([0-9]+)-([0-9]+)$'",$v,$n))
    {
        if ($ip[$k] >= $n[1] && $ip[$k] <= $n[2]) $in++;
    }
    elseif (preg_match("'^[0-9]+$'",$v,$n))
    {
        if ($ip[$k] == $n[0]) $in++;
    }
}
if ($in == 4)
{
    header("Location: http://google.com");
}
else
{
    echo "Hai";
}
...