用asp判斷某IP是否屬於某網段的另類演算法

2021-09-05 06:15:46 字數 2931 閱讀 7700

有時候我們需要判斷某乙個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\.\d\.\d\.\d)|(\d\.\d\.\d\.\d\/\d)"

if oreg.test(ipadd) then isip=true

set oreg=nothing

end function

'其中userip是我們要檢測的ip

'netip是要檢測的網段或某個ip,用***.***.***.***/n來表示網段,其中n表示子網掩碼位數

'程式設計:環球萬維,專業提供網域名稱註冊,虛擬主機服務

'**:[url]

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

判斷陣列是否存在某元素

查詢乙個元素是否在陣列中,一共有上面三種做法 in array 函式在陣列中搜尋給定的值。in array value,array,type type 可選。如果設定該引數為 true,則檢查搜尋的資料與陣列的值的型別是否相同。array key exists array key exists 函式...

Numpy判斷某維度是否相同

在語義分割 semantic segmentation 領域深度學習的label預處理工作中,要把3通道的label資料轉為單通道的mask作為訓練樣本。例如把一堆黑色和紅色的畫素,轉為全是0和1的單通道 mask。最normal的處理流程為 判斷畫素的顏色 根據顏色賦值對應的label。那麼在步驟...

如何檢測某IP埠是否開啟

1 如果你直接到控制面板的管理工具裡的服務項裡去找telnet的話,那是徒勞無功 的,因為預設根本就沒有這一服務。當然,你可以通過如下方式搞定。控制面 板 一 程式 一 開啟或關閉windows功能 在裡面你可以看到許多服務項,選 擇 telnet伺服器 和 telnet客戶端 確定即可。這樣你再回...