用asp判斷某IP是否屬於某網段的另類演算法
有時候我們需要判斷某一個IP地址是否屬於一個網段,以決定該使用者能否訪問系統.
比如使用者登入的IP是218.6.7.7,而我們的程式必須判斷他是否屬於218.6.0.0/16這個網段(其中/16是新的子網掩碼的表示方式,相當於255.255.0.0).
要實現這樣的功能,現在流行的演算法是將218.6.0.0和218.6.7.7按256進位制換算成10進位制並進行比較得出,如先計算出218.6.0.0和218.6.255.255的十進位制:218×256×256×256+6×256×256=3657826304,218×256×256×256+6×256×256+255×256×256+255=3657891839。再計算出218.6.7.7的十進:218×256×256×256+6×256×256+7×256+7=3657828103,最後再比較3657828103是否大於等於3657826304和小於等於3657891839。但明顯有一個問題,計算量非常多,值非常大,如果IP地址是61開頭的還好,如果是218開頭的,這將會造成資料溢位而出錯。
其實比較IP是否屬於某一網段,最好的方式就是將IP與網段分別轉為32位二進位制,再比較他們的網路部分是否相同就可以了.asp本身不具備位執行功能,所以要實現這個只有我們手工實現,具體如下:
'將十進位制轉為二進位制字串
function dec2bin(octNumber)
vara=octNumber
do
dec2bin=cstr(vara mod 2) & dec2bin
vara=vara 2
loop until vara=0
end function
'將二進位制字串填充為8位
function pad(str)
pad=right("00000000" & str,8)
end function
'判斷是否是一個IP地址
function isIp(ipadd)
isIp=false
set oReg=new RegExp
oReg.IgnoreCase=true
oReg.global=true
oReg.Pattern="(d{1,4}.d{1,4}.d{1,4}.d{1,4})|(d{1,4}.d{1,4}.d{1,4}.d{1,4}/d{1,2})"
if oReg.test(ipadd) then isIp=true
set oReg=nothing
end function
'其中UserIP是我們要檢測的IP
'NetIP是要檢測的網段或某個IP,用xxx.xxx.xxx.xxx/N來表示網段,其中N表示子網掩碼位數
'注,該程式是環球萬維原創程式,所以如果您要轉載,請保留出處資訊,謝謝.
'程式設計:環球萬維,專業提供域名註冊,虛擬主機服務
'網址:
'以上資訊與文章正文是不可分割的一部分,所以如果您要轉載本文章,您必須保留以上資訊.
Function check_ip(UserIp,NetIP)
currentip=UserIp
collection_ips=split(iplist,",") '將網路按點分割成4段
check_ip=false '初始函式值,false假設IP不在這網段
NetIP=trim(NetIP)
slashPos=inStr(NetIP,"/")
if slashPos=0 then '網段沒含有/符號,他只是一個IP,所以比較比個字串是否相同就可以了
if NetIP=currentip then
check_ip=true 'check_ip=true表示IP相等
exit function
end if
else
netRang=mid(NetIP,slashPos+1) '得到/後邊的數字
if not isNumeric(netRang) then '/後邊不是數字,格式不正確
exit function
end if
netRang=cint(netRang) '將字元轉為數字
if netRang>31 then
exit function '/後的數字不能超過32位
end if
ipsets=split(currentip,".") '將使用者IP按點分成四段
C_IP_BIN=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets(2))) & pad(dec2bin(ipsets(3)))
'上邊這行是將使用者IP地址手工轉換為對應的一個32個字元長的二進位制
ipsets=split(NetIP,".") '按上邊的過程將網段IP同樣轉為32個字元長的二進位制
sPos=instr(ipsets(3),"/") '最後一點格式應該是 數字/數字
if sPos=0 then
exit function
end if
ipsets(3)=left(ipsets(3),sPos-1) '得到最後一段/前邊的數字
S_IP_BIN=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets(2))) & pad(dec2bin(ipsets(3)))
'將其轉換為32個字元長的二進位制
if left(C_IP_BIN,netRang) = left(S_IP_BIN,netRang) then '比較網段絡是否相同就可以判斷使用者IP否屬於某個網段了
check_ip=true
end if
end if
end function
應用舉例:
要判斷61.139.1.1是否在61.139.0.0/16 (255.255.0.0)這個網段
只需要簡單的使用這個函式就可以了,如:
if check_ip("61.139.1.1","61.139.0.0/16") then
Response.write "同一網段"
else
Response.write "不是同一網段"
end if
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10796304/viewspace-964870/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript 判斷物件中是否有某屬性JavaScript物件
- js判斷物件裡面是否有某個屬性JS物件
- sql 判斷 某列中是否包含 某種符號SQL符號
- Java 判斷JSONObject是否包含含有某個屬性值(key)JavaJSONObject
- 判斷是否遵守某個協議協議
- Javascript 如何判斷物件為空 {},以及是否包含某個屬性?JavaScript物件
- 程式碼段——C#判斷時間是否在某個範圍C#
- nginx判斷路徑是否含有某個引數做判斷Nginx
- Array · 判斷某元素是否在陣列中陣列
- mysql如何判斷是否存在某個欄位MySql
- sqlserver判斷欄位值是否存在某個字元SQLServer字元
- 用程式碼判斷當前系統是否支援某個版本的feature
- java判斷集合是否包含某個範圍內的值Java
- JS如何判斷一個陣列是否為空、是否含有某個值JS陣列
- Linux下批量ping某個網段ip的指令碼Linux指令碼
- Java stream判斷列表是否包含某幾個元素/重複元素Java
- 寫個方法判斷陣列物件中是否存在某個物件陣列物件
- mysql如何判斷不包含某個字元MySql字元
- windows 檢測某ip的埠是否可以訪問Windows
- C#判斷一個字串是否是數字或者含有某個數字C#字串
- 【ASP】判斷是否是手機訪問
- 如果精確判斷一個IP是否被佔用
- 判斷某個陣列在不在物件裡陣列物件
- 判斷無線網路卡是否支援5GHz頻段
- 在Linux中,如何使用shell指令碼判斷某個服務是否正在執行?Linux指令碼
- 瀏覽器是怎樣判斷元素是否和某個CSS選擇器匹配?瀏覽器CSS
- c#中判斷類是否繼承於泛型基類C#繼承泛型
- mac的cpu某段時間佔用很高Mac
- 直播平臺製作,JS判斷某個時間戳是否為當天時間JS時間戳
- ASP.NET判斷是否為手機登入ASP.NET
- ASP.NET CORE中判斷是否移動端開啟網頁ASP.NET網頁
- 判斷網路是否連線
- 判斷協議是否出網協議
- 不靠腫瘤本身就能判斷是否得癌症?AI「另闢蹊徑」診斷肺癌!AI
- go-carbon 1.3.3 版本釋出,新增獲取星座方法和判斷是否是某個星座方法Go
- 判斷ABAP程式碼是否處於update模式下執行的工具類模式
- web前端入門到實戰:原生js判斷某個元素是否有指定的class名的幾種方法Web前端JS
- 當前時間是否大於某個時刻
- 如何判斷某經緯度是否在地圖不規則區域內(Objective-C 實現)地圖Object