проверка принадлежности ip к сети

soullibra

Новичок
проверка принадлежности ip к сети

// $ip
// $ip_from ~ $ip_to
if (ip2long($ip)>=ip2long($ip_from) && ip2long($ip)<=ip2long(ip_to)) {
echo "Yes";
} else {
echo "No";
}

Правильно ли будет работать такой скрипт?
Я просто не очень понял как преобразовывает ip2long.
 

whirlwind

TDD infected, paranoid
Для определения принадлежности IP-адреса к подсети нужно знать маску сети. Дальше булева алгебра:

1. инвертировать маску
2. or IP
3. xor IP
4. сравнить адрес подсети с результатом

перед этими операциями адрес сети, компа и маску нужно привести к 32 разрядам через ip2long
 

Quessir

Новичок
Почему то не работает такая вот функция. Взял с php.net. Там что-то говорилось про баг php, у меня x86_64. Но я так и ничего не нашел. php 5.2.5.


function matchCIDR($addr, $cidr) {

$output = false;

if ( is_array($cidr) ) {

foreach ( $cidr as $cidrlet ) {
if ( matchCIDR( $addr, $cidrlet) ) {
$output = true;
}
}
} else {

list($ip, $mask) = explode('/', $cidr);
$mask = 0xffffffff << (32 - $mask);
$output = ((ip2long($addr) & $mask) == (ip2long($ip) & $mask));
}

return $output;
}

if ( !matchCIDR($_SERVER['REMOTE_ADDR'], array('212.19.128.0/19', '212.154.128.0/17', '82.200.128.0/17', '88.204.128.0/17', '89.218.0.0/16', '92.46.0.0/15')) ) {
echo 'off!';
exit;
}

Что не так?
 

fixxxer

К.О.
Партнер клуба
на 32 битной архитектуре ff которые оператором << сдвигаются за пределы 32 bit int просто теряются, на 64 же понятное дело остаются
как самый простой вариант допиши после $mask &= 0x00000000ffffffff
 
Сверху