Ограничение доступа по IP диапазону на php

G-and-Y
На сайте с 29.06.2013
Offline
156
3633

Дночи, нужно ограничить доступ к странице по диапазону ип.

Нашел такое, но нельзя вставить диапазон 213.85.81.0/255, читал еще как то можно через ip2long но так толком ничего и не нашел, подскажите короче кто шарит.

<?php
$allowed = array(
'127.0.0.1',
'213.85.81.36',
'91.207.245.24'
);
if(!in_array($_SERVER['REMOTE_ADDR'], $allowed)) {
echo('Извини, тебе сюда нельзя');
exit;
}
// ...
echo('Спрятанное содержимое');
?>
Абузо-устойчивые впс в Нидерландах от 5$/мес (https://cp.inferno.name/aff.php?aff=2991)
siv1987
На сайте с 02.04.2009
Offline
427
#1
R
На сайте с 20.02.2015
Offline
59
#2


<?php
$ip = ip2long("127.0.0.1");
$block_begin = ip2long("127.0.0.0");
$block_end = ip2long("127.0.0.255");
if ($ip >= $block_begin && $ip <= $block_end)
echo("BLOCKED");
else
echo("SUCCESS");
?>
TF-Studio
На сайте с 17.08.2010
Offline
334
#3
Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
G-and-Y
На сайте с 29.06.2013
Offline
156
#4

Скинули, мож кому пригодицо

Подправил, теперь работает. Только одно но - диапазон айпишников проверяет по последней маске, т.е. 127.0.0.1/5 - он проверит все айпи от 127.0.0.1 до 127.0.0.5, поэтому если необходимый диапазон лежит в последних 2-х масках - 127.0.0.1-127.0.2.55 надо будет вбивать в массив:
127.0.0.1/255,
127.0.1.1/255,
127.0.2.1/55
В будущем можно будет доработать.
Код:
<?php
//массив айпишников, можно сделать подтягивание из файла, чтоб руками тут не править постоянно
$ip_array = array(
'127.0.0.0/16',
'192.168.0.1/58',
);

//текущий ИП-адрес посетителя
$cur_ip_adrr = $_SERVER['REMOTE_ADDR'];

$flag = false;

// функция проверки айпишников
function testIP($ip, $cidr){
list($net, $mask) = explode('/', $cidr);
list($a1, $a2, $a3, $a4) = explode('.', $net);
for($i = $a4; $i <= $mask; $i++){
if ($ip == ($a1.'.'.$a2.'.'.$a3.'.'.$i))
return true;
}
}

//проверяем текущий айпишник со списком
foreach($ip_array as $cur_cidr)
{
if(testIP($cur_ip_adrr, $cur_cidr)) $flag = true;
}

if ($flag == false)
{
echo "not so fast! "; // пускать нельзя, сюда пишем переадресацию
}
else
{
echo "all right!"; // всё ОК, отрисовываем код реги
}
?>
G-and-Y
На сайте с 29.06.2013
Offline
156
#5

Еще доработан

<?php
//массив айпишников
$ip_array = array(
'31.135.208.0/21',
'37.110.208.0/21'
);

//текущий ИП-адрес посетителя
$cur_ip_adrr = $_SERVER['REMOTE_ADDR'];

$flag = false;

// функция проверки айпишников

function IP_match($addr, $cidrs)
{
if(!is_array($cidrs)) $cidrs = array($cidrs);
foreach($cidrs as $cidr)
{
if (strpos($cidr, "/")) // Для записей типа 82.208.77.243/32
{
list($ip, $mask) = explode("/", $cidr, 2);
if (strpos(".", $mask)) $mask = 0xffffffff & ip2long($mask);
else $mask = 0xffffffff << 32 - (int)$mask;
if((ip2long($addr) & $mask) == (ip2long($ip) & $mask)) return true;
}
else if (strpos($cidr, "-")) // Для записей типа 82.208.77.243-85.95.168.249
{
list($ip_1, $ip_2) = explode("-", $cidr, 2);
if (((ip2long($ip_2) > ip2long($ip_1)) && (((ip2long($addr) - ip2long($ip_1)) >= 0) && (( ip2long($ip_2) - ip2long($addr)) >= 0))) || ((ip2long($ip_2) < ip2long($ip_1)) && (((ip2long($addr) - ip2long($ip_1)) <= 0) && ((ip2long($ip_2) - ip2long($addr)) <= 0))) || ((ip2long($ip_1) == ip2long($ip_2)) && (ip2long($ip_1) == ip2long($addr)))) return true;
}
else if ($addr === $cidr) return true; // Для одиночных IP
}
return false;
}

//проверяем текущий айпишник со списком
foreach($ip_array as $cur_cidr)
{
if(IP_match($cur_ip_adrr, $cur_cidr)) $flag = true;
}

if ($flag == false)
{
echo "Not so fast! You are not from! Your ip: ".$_SERVER['REMOTE_ADDR']; // пускать нельзя, сюда пишем переадресацию
}
else
{
echo "All right! You are from! Your ip: ".$_SERVER['REMOTE_ADDR']; // всё ОК, отрисовываем код реги
}
?>

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий