[PHP] IPv6 lookup in prefix functie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste allen,

Ik probeer een functie te schrijven waarmee ik kan bepalen of een bepaald IPv6 adres voorkomt in een IPv6 prefix. Met andere woorden: de functie moet mij uiteindelijk vertellen of bijvoorbeeld het adres 2001:0610:013B:: past in de prefix 2001:0610:013A::/48.
Ziehier de code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function isIPIn ($ip,$net,$mask) 
{
    
    $net = pack("H" . strlen($net), str_replace(":", "", $net));
    $ip = pack("H" . strlen($ip), str_replace(":", "", $ip));
    $binnet = str_pad ($net, 128, "0", "STR_PAD_LEFT");
    $firstpart = substr($binnet, 0, $mask);
    $binip = str_pad ($ip, 128, "0", "STR_PAD_LEFT");   
    $firstip = substr ($binip, 0, $mask);   
    return (strcmp ($firstpart, $firstip) == 0);
    
}


Een paar beginsels die ik gehanteerd heb:
1. Ik heb de code voor een gedeelte gebaseerd op een functie die hetzelfde doel heeft wat betreft 'ouderwetse' IPv4 adressen.
2. Ik houd me hier nog niet bezig met compressed IPv6 adressen, dus ik voer alleen volledige adressen in zoals 2001:0610:013A:0000:0000:0000:0000:0001.
3. Ik probeer eerst het hexadecimale adres om te zetten in een binair adres.
4. Daarna vul ik het aan tot 128 bits (toch?)
5. Vervolgens vergelijk ik aan de hand van de mask twee stukken van de twee adressen om te kijken of ze gelijk zijn (ervan uitgaande dat ik daarmee dus bepaal of het IPv6 adres past in de prefix).
6. Toepassingsvoorbeeld:
PHP:
1
2
3
4
5
$ip = "2000:0610:013A:0000:0000:0000:0000:0001";
$net = "2001:0610:013A:0000:0000:0000:0000:0000";
$mask = "48";

echo isIPIn ($ip, $net, $mask);

Dit retourneert 1 (true), dus volgens mij klopt mijn functie niet. Mijn IPv6 kennis is nog wat roestig, dus mocht iemand ideeen hierover hebben of misschien zelfs een oplossing (dare I ask...), dan zou ik dat erg op prijs stellen. Bedankt!