Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Блокировка по IP


Автор: larios 23.10.2007, 20:38
Подскажите как можно организовать пересылку на другой адрес по IP-адресу, если мне надо переадресовать только определенную группу IP, например: "192.12.*.*".
Код

$ip=getenv("REMOTE_ADDR");
if ($ip=="80.254.1.1") {header("Location:http://www.mail.ru");}
if ($ip=="80.254.1.2") {header("Location:http://www.mail.ru");}
 и т.д.
Так писать, не есть хорошо.
Есть какие-то решенния этой проблемы.
Для меня это пока тяжело. Маловато знаний.

Автор: Glip 23.10.2007, 20:47
перевести ip в int, сделать & с опятьже переведёной в int маской 255.255.0.0
и сравнить с переведёным же в int 192.12.0.0

это так с ходу.

Автор: webevt 23.10.2007, 21:04
Ээээ...

Код

if ( preg_match ( "/80\\.254\\.\d+\\.\d+/", $ip ) ) header ( "Location:http://www.mail.ru" );

Так?

Автор: PARROT 23.10.2007, 21:04
.htaccess
Код

Order allow,deny
Allow from all
Deny from 85.249.41.120

Автор: flashaa 24.10.2007, 10:46
Цитата(Glip @  23.10.2007,  20:47 Найти цитируемый пост)
перевести ip в int, сделать & с опятьже переведёной в int маской 255.255.0.0
и сравнить с переведёным же в int 192.12.0.0

Меня порадовала идея.

Но имхо самое простое решение: 
Код

if (strpost($ip, '192.12.' ) === 0) {

    // Айпи начинается с 192.12.....

}


Автор: клоп 24.10.2007, 10:55
Как вариант можно наверное так сделать, если группа IP не велика:

Код

if (getenv("HTTP_CLIENT_IP")) $ip = getenv("HTTP_CLIENT_IP");
        else if(getenv("HTTP_X_FORWARDED_FOR")) $ip = getenv("HTTP_X_FORWARDED_FOR");
        else if(getenv("REMOTE_ADDR")) $ip = getenv("REMOTE_ADDR");
        else $ip = "unknown";
$data_array=@file(".htaip");
$check_ip = FALSE;
$sum=count($data_array);
for($i=0;$i<$sum;$i++)
        {
            $parse_data=explode("|",$data_array[$i]);
            $data_array[$i]=$parse_data[0];
            if($data_array[$i] === $ip){
            $check_ip = TRUE; break;
            }
        }
if($check_ip !== TRUE) {header("location: http://www-link/index.html"); exit;}


Структура .htaip

IP|описание 
IP|описание 

Все кто не прописан в .htaip перейдут на http://www-link/index.html

Автор: Pokoinik 24.10.2007, 11:49
а почему бы не создать таблицу в бд, и потом делать выборку

Автор: Glip 24.10.2007, 12:34
работа с ip в виде a.b.c.d проста до тех пор пока у вас маски кратные 8 битам /8 /16 /24 (255.0.0.0, 255.255.0.0, 255.255.255.0)
если надо будет например с маской 12 - 172.16.0.0 - 172.31.255.254 то решения в виде a.b.c.d будут несколько сложнее.

Цитата(flashaa @  24.10.2007,  10:46 Найти цитируемый пост)
Но имхо самое простое решение: 

да ваше проще, моё немного универсальнее

Автор: larios 24.10.2007, 20:25
Код

<?
$ip=getenv("REMOTE_ADDR");
for ($a=1;$a<=254;$a++)
{
    for ($i=1;$i<=254;$i++)
    {
        if ($ip=="80.254.".$a.".".$i) 
        {
                header("Location:http://www.mail.ru");
        }
    }
}
?>

Так наверное громоздко, но я пока не дошел до Вашего уровня.
Есть ли здесь глобальные ошибки?

Автор: Glip 24.10.2007, 22:48
адреса 80.254.0.* 80.254.255.* не будут редиректится

ну и для адреса 80.254.254.254 будет работать дольше чем все вышеприведёные примеры

Автор: sTa1kEr 24.10.2007, 23:10
Вариант Glip не только универсальный, но и наиболее правильный с точки зрения стиля и более быстрый по производительности. 

larios, пример
Код

$ip = ip2long(getenv("REMOTE_ADDR"));
$mask = ip2long("255.255.0.0");
$sub = ip2long("192.12.0.0");

if ($ip & $mask == $sub) 
{
   header("Location:http://www.mail.ru");
}


Автор: larios 25.10.2007, 11:03
sTa1kEr, 
Код

$ip = ip2long(getenv("REMOTE_ADDR"));
$mask = ip2long("255.255.0.0");
$sub = ip2long("192.12.0.0");

if ($ip & $mask == $sub) 
{
   header("Location:http://www.mail.ru");
}


Код почему то не работает.

Автор: sTa1kEr 25.10.2007, 12:39
larios, оператор == имеет большеий пероритет... Не подумав написал, правильно будет так
Код

$ip = ip2long(getenv("REMOTE_ADDR"));
$mask = ip2long("255.255.0.0");
$sub = ip2long("192.12.0.0");
if (($ip & $mask) == $sub) 
{
   header("Location:http://www.mail.ru");
}

Автор: larios 25.10.2007, 12:54
Спасибо большое.
Все отлично работает.
Какие же вы все головастые, аж завидки берут.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)