ユーザーがシステムにアクセスできるかどうかを判断するために、特定の 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 の 10 進数を計算します: 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 以下かを比較します。 。ただし、計算量が非常に大きく、値が 218 で始まる場合は問題ありません。データがオーバーフローしてエラーが発生します。
実際、IP が特定のネットワーク セグメントに属しているかどうかを比較する最良の方法は、IP とネットワーク セグメントを 32 ビット バイナリに変換し、ASP 自体のネットワーク部分が同じであるかどうかを比較することです。関数を実装する必要があるため、これは次のように手動で実装する必要があります。
'10進数を2進数の文字列に変換します
関数 dec2bin(octNumber)
vara=octNumber
する
dec2bin=cstr(vara mod 2) & dec2bin
ヴァラ=ヴァラ 2
vara=0 までループします
end function
'バイナリ文字列を 8 ビットにパディングします
ファンクションパッド(文字列)
Pad=right("00000000" & str,8)
end function
'IPアドレスかどうかを判定する
関数 isIp(ipad)
isIp=false
set oReg=新しい正規表現
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})"
oReg.test(ipadd) の場合、isIp=true
oReg=何も設定しない
end function
'UserIP は検出したい IP です
NetIP は、検出されるネットワーク セグメントまたは特定の IP です。ネットワーク セグメントを表すには、xxx.xxx.xxx.xxx/N を使用します。N はサブネット マスクの桁数を表します。
「注意してください、このプログラムはグローバルワンウェイのオリジナルプログラムですので、転載したい場合はソース情報を保管してください、ありがとうございます。」
'プログラミング: Global Wanwei、ドメイン名登録と仮想ホスティング サービスを専門とする
ウェブサイト: http://www.netInter.cn
'上記の情報は記事本文の不可欠な部分であるため、この記事を転載したい場合は、上記の情報を保持する必要があります
check_ip(UserIp,NetIP)
currentip=ユーザーIp
collection_ips=split(iplist,",") 'ネットワークをポイントごとに 4 つのセグメントに分割します
check_ip=false '関数の初期値、false は、IP がこのネットワーク セグメントにないことを想定します
NetIP=トリム(NetIP)
スラッシュPos=inStr(NetIP,"/")
iflashPos=0 then 'ネットワーク セグメントには / 記号が含まれておらず、単なる IP であるため、文字列を比較して同じかどうかを確認してください。
NetIP=currentip の場合
check_ip=true 'check_ip=true は IP が等しいことを意味します
終了関数
終了する場合
それ以外
netRang=mid(NetIP,slashPos+1) ' / の後の番号を取得
if isNumeric(netRang) then '/後ろに数字が続いていないため、形式が正しくありません
終了関数
終了する場合
netRang=cint(netRang) '文字を数字に変換します
netRang>31 の場合
終了関数 '/ の後の数字は 32 桁を超えることはできません
終了する場合
ipsets=split(currentip,".") 'ユーザー IP をポイントによって 4 つのセグメントに分割します
C_IP_BIN=pad(dec2bin(ipsets(0))) & Pad(dec2bin(ipsets(1))) & Pad(dec2bin(ipsets( 2) ))) & パッド(dec2bin(ipsets(3)))
'上記の行は、ユーザーの IP アドレスを、対応する 32 文字の長さのバイナリに手動で変換します。
ipsets=split(NetIP,".") '上記のプロセスに従って、ネットワーク セグメント IP を 32 文字長のバイナリに変換します
sPos=instr(ipsets(3),"/") '最後の形式は数字/数字である必要があります
sPos=0 の場合
終了関数
終了する場合
ipsets(3)=left(ipsets(3),sPos-1) '最後/前の番号を取得します
S_IP_BIN=pad(dec2bin(ipsets(0))) & パッド(dec2bin(ipsets(1))) & パッド(dec2bin(ipsets(2))) & パッド(dec2bin(ipsets(3)))
' 32 文字長のバイナリに変換します
if left(C_IP_BIN,netRang) = left(S_IP_BIN,netRang) then 'ネットワーク セグメントが同じかどうかを比較することで、ユーザーの IP が特定のネットワーク セグメントに属しているかどうかを判断できます。
check_ip=true
終了する場合
終了する場合
終了関数
の適用例:
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インチ)
Response.write "同じネットワークセグメント"
それ以外
Response.write "同じネットワークセグメントではありません"
終了する場合