บางครั้งเราจำเป็นต้องตรวจสอบว่าที่อยู่ 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 แล้วเปรียบเทียบกัน ตัวอย่างเช่น ขั้นแรกให้คำนวณทศนิยมของ 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 เองไม่มีการดำเนินการบิต ดังนั้นจึงจำเป็นต้องดำเนินการ เราสามารถทำได้ด้วยตนเองเท่านั้น ดังนี้:
'แปลงทศนิยมเป็นสตริงไบนารี
ฟังก์ชั่น dec2bin (octNumber)
vara=octNumber
ทำ
dec2bin=cstr(vara mod 2) & dec2bin
วารา=วารา 2
วนซ้ำจนกระทั่ง vara=0
ฟังก์ชันสิ้นสุด
'การเติมสตริงไบนารี่เป็น 8 บิต
แผ่นฟังก์ชัน (str)
แผ่น = ขวา ("00000000" & str,8)
ฟังก์ชั่นสิ้นสุด
'ตรวจสอบว่าเป็นที่อยู่ IP หรือไม่
ฟังก์ชั่น isIp (ipad)
isIp=เท็จ
ตั้งค่า oReg=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})"
ถ้า oReg.test(ipadd) แล้ว isIp=true
ตั้งค่า oReg=nothing
ฟังก์ชั่นสิ้นสุด
'โดยที่ UserIP คือ IP ที่เราต้องการตรวจจับ
'NetIP คือส่วนของเครือข่ายหรือ IP ที่แน่นอนที่จะตรวจพบ ใช้ xxx.xxx.xxx.xxx/N เพื่อแสดงส่วนของเครือข่าย โดยที่ N แทนจำนวนหลักของซับเน็ตมาสก์
'หมายเหตุ โปรแกรมนี้เป็นโปรแกรมต้นฉบับของ Global Wanwei ดังนั้นหากคุณต้องการพิมพ์ซ้ำ โปรดเก็บข้อมูลต้นฉบับไว้ ขอบคุณ'
'การเขียนโปรแกรม: Global Wanwei เชี่ยวชาญในการจดทะเบียนชื่อโดเมนและบริการโฮสติ้งเสมือน
'เว็บไซต์: http://www.netInter.cn
'ข้อมูลข้างต้นเป็นส่วนสำคัญของข้อความบทความ ดังนั้นหากคุณต้องการพิมพ์บทความนี้ซ้ำ คุณต้องเก็บข้อมูลข้างต้น
ไว้
currentip=UserIp
collection_ips=split(iplist,",") 'แบ่งเครือข่ายออกเป็น 4 ส่วนตามจุด
check_ip=false 'ค่าฟังก์ชันเริ่มต้น false ถือว่า IP ไม่ได้อยู่ในส่วนของเครือข่ายนี้
NetIP=ตัดแต่ง(NetIP)
slashPos=inStr(NetIP,"/")
ถ้า slashPos=0 ดังนั้น 'ส่วนเครือข่ายไม่มีสัญลักษณ์ / มันเป็นเพียง IP ดังนั้นให้เปรียบเทียบสตริงเพื่อดูว่าเหมือนกันหรือไม่
ถ้า NetIP=currentip แล้ว
check_ip=true 'check_ip=true หมายความว่า IP เท่ากัน
ฟังก์ชั่นทางออก
สิ้นสุดถ้า
อื่น
netRang=mid(NetIP,slashPos+1) 'รับหมายเลขหลัง /
ถ้าไม่ใช่ isNumeric(netRang) ดังนั้น '/ไม่ได้ตามด้วยตัวเลข แสดงว่ารูปแบบไม่ถูกต้อง
ฟังก์ชั่นทางออก
สิ้นสุดถ้า
netRang=cint(netRang) 'แปลงอักขระเป็นตัวเลข
ถ้า netRang>31 แล้ว
ตัวเลขหลังฟังก์ชัน exit '/ ไม่เกิน 32 หลัก
สิ้นสุดถ้า
ipsets=split(currentip,".") 'แบ่ง IP ผู้ใช้ออกเป็นสี่ส่วนด้วยคะแนน
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=แพด(dec2bin(ipsets(0))) & แพด(dec2bin(ipsets(1))) & แพด(dec2bin(ipsets(2))) & แพด(dec2bin(ipsets(3)))
'แปลงเป็นไบนารี่ยาว 32 อักขระ
ถ้า left(C_IP_BIN,netRang) = left(S_IP_BIN,netRang) จากนั้น 'โดยการเปรียบเทียบว่าส่วนเครือข่ายเหมือนกันหรือไม่ คุณสามารถระบุได้ว่า 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 "ไม่ใช่ส่วนเครือข่ายเดียวกัน"
สิ้นสุดถ้า