Manchmal müssen wir feststellen, ob eine bestimmte IP-Adresse zu einem Netzwerksegment gehört, um festzustellen, ob der Benutzer auf das System zugreifen kann.
Die angemeldete IP des Benutzers lautet beispielsweise 218.6.7.7 und unser Programm muss feststellen, ob er zum Netzwerksegment 218.6.0.0/16 gehört (wobei /16 die Darstellung der neuen Subnetzmaske ist, entsprechend 255.255.0.0). .
Um eine solche Funktion zu erreichen, besteht der beliebte Algorithmus jetzt darin, 218.6.0.0 und 218.6.7.7 in Dezimalzahlen basierend auf 256 umzuwandeln und sie zu vergleichen. Berechnen Sie beispielsweise zuerst die Dezimalzahl von 218.6.0.0 und 218.6.255.255: 218× 256×256 ×256+6×256×256=3657826304, 218×256×256×256+6×256×256+255×256×256+255=3657891839. Berechnen Sie dann die Dezimalzahl von 218.6.7.7: 218×256×256×256+6×256×256+7×256+7=3657828103 und vergleichen Sie schließlich, ob 3657828103 größer oder gleich 3657826304 und kleiner oder gleich 3657891839 ist . Es liegt jedoch offensichtlich ein Problem vor, und der Wert ist sehr groß. Wenn die IP-Adresse mit 61 beginnt, führt dies zu einem Datenüberlauf und einem Fehler.
Tatsächlich besteht der beste Weg, um zu vergleichen, ob eine IP zu einem bestimmten Netzwerksegment gehört, darin, die IP und das Netzwerksegment in 32-Bit-Binärdateien umzuwandeln und dann zu vergleichen, ob ihre Netzwerkteile identisch sind. ASP selbst verfügt nicht über die Bitoperation Funktion, daher ist eine Implementierung erforderlich. Wir können dies nur manuell wie folgt implementieren:
'Dezimalzahl in Binärzeichenfolge umwandeln
Funktion dec2bin(octNumber)
vara=octNumber
Tun
dec2bin=cstr(vara mod 2) & dec2bin
vara=vara 2
Schleife bis vara=0
Endfunktion
'Binärzeichenfolge auf 8 Bits auffüllen
Funktionspad(str)
pad=right("00000000" & str,8)
Endfunktion
'Bestimmen Sie, ob es sich um eine IP-Adresse handelt.'
Funktion 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})"
Wenn oReg.test(ipadd), dann ist isIp=true
setze oReg=nichts
Endfunktion
'wobei UserIP die IP ist, die wir erkennen möchten
„NetIP ist das Netzwerksegment oder eine bestimmte IP, die erkannt werden soll. Verwenden Sie xxx.xxx.xxx.xxx/N, um das Netzwerksegment darzustellen, wobei N die Anzahl der Subnetzmaskenstellen darstellt.
„Beachten Sie, dass es sich bei diesem Programm um ein Originalprogramm von Global Wanwei handelt. Wenn Sie es also erneut drucken möchten, bewahren Sie bitte die Quellinformationen auf. Vielen Dank.“
„Programmierung: Global Wanwei, spezialisiert auf die Registrierung von Domainnamen und virtuelle Hosting-Dienste
„Website: http://www.netInter.cn
„Die oben genannten Informationen sind ein integraler Bestandteil des Artikeltextes. Wenn Sie diesen Artikel also erneut drucken möchten, müssen Sie die oben genannten Informationen beibehalten.
Funktion check_ip(UserIp,NetIP)“
currentip=BenutzerIp
collection_ips=split(iplist,",") 'Das Netzwerk nach Punkten in 4 Segmente aufteilen
check_ip=false 'Anfänglicher Funktionswert, false geht davon aus, dass sich die IP nicht in diesem Netzwerksegment befindet
NetIP=trim(NetIP)
slashPos=inStr(NetIP,"/")
if slashPos=0 then 'Das Netzwerksegment enthält nicht das /-Symbol, es ist nur eine IP, also vergleichen Sie einfach die Zeichenfolgen, um zu sehen, ob sie gleich sind.
wenn NetIP=currentip dann
check_ip=true 'check_ip=true bedeutet, dass die IPs gleich sind
Exit-Funktion
Ende wenn
anders
netRang=mid(NetIP,slashPos+1) 'Erhalte die Nummer nach /
Wenn nicht, ist isNumeric(netRang) then '/Es folgt keine Zahl, das Format ist falsch
Exit-Funktion
Ende wenn
netRang=cint(netRang) 'Zeichen in Zahlen umwandeln
wenn netRang>31 dann
Die Zahl nach der Exit-Funktion '/ darf 32 Ziffern nicht überschreiten
Ende wenn
ipsets=split(currentip,".") 'Teilen Sie die Benutzer-IP in vier Segmente durch Punkte
C_IP_BIN=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets( 2) ))) & pad(dec2bin(ipsets(3)))
„Die obige Zeile dient dazu, die Benutzer-IP-Adresse manuell in eine entsprechende 32 Zeichen lange Binärdatei umzuwandeln.“
ipsets=split(NetIP,".") 'Folgen Sie dem obigen Prozess, um die Netzwerksegment-IP in eine 32 Zeichen lange Binärdatei umzuwandeln
sPos=instr(ipsets(3),"/") 'Das letzte Format sollte Zahlen/Ziffern sein
wenn sPos=0 dann
Exit-Funktion
Ende wenn
ipsets(3)=left(ipsets(3),sPos-1) 'Letzte/vorherige Nummer abrufen
S_IP_BIN=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets(2))) & pad(dec2bin(ipsets(3)))
'Konvertieren Sie es in eine 32 Zeichen lange Binärdatei
if left(C_IP_BIN,netRang) = left(S_IP_BIN,netRang) then 'Durch den Vergleich, ob die Netzwerksegmente gleich sind, können Sie feststellen, ob die IP des Benutzers zu einem bestimmten Netzwerksegment gehört.
check_ip=true
Ende wenn
Ende wenn
Anwendungsbeispiel
für die Endfunktion
:Um festzustellen, ob 61.139.1.1 im Netzwerksegment 61.139.0.0/16 (255.255.0.0) liegt, müssen Sie nur diese Funktion verwenden, z. B.:
if check_ip("61.139.1.1","61.139 . 0,0/16") dann
Response.write „gleiches Netzwerksegment“
anders
Response.write „Nicht dasselbe Netzwerksegment“
Ende wenn