Nasıl kullanıcı IP adresinin erişilebilir aralığında veya olmadığını belirleyebilirsiniz?

2 Cevap php

Ben kullanıcı IP adresini kapma yaşıyorum, ve sonra o IP adresinin erişilebilir aralığında olup olmadığını belirlemek istiyorum.

Ben ne yapıyorum benim PHP komut dosyası i 'ip2long' işlevi kullanıyorum ve ip adresi izin verilen aralığın ile karşılaştırın, olduğunu.

Ben bu bunu yapmak için temiz bir yolu olmadığını biliyorum ... herkes bunu iyi bir fikrin var mı?

Herhangi bir yardım takdir.

Thanks, Amit

2 Cevap

En azından, bilinen-özel ya da bilinen-kullanılmayan ağ blokları karşı üst N bit karşılaştırmak gerekir. Ve bunun en az RFC 1918 private networks: olduğunu

10/8
172.16/12
192.168/16

(Bu yazım size en iyi 8 bit off maske ve "10" olsun, eğer ilk özel blokta demektir. 12 bit == 172.16, vb ikinci)

Algılayabilir verebilecek çok daha fazla blok vardır.

Kolay örnek tüm loopback addresses olan 127/8. Muhtemelen 127.0.0.1 hakkında biliyorum, ama aslında tüm 127.xyz adresleri makinenizde loopback arayüzüne bakın.

Daha karanlık bir örnek atanır ama asla geniş Internet üzerinde kullanılan 5/8,, bu yüzden Hamachi tarafından tahsis ediyor. Sen programı Hamachi ağa erişimi olan bir makine üzerinde çalıştırmak olabilir ki bir şans varsa, olsa da, bu test için dikkatli olmak isterim.

Büyük olasılıkla göz ardı etmek isteyeceksiniz adresleri başka bir set çeşitli multicast aralıkları vardır. Sen sadece hiç TCP bağlantıları, bu UDP paketleri asla gönderme yapılmalıdır.

Eğer gerçekten agresif almak istiyorsanız, henüz atanmış değil bloklar IP'lerin sayarak, IANA tarafından yayınlanan son atamaları güncel tutmak olabilir. Eğer olsa, sık sık güncellenen bu listeyi tutmak isterdim.

PHP sizin için hemen hemen her şeyi yapar:

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

IP bir özel veya ayrılmış aralığında ise bu aralık erişilebilir eğer IP dönersiniz, false dönecektir. Her zaman bir boolean dönmek için böyle bir şey gelebilir:

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