2009-10-02 90 views
1

我抓取用戶IP地址,然後我想確定該IP地址是否在可訪問範圍內。如何確定用戶IP地址是否在可訪問的範圍內?

我正在做的是,在我的PHP腳本中,我使用'ip2long'函數並將其與允許的IP地址範圍進行比較。

我知道這不是一個乾淨的方法來做到這一點...有沒有人有更好的想法做到這一點?

任何幫助表示讚賞。

感謝, 阿米特

回答

3

至少,你需要對已知私人或已知未使用的網絡模塊進行比較排名靠前的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。儘管如此,你仍然希望經常更新這個列表。

1

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); 
}