2009-10-02 8 views
1

Je saisis l'adresse IP de l'utilisateur, puis je veux déterminer si cette adresse IP est dans la plage accessible ou non. Ce que je fais est, dans mon script PHP, j'utilise la fonction 'ip2long' et la compare avec la plage autorisée d'adresse IP. Je sais que ce n'est pas une façon propre de le faire ... est-ce que quelqu'un a une meilleure idée de faire cela?Comment puis-je déterminer si l'adresse IP de l'utilisateur est dans une plage accessible ou non?

Toute aide appréciée.

Merci, Amit

Répondre

3

Au minimum, vous devez être comparer les bits supérieurs N contre les blocs réseau connus-privé ou connu inutilisé. Et le minimum de c'est le RFC 1918 private networks:

10/8 
172.16/12 
192.168/16 

(Cette notation signifie que si vous masquez les 8 bits supérieurs et obtenir « 10 », il est dans le premier bloc privé. 12 bits == 172,16 est le deuxième, etc.)

Il y a beaucoup plus de blocs que vous pouvez détecter. L'exemple le plus simple est 127/8, tous loopback addresses. Vous savez probablement sur 127.0.0.1, mais en fait toutes les adresses 127.x.y.z se réfèrent à l'interface de bouclage sur votre machine.

Un exemple plus obscur est 5/8, qui a été assigné mais jamais utilisé sur Internet large, donc il a été approprié par Hamachi. Cependant, vous voudrez faire attention à ce test si votre programme peut être exécuté sur une machine ayant accès au réseau Hamachi.

Un autre ensemble d'adresses que vous voudrez probablement ignorer est les différentes gammes multicast. Vous devriez seulement envoyer des paquets UDP à ces connexions, jamais des connexions TCP. Si vous voulez être vraiment agressif, vous pouvez vous tenir au courant des dernières affectations publiées par IANA, en ignorant les adresses IP des blocs qui n'ont pas encore été attribués. Cependant, vous voudriez garder cette liste fréquemment à jour.

1

PHP fait presque tout pour vous:

filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4| FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE); 

Ceci renvoie false si l'IP est dans une plage privée ou réservée, si la plage est accessible, il retournera l'adresse IP. Vous pouvez trouver quelque chose comme ceci pour toujours retourner un booléen:

function isAccessibleRangeIP($ip) 
{ 
    return (bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4| FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE); 
} 
Questions connexes