2012-01-12 10 views
3

にIPアドレスを比較してください。ユーザーから得たIPアドレスは常にIPv4と互換性があるので、私は推測しています。これをどう比較すればいいですか?は、私はIPv4のですが、そのうちのいくつかは、IPv6をしているほとんどがIPブロックのリストに、ユーザーのIPアドレスを比較するためにPHPを使用していたIPv6ブロック

これは私が今使っているものです:

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.2542001に属している:067c:006C ::/48または2001:1a98 ::/32または217.151.176.18/32または217.171.208.0/20

答えて

3

私はa library to do this sort of IP address comparisonを書きました。

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

return $block->encloses_address($ip); 

クラス階層は、Kohanaの透過拡張を有効にするために設計されているため、少し鈍いです。

私はIPv4アドレスを特別な事前IPv6アドレスに変換するコードを実装していないため、比較の前に少量のチェックを行う必要があります。 プルリクエストはもちろん歓迎している:)

+0

。 –

+0

ライセンスの制限、またはサーバーの権利のみ?いつでもクラスをダウンロードして、アプリに手動で含めることができます。 IIRCのIPv4のものは、そのクラスなしで正常に動作します。 – Lethargy

+0

サーバー。私はクラスをダウンロードしようとするかもしれない。 –

0

を私は194.144.247.2542001に属しているかどうかを確認する必要があります例として:067c:006C ::/48または2001:1a98 ::/32または217.151.176.18/32または 217.171.208.0/20。 IPv4アドレスは、IPv6の範囲に属することができますどのように

?同じ種類のアドレスはこの方法でしか比較できません。他のことは意味をなさない。素晴らしいですが、残念ながら、私はこのケースではPEAR Math_BigIntegerクラスをインストールすることはできません

+0

IPv6アドレスはIPv4と互換性があり、xxxx.xxxx.xxxx.xxxxとして返されます。 –

関連する問題