我抓取用戶IP地址,然後我想確定該IP地址是否在可訪問範圍內。如何確定用戶IP地址是否在可訪問的範圍內?
我正在做的是,在我的PHP腳本中,我使用'ip2long'函數並將其與允許的IP地址範圍進行比較。
我知道這不是一個乾淨的方法來做到這一點...有沒有人有更好的想法做到這一點?
任何幫助表示讚賞。
感謝, 阿米特
我抓取用戶IP地址,然後我想確定該IP地址是否在可訪問範圍內。如何確定用戶IP地址是否在可訪問的範圍內?
我正在做的是,在我的PHP腳本中,我使用'ip2long'函數並將其與允許的IP地址範圍進行比較。
我知道這不是一個乾淨的方法來做到這一點...有沒有人有更好的想法做到這一點?
任何幫助表示讚賞。
感謝, 阿米特
至少,你需要對已知私人或已知未使用的網絡模塊進行比較排名靠前的N位。並且,最小的是RFC 1918 private networks:
10/8
172.16/12
192.168/16
(此符號意味着如果你屏蔽掉了前8位,並獲得「10」,它在第一專用塊。12位== 172.16是第二,等等)
還有更多的塊可以檢測。
最簡單的例子是127/8,它們都是loopback addresses。您大概知道127.0.0.1,但實際上所有127.x.y.z地址都是指您計算機上的回送接口。
一個比較晦澀的例子是5/8,它被分配但從未在廣泛的互聯網上使用過,所以它已被撥入Hamachi。但是,如果您的程序可能在可以訪問Hamachi網絡的計算機上運行,那麼您會希望對此進行測試。
另一組您可能要忽略的地址是各種multicast範圍。你只應該發送UDP數據包給那些,從來沒有TCP連接。
如果您想要變得非常積極,您可以隨時關注由IANA發佈的最新作業,忽略尚未分配的塊的IP。儘管如此,你仍然希望經常更新這個列表。
PHP做幾乎一切都是爲了你:
filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4| FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
這將返回false,如果該IP是在私人或保留的範圍,如果範圍是可訪問的,它會返回IP。你可以拿出這樣的東西總是返回一個布爾值:
function isAccessibleRangeIP($ip)
{
return (bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4| FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
}