Prüfen Sie, ob eine IP-Adresse ist privat
Ich mag, um zu überprüfen, ob eine IP-Adresse in einem privaten Netzwerk. Es funktioniert nicht.
Mein code:
<?php
$ip = $_SERVER['REMOTE_ADDR'];
function _isPrivate($ip)
{
$i = explode('.', $ip);
if ($i[0] == 10) {
return true;
} else if ($i[0] == 172 && $i[1] > 15 && $i[1] < 32) {
return true;
} else if ($i[0] == 192 && $i[1] == 168) {
return true;
}
return false;
}
?>
Dem anderen:
<?php
$ip = $_SERVER['REMOTE_ADDR'];
function _isPrivate($ip)
{
$ip = ip2long($ip);
$net_a = ip2long('10.255.255.255') >> 24;
$net_b = ip2long('172.31.255.255') >> 20;
$net_c = ip2long('192.168.255.255') >> 16;
return $ip >> 24 === $net_a || $ip >> 20 === $net_b || $ip >> 16 === $net_c;
}
?>
Jede Hilfe wäre sehr geschätzt, danke!
InformationsquelleAutor der Frage Ruth | 2012-12-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen http://mebsd.com/coding-snipits/check-private-ip-function-php.html
Vielleicht wollen Sie auch heraus zu überprüfen, über die privaten Adressräume hier
InformationsquelleAutor der Antwort Mark Davidson
Ich denke, das sollte das problem lösen.
filter_var verwendet die folgenden Validierungsregeln wird false zurückgeben, wenn die IP-Adresse ist eine private.
Überprüfen Sie die links oben für die php-Dokumentation
InformationsquelleAutor der Antwort Dmitri Pavlutin
...meine 5 Cent:
IMHO die zugrunde liegende Frage ist nur "wie um zu überprüfen, ob eine IP-Adresse gehört zu einem Netzwerk?".
Die Antwort ist einfach Binär: IP-Adresse UND network_mask GLEICH network_address.
Spielt zum Beispiel IP-Adresse 10.1.2.3 gehört zum Netzwerk 10.0.0.0 mit der Netzmaske 255.0.0.0? 10.1.2.3 & 255.0.0.0 10.0.0.0 ist, die Antwort ist also: ja, es funktioniert.
Leichter zu sehen, es in Binär:
Nur auf die überprüfen müssen, dass für die netwoks, die Sie benötigen (inklusive oder nicht loopback link-local, etc. ):
Interessant ist die negation der zurückgegebene Wert. Der zurückgegebene Wert nicht wirklich bedeutet, dass die angegebene IP in einem privaten Netzwerk, aber es ist negation nicht wirklich bedeutet, dass die angegebene IP ist eine "öffentliche IP-Adresse" (eine gebräuchliche/normale IP-Adresse) als die Lösung von user4880112 deutlich macht.
IPv6
Das gleiche funktioniert auch für IPv6. Die "private network" - Adressen (formal "Unique-Local", RFC 4193 ) "fc00::/7". So, IP-Adresse & 0xFE00.. === 0xFC00.. ist "privates Netzwerk"
Annahme der erwähnten Antwort und einschließlich up-to-date Informationen von der IANA...
http://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml
http://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
...wir können ein bisschen mehr Allgemeine Funktion wie diese:
Was ich Frage ist: eine IPv6-Adresse-IPv4-mapped-Address" ist eine "spezielle" Adresse in IPv6-selbst wenn es eine "normale" ip-Adresse in IPv4. Sollten wir eine "private Nutzung" der Subnetze in ::ffff:0:0/96 entsprechen IPv4 private Netzwerke?
BEARBEITEN, zu erklären, die letzten coment:
Dem IPv6-Netzwerk ::ffff:0:0/96 Karten zu einer IPv6-Adresse jeder IPv4-Adresse. Diese IPv6-Adresse in einem einzigen Satz in der IANA registry ("Special-Purpose"), sondern die zugeordneten IPv4-Adressen sind in allen Arten von sets bei IPv4 (private netwok, loopback -, broadcast -,... ) Eine "gemeinsame IPv4-Adresse" ist immer eine "spezielle IPv6-Adresse". Wenn wir ein Netzwerk einrichten Verwendung der IPv6-Adresse ::ffff:0:0/96 Bereich entsprechen IPv4 private Netzwerke... Sind wir mit einem eigenen Netzwerk-Adresse?
InformationsquelleAutor der Antwort miguel-svq
Mit inet_pton statt ip2long, und darunter auch einige der eher obskuren, privaten Bereichen:
InformationsquelleAutor der Antwort
Grundsätzlich @Mark Davidson Antwort, aber mit etwas Mathematik.
InformationsquelleAutor der Antwort Jason Stewart