Parfois, nous devons déterminer si une certaine adresse IP appartient à un segment de réseau pour déterminer si l'utilisateur peut accéder au système.
Par exemple, l'adresse IP de connexion de l'utilisateur est 218.6.7.7 et notre programme doit déterminer s'il appartient au segment de réseau 218.6.0.0/16 (où /16 est la représentation du nouveau masque de sous-réseau, équivalent à 255.255.0.0). .
Pour obtenir une telle fonction, l'algorithme populaire consiste désormais à convertir 218.6.0.0 et 218.6.7.7 en nombre décimal basé sur 256 et à les comparer. Par exemple, calculez d'abord le nombre décimal de 218.6.0.0 et 218.6.255.255 : 218 × 256 × 256. ×256+6×256×256=3657826304, 218×256×256×256+6×256×256+255×256×256+255=3657891839. Calculez ensuite la décimale de 218.6.7.7 : 218×256×256×256+6×256×256+7×256+7=3657828103, et comparez enfin si 3657828103 est supérieur ou égal à 3657826304 et inférieur ou égal à 3657891839. . Mais il y a évidemment un problème. Le montant du calcul est très important et la valeur est très grande. Si l'adresse IP commence par 61, ce n'est pas grave. Si elle commence par 218, cela entraînera un débordement de données et une erreur.
En fait, la meilleure façon de comparer si une IP appartient à un certain segment de réseau est de convertir l'IP et le segment de réseau en binaire 32 bits, puis de comparer si leurs parties de réseau sont les mêmes. L'ASP lui-même n'a pas le fonctionnement sur bits. fonction, il est donc nécessaire de l'implémenter. Nous ne pouvons l'implémenter que manuellement, comme suit :
'Convertir le nombre décimal en chaîne binaire
fonction dec2bin(numérooct)
vara=numérooct
faire
dec2bin=cstr(vara mod 2) & dec2bin
vara=vara 2
boucle jusqu'à vara=0
fonction de fin
'Remplissage de la chaîne binaire à 8 bits
pavé de fonction (str)
pad=droite("00000000" & str,8)
end function
'Déterminer s'il s'agit d'une adresse IP
la fonction estIp(ipadd)
isIp=faux
définir oReg=nouvelle 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})"
si oReg.test(ipadd) alors isIp=true
définir oReg = rien
end function
'où UserIP est l'adresse IP que nous voulons détecter
'NetIP est le segment de réseau ou une certaine adresse IP à détecter. Utilisez xxx.xxx.xxx.xxx/N pour représenter le segment de réseau, où N représente le nombre de chiffres du masque de sous-réseau.
« Remarque, ce programme est un programme original de Global Wanwei, donc si vous souhaitez le réimprimer, veuillez conserver les informations source, merci.
'Programmation : Global Wanwei, spécialisé dans l'enregistrement de noms de domaine et les services d'hébergement virtuel
"Site Web : http://www.netInter.cn
'Les informations ci-dessus font partie intégrante du texte de l'article, donc si vous souhaitez réimprimer cet article, vous devez conserver les informations ci-dessus.
Function check_ip(UserIp,NetIP)
currentip=UserIp
collection_ips=split(iplist,",") 'Diviser le réseau en 4 segments par points
check_ip=false 'Valeur initiale de la fonction, false suppose que l'adresse IP n'est pas dans ce segment de réseau
NetIP=trim(NetIP)
slashPos=inStr(NetIP,"/")
if slashPos=0 then 'Le segment de réseau ne contient pas le symbole /, c'est juste une adresse IP, alors comparez simplement les chaînes pour voir si elles sont identiques.
si NetIP=currentip alors
check_ip=true 'check_ip=true signifie que les IP sont égales
fonction de sortie
finir si
autre
netRang=mid(NetIP,slashPos+1) 'Obtenir le numéro après /
sinon isNumeric(netRang) alors '/Il n'est pas suivi d'un nombre, le format est incorrect
fonction de sortie
finir si
netRang=cint(netRang) 'Convertir les caractères en nombres
si netRang>31 alors
Le numéro après sortie de la fonction '/ ne peut pas dépasser 32 chiffres
finir si
ipsets=split(currentip,".") 'Divisez l'adresse IP de l'utilisateur en quatre segments par points
C_IP_BIN=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets( 2) ))) & pad(dec2bin(ipsets(3)))
'La ligne ci-dessus consiste à convertir manuellement l'adresse IP de l'utilisateur en un binaire correspondant de 32 caractères.
ipsets=split(NetIP,".") 'Suivez le processus ci-dessus pour convertir l'adresse IP du segment de réseau en un binaire de 32 caractères.
sPos=instr(ipsets(3),"/") 'Le dernier format doit être des nombres/chiffres
si sPos=0 alors
fonction de sortie
finir si
ipsets(3)=left(ipsets(3),sPos-1) 'Obtenir le dernier/précédent numéro
S_IP_BIN=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets(2))) & pad(dec2bin(ipsets(3)))
'Convertissez-le en un binaire de 32 caractères
if left(C_IP_BIN,netRang) = left(S_IP_BIN,netRang) then 'En comparant si les segments de réseau sont identiques, vous pouvez déterminer si l'adresse IP de l'utilisateur appartient à un certain segment de réseau.
check_ip = vrai
finir si
finir si
Exemple d'application
de fonction de fin
:Pour déterminer si 61.139.1.1 se trouve dans le segment de réseau 61.139.0.0/16 (255.255.0.0), il vous suffit d'utiliser cette fonction, par exemple :
if check_ip("61.139.1.1","61.139 .0.0/16") puis
Response.write "même segment de réseau"
autre
Response.write "Pas le même segment de réseau"
finir si