Сравнить IP-адрес с блоком IPv6 - PullRequest
3 голосов
/ 12 января 2012

Я использую PHP для сравнения IP-адреса пользователя со списком блоков IP, большинство из которых - IPv4, но некоторые из них - IPv6.IP-адрес, который я получаю от пользователя, всегда совместим с IPv4, или я так полагаю.Как мне сравнить это?

Это то, что я сейчас использую:

function ip_check($ip, $cidr) {
  list($net, $mask) = split("/", $cidr);
  $ip_address = decbin(ip2long($ip));
  $ip_net = decbin(ip2long($net));
  if (substr($ip_net, 0, $mask) == substr($ip_address, 0, $mask)) {
    return TRUE;
  }
  return FALSE;
}

Редактировать: В качестве примера мне нужно посмотреть, если 194.144.247.254 принадлежит 2001: 067c: 006c :: / 48 или 2001: 1a98 :: / 32 или 217.151.176.18 / 32 или 217.171.208,0 / 20 .

Ответы [ 2 ]

3 голосов
/ 12 января 2012

Я написал библиотеку для такого сравнения IP-адресов .

$ip = IP_Address::factory($ip);
$block = IP_Network_Address::factory($cidr);

return $block->encloses_address($ip);

Иерархия классов немного туповата, потому что она предназначена для включения прозрачного расширения Коханы.

Я не реализовал код для преобразования адреса IPv4 в специальный префиксированный адрес IPv6, поэтому перед сравнением может потребоваться небольшая проверка.Запросы на тягу, конечно, приветствуются:)

0 голосов
/ 12 января 2012

В качестве примера мне нужно посмотреть, принадлежит ли 194.144.247.254 2001: 067c: 006c :: / 48 или 2001: 1a98 :: / 32 или 217.151.176.18 / 32 или 217.171.208.0 / 20 .

Как адрес IPv4 может принадлежать диапазону IPv6? Таким образом, вы можете сравнивать только одни и те же адреса. Другое дело не имеет смысла.

...