2016-04-05 7 views
0

Es gibt viele Posts hier und anderswo über how to handle IP4 and IP6 Adressen in PHP.Kann ich IP4/6-Adressen in PHP ohne String-Hacking auf IP6 normalisieren?

Ich möchte Code schreiben, der alle IP-Adressen, unabhängig von ihrer Darstellung, auf IP6-Format normalisiert.

Ich kann das tun, indem Sie verschiedene Ratschläge zusammenfügen und einige String-Hacking tun, aber hat Best Practice von diesem verschoben?

Gibt es eingebaute Funktionen in modernen PHP, die dies in allen Fällen richtig machen, ohne irgendeine bedingte Logik in meinem Anwendungscode?

+0

http://stackoverflow.com/questions/14445582/change-ipv4-to-ipv6-string – ceejayoz

+1

** NICHT ** ein Duplikat. * ahem *: "Es gibt viele Posts hier und anderswo ..." sah das, wollte wissen "hat sich die Best Practice weiter entwickelt?" – spraff

+0

@ spraff Das hält es nicht davon ab, ein Duplikat zu sein. – ceejayoz

Antwort

2

Nein, das ist ohne bedingte Logik nicht möglich. Auf der anderen Seite ist der notwendige Code nicht sehr schwierig:

function normalise_ip($address, $force_ipv6=false) { 
    # Parse textual representation 
    $binary = inet_pton($address); 
    if ($binary === false) { 
     return false; 
    } 

    # Convert back to a normalised string 
    $normalised = inet_ntop($binary); 

    # Add IPv4-Mapped IPv6 Address prefix if requested 
    if ($force_ipv6 && strlen($binary) == 4) { 
     $normalised = '::ffff:' . $normalised; 
    } 

    return $normalised; 
} 

Sie es wie folgt testen:

$addresses = array(
    '192.000.002.001', 
    '2001:0db8:0000:0000:0000:0000:0000:0001', 
); 

foreach ($addresses as $original) { 
    $normalised = normalise_ip($original); 
    $normalised_ipv6 = normalise_ip($original, true); 

    echo "Original: $original; "; 
    echo "Normalised: $normalised; "; 
    echo "As IPv6: $normalised_ipv6\n"; 
} 

Wenn Sie das Ergebnis zu IPv6 zwingen Sie erhalten IPv4-Mapped IPv6-Adressen statt von IPv4-Adressen.

+0

'inet_pton(): Unbekannte Adresse 192.000.002.001' – spraff

+0

@spraff Versuchen Sie stattdessen' 192.0.2.1'. – ceejayoz

+0

Komisch, das ist eine absolut gültige Schreibweise und es funktioniert auf meinem System. Anscheinend sind einige inet_pton Implementierungen kaputt :( –