Terkadang kita perlu menentukan apakah alamat IP tertentu termasuk dalam segmen jaringan untuk menentukan apakah pengguna dapat mengakses sistem.
Misalnya, IP login pengguna adalah 218.6.7.7, dan program kita harus menentukan apakah dia termasuk dalam segmen jaringan 218.6.0.0/16 (di mana /16 adalah representasi subnet mask baru, setara dengan 255.255.0.0) .
Untuk mencapai fungsi seperti itu, algoritme yang populer saat ini adalah mengubah 218.6.0.0 dan 218.6.7.7 menjadi desimal berdasarkan 256 dan membandingkannya. Misalnya, hitung dulu desimal dari 218.6.0.0 dan 218.6.255.255: 218× 256×256. ×256+6×256×256=3657826304, 218×256×256×256+6×256×256+255×256×256+255=3657891839. Kemudian hitung desimal dari 218.6.7.7: 218×256×256×256+6×256×256+7×256+7=3657828103, dan terakhir bandingkan apakah 3657828103 lebih besar dari atau sama dengan 3657826304 dan lebih kecil dari atau sama dengan 3657891839 . Tapi yang jelas ada masalah. Jumlah perhitungannya sangat besar dan nilainya sangat besar. Jika alamat IP dimulai dengan 61, tidak apa-apa. Jika dimulai dengan 218, ini akan menyebabkan data meluap dan error.
Faktanya, cara terbaik untuk membandingkan apakah suatu IP termasuk dalam segmen jaringan tertentu adalah dengan mengubah IP dan segmen jaringan menjadi biner 32-bit, dan kemudian membandingkan apakah bagian jaringannya sama fungsinya, sehingga perlu diimplementasikan. Kami hanya dapat mengimplementasikannya secara manual, sebagai berikut:
'Konversi desimal ke string biner
fungsi dec2bin(Nomor Oktober)
vara=Nomor Oktober
Mengerjakan
dec2bin=cstr(vara mod 2) & dec2bin
vara=vara 2
ulangi sampai vara=0
fungsi akhir
'Mengisi string biner menjadi 8 bit
papan fungsi (str)
pad=kanan("00000000" & str,8)
fungsi akhir
'Tentukan apakah itu alamat IP
fungsi isIp(ipadd)
isIp=salah
atur oReg=RegExp baru
oReg.IgnoreCase=benar
oReg.global=benar
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})"
jika oReg.test(ipadd) maka isIp=true
atur oReg=tidak ada
fungsi akhir
'di mana UserIP adalah IP yang ingin kita deteksi
'NetIP adalah segmen jaringan atau IP tertentu yang akan dideteksi. Gunakan xxx.xxx.xxx.xxx/N untuk mewakili segmen jaringan, di mana N mewakili jumlah digit subnet mask.
'Catatan, program ini merupakan program asli Global Wanwei, jadi jika anda ingin mencetak ulang harap menyimpan informasi sumbernya, terima kasih.
'Pemrograman: Global Wanwei, yang berspesialisasi dalam pendaftaran nama domain dan layanan hosting virtual
'Situs web: http://www.netInter.cn
'Informasi di atas merupakan bagian integral dari teks artikel, jadi jika Anda ingin mencetak ulang artikel ini, Anda harus menyimpan informasi di atas
.
currentip=IpPengguna
collection_ips=split(iplist,",") 'Bagi jaringan menjadi 4 segmen berdasarkan poin
check_ip=false 'Nilai fungsi awal, false mengasumsikan bahwa IP tidak ada di segmen jaringan ini
NetIP=memangkas(NetIP)
garis miringPos=inStr(NetIP,"/")
jika garis miringPos=0 maka 'Segmen jaringan tidak mengandung simbol /, itu hanya IP, jadi bandingkan saja stringnya untuk melihat apakah keduanya sama.
jika NetIP=currentip maka
check_ip=true 'check_ip=true berarti IPnya sama
fungsi keluar
berakhir jika
kalau tidak
netRang=mid(NetIP,slashPos+1) 'Dapatkan nomor setelah /
jika bukan isNumeric(netRang) maka '/Tidak diikuti angka, formatnya salah
fungsi keluar
berakhir jika
netRang=cint(netRang) 'Ubah karakter menjadi angka
jika netRang>31 maka
Nomor setelah fungsi keluar '/ tidak boleh melebihi 32 digit
berakhir jika
ipsets=split(currentip,".") 'Bagi IP pengguna menjadi empat segmen dengan poin
C_IP_BIN=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets( 2) ))) & bantalan(dec2bin(ipsets(3)))
'Baris di atas adalah untuk secara manual mengubah alamat IP pengguna menjadi biner sepanjang 32 karakter yang sesuai
ipsets=split(NetIP,".") 'Ikuti proses di atas untuk mengubah IP segmen jaringan menjadi biner sepanjang 32 karakter
sPos=instr(ipsets(3),"/") 'Format terakhir harus berupa angka/digit
jika sPos=0 maka
fungsi keluar
berakhir jika
ipsets(3)=kiri(ipsets(3),sPos-1) 'Dapatkan nomor terakhir/sebelumnya
S_IP_BIN=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets(2))) & pad(des2bin(ipsets(3)))
'Ubah menjadi biner sepanjang 32 karakter
if left(C_IP_BIN,netRang) = left(S_IP_BIN,netRang) lalu 'Dengan membandingkan apakah segmen jaringan sama, Anda dapat menentukan apakah IP pengguna termasuk dalam segmen jaringan tertentu.
check_ip=benar
berakhir jika
berakhir jika
Contoh penerapan
fungsi akhir
:Untuk menentukan apakah 61.139.1.1 ada di segmen jaringan 61.139.0.0/16 (255.255.0.0), Anda hanya perlu menggunakan fungsi ini saja, seperti:
if check_ip("61.139.1.1","61.139 0,0/16") lalu
Response.tulis "segmen jaringan yang sama"
kalau tidak
Response.write "Bukan segmen jaringan yang sama"
berakhir jika