[請益] 如何判斷IP是否被包含在某個範圍?

作者: pttzoo (別放棄希望 ^^)   2015-05-10 21:27:43
請問一下
如果要判斷使用者的IP來源
是否被包含在某個IP網段當中(會有很多組)
如果不用拆字串的方式去比對ip的數字
有沒有比較快的方式
假設 A的IP範圍 是1.1.1.0 ~ 1.1.1.255
B的IP範圍 是1.1.0.0 ~ 1.1.255.255
C的IP範圍 是......
D的IP範圍 是......
.
.
.
我希望判斷使用者的IP是否被包含在A和B當中?
作者: MOONRAKER (㊣牛鶴鰻毛人)   2015-05-10 22:41:00
1: 通通轉成32-bit unsigned然後比較字串Sorry, 轉成32-bit unsigned然後比較數字2: 每一段補0成010.010.032.084這樣然後比較字串1比較快,但php版本如果限於32-bit整數運算必須用bc或者用SQL做能在SQL做完應該是最好的
作者: et282523 (不屈鬥志)   2015-05-11 23:57:00
另一種作法是使用子網域遮罩的作法,像 A 的 IP 範圍可改為網路位址 1.1.1.0, 子網域遮罩 255.255.255.0那假設你的 IP 是 1.1.1.123。計算方式為先將網路位址用ip2long 轉成數字,子網路遮罩也轉成數字, 然後做 & 運算,假設得到的值為 X, 再將你的 IP 也 ip2long 跟子網域遮罩的數字一樣做 & 運算,假設得到的數字為 Y只要 X == Y 就表示 IP 在你指定的範圍之內子網域的算法請參考https://support.microsoft.com/zh-tw/kb/164015/zh-tw補充:B 的範圍可轉成網路位址 1.1.0.0, 子網路遮罩255.255.0.0不過如果你的 IP 範圍很奇怪,無法用子網路遮罩來表示那可能就會不適用了!
作者: MOONRAKER (㊣牛鶴鰻毛人)   2015-05-12 04:18:00
對喔還有ip2long()好用
作者: et282523 (不屈鬥志)   2015-05-12 11:31:00
哈,可是如果 IP 範圍很奇怪就不適用了!不過只要是連續的區間,還是可以都轉成ip2long再比大小

Links booklink

Contact Us: admin [ a t ] ucptt.com