Vérifier si une adresse IP privée
J'aime vérifier si une adresse IP est un réseau privé. Il ne fonctionne pas.
Mon 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;
}
?>
L'autre:
<?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;
}
?>
Toute aide serait grandement appréciée, merci!
- voir mebsd.com/coding-snipits/check-private-ip-function-php.html
- Plages privées sont: 10.0.0.0/24, 172.16.0.0/20 et 192.168.0.0/16. Voir ma réponse ici, utilisez le bon de chevauchement méthodes d'essai pour la vérification.
- Que voulez-vous dire par " Ce n'est pas le travail ğ? Pouvez-vous nous donner un exemple d'une adresse qui n'est pas validé? Ou au moins expliquer ce que votre code est censé faire, ce qu'il ne l'est pas?
- Résultat:127.0.0.1 n'est pas une adresse privée. C'est juste???
- N'a pas besoin de PHP le
global $ip;
plus d'accès à cette variable?
Vous devez vous connecter pour publier un commentaire.
Voir http://mebsd.com/coding-snipits/check-private-ip-function-php.html
Vous pouvez aussi vérifier sur les espaces d'adressage privé ici
filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)
Je pense que cela devrait résoudre le problème.
filter_var utilisé avec les éléments suivants les règles de validation retourne false si l'adresse IP est un privé.
De vérifier les liens ci-dessus pour la documentation php
filter_var()
et valider les filtres pages du manuel PHP. c'est à dire php.net/manual/en/function.filter-var.php et php.net/manual/en/filter.filters.validate.phpFILTER_FLAG_IPV4
fonctionne aussi si vous souhaitez gérer à la fois IPv4 et IPv6123
est également de retourfalse
. 3v4l.org/AGW5N...mes 5 cents:
À mon humble avis, la question sous-jacente est "comment faire pour vérifier si une adresse IP appartient à un réseau?".
La réponse est simple binaire: Adresse_ip ET network_mask est ÉGAL à adresse_réseau.
Par exemple, l'adresse IP de 10.1.2.3 appartient à réseau 10.0.0.0 avec netmask 255.0.0.0? 10.1.2.3 & est 10.0.0.0 255.0.0.0, donc la réponse est: oui, il le fait.
Plus facile de le voir en binaire:
Juste besoin de vérifier que, pour les netwoks vous avez besoin (y compris ou non, de bouclage, de lien-local, etc. ):
Le point intéressant est la négation de la valeur retournée. La valeur retournée n'est pas vraiment signifie que l'adresse IP est un réseau privé, mais c'est la négation n'est vraiment signifie que l'adresse IP est une "adresse IP publique" (commune/normal l'adresse IP) comme la solution par user4880112 fait clair.
IPv6
Les mêmes œuvres pour IPv6. Le "réseau privé" adresses (officiellement "Unique-Local", RFC 4193 ) sont "fc00::/7". Donc, adresse_ip & 0xFE00.. === 0xFC00.. est "réseau privé"
L'adoption de l'mentionnées répondre à et y compris la mise à jour des informations de l'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
...nous pouvons faire un peu plus général de la fonction comme ceci:
Ce que je me pose maintenant est: une adresse IPv6 dans "IPv4 mappée Adresse, c'est un "spécial" adresse IPv6, même si c'était "normal" de l'adresse ip en IPv4. Devrions-nous considérer "usage privé" les réseaux dans ::ffff:0:0/96 qui correspondent IPv4 privées utilisent les réseaux?
MODIFIER pour expliquer le dernier commentaire:
Le réseau IPv6 ::ffff:0:0/96 cartes à une adresse IPv6 à chaque adresse IPv4. Ces adresses IPv6 sont dans un ensemble unique dans le registre IANA ("Spéciaux"), mais l'adresse IPv4 mappée sont dans toutes sortes de jeux en IPv4 (privé netwok, de bouclage, de diffusion, grand public... ) Un "adresse IPv4" est toujours un "spécial adresse IPv6". Si nous avons mis en place un réseau à l'aide de l'adresse IPv6 dans ::ffff:0:0/96 gamme qui correspondent IPv4 réseaux privés... Sommes-nous à l'aide d'une adresse de réseau privé?
À l'aide de inet_pton au lieu de ip2long, et y compris certains des plus obscures plages privées:
Fondamentalement @Mark Davidson réponse, mais avec peu de mathématiques.