A veces necesitamos determinar si una determinada dirección IP pertenece a un segmento de red para determinar si el usuario puede acceder al sistema.
Por ejemplo, la IP de inicio de sesión del usuario es 218.6.7.7, y nuestro programa debe determinar si pertenece al segmento de red 218.6.0.0/16 (donde /16 es la representación de la nueva máscara de subred, equivalente a 255.255.0.0) .
Para lograr tal función, el algoritmo popular ahora es convertir 218.6.0.0 y 218.6.7.7 a decimal basado en 256 y compararlos. Por ejemplo, primero calcule el decimal de 218.6.0.0 y 218.6.255.255: 218 × 256 × 256. ×256+6×256×256=3657826304, 218×256×256×256+6×256×256+255×256×256+255=3657891839. Luego calcule el decimal de 218.6.7.7: 218 × 256 × 256 × 256 + 6 × 256 × 256 + 7 × 256 + 7 = 3657828103, y finalmente compare si 3657828103 es mayor o igual que 3657826304 y menor o igual que 3657891839 . Pero obviamente hay un problema. La cantidad de cálculo es muy grande y el valor es muy grande. Si la dirección IP comienza con 61, está bien. Si comienza con 218, esto provocará un desbordamiento de datos y un error.
De hecho, la mejor manera de comparar si una IP pertenece a un determinado segmento de red es convertir la IP y el segmento de red en binario de 32 bits y luego comparar si sus partes de red son las mismas. El propio ASP no tiene operaciones de bits. función, por lo que es necesario implementarla. Solo podemos implementar esto manualmente, de la siguiente manera:
'Convertir cadena decimal a binaria
función dec2bin(númerooct)
vara=númerooct
hacer
dec2bin=cstr(vara mod 2) & dec2bin
vara=vara 2
bucle hasta vara=0
función final
'Relleno de cadena binaria a 8 bits
teclado de función (cadena)
pad=derecha("00000000" & str,8)
función final
'Determinar si es una dirección IP
función esIp(ipadd)
esIp=falso
establecer oReg = nueva RegExp
oReg.IgnoreCase=verdadero
oReg.global=verdadero
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) entonces isIp=true
establecer oReg=nada
función final
'donde UserIP es la IP que queremos detectar
'NetIP es el segmento de red o una determinada IP que se detectará. Utilice xxx.xxx.xxx.xxx/N para representar el segmento de red, donde N representa el número de dígitos de la máscara de subred.
'Tenga en cuenta que este programa es un programa original de Global Wanwei, por lo que si desea reimprimirlo, conserve la información fuente, gracias.
'Programación: Global Wanwei, especializada en registro de nombres de dominio y servicios de alojamiento virtual
'Sitio web: http://www.netInter.cn
'La información anterior es una parte integral del texto del artículo, por lo que si desea reimprimir este artículo, debe conservar la información anterior
Función check_ip(UserIp,NetIP)
.
IP actual=Ip de usuario
collection_ips=split(iplist,",") 'Dividir la red en 4 segmentos por puntos
check_ip=false 'Valor de función inicial, falso supone que la IP no está en este segmento de red
NetIP=recortar(NetIP)
barraPos=inStr(NetIP,"/")
si slashPos=0 entonces 'El segmento de red no contiene el símbolo /, es solo una IP, así que compare las cadenas para ver si son iguales.
si NetIP = IP actual entonces
check_ip=true 'check_ip=true significa que las IP son iguales
función de salida
terminar si
demás
netRang=mid(NetIP,slashPos+1) 'Obtiene el número después de /
si no esNumeric(netRang) entonces '/No va seguido de un número, el formato es incorrecto
función de salida
terminar si
netRang=cint(netRang) 'Convierte caracteres en números
si netRang>31 entonces
El número después de la función de salida '/ no puede exceder los 32 dígitos
terminar si
ipsets=split(currentip,".") 'Divide la IP del usuario en cuatro segmentos por puntos
C_IP_BIN=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets( 2) ))) & pad(dec2bin(ipsets(3)))
'La línea anterior es para convertir manualmente la dirección IP del usuario en un binario correspondiente de 32 caracteres de longitud
ipsets=split(NetIP,".") 'Siga el proceso anterior para convertir la IP del segmento de red en un binario de 32 caracteres
sPos=instr(ipsets(3),"/") 'El último formato debe ser números/dígitos
si sPos=0 entonces
función de salida
terminar si
ipsets(3)=left(ipsets(3),sPos-1) 'Obtiene el último/anterior número
S_IP_BIN=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets(2))) & pad(dec2bin(ipsets(3)))
'Conviértelo a un binario de 32 caracteres
if left(C_IP_BIN,netRang) = left(S_IP_BIN,netRang) then 'Al comparar si los segmentos de red son iguales, puede determinar si la IP del usuario pertenece a un determinado segmento de red.
check_ip=verdadero
terminar si
terminar si
Ejemplo de aplicación
de función final
:para determinar si 61.139.1.1 está en el segmento de red 61.139.0.0/16 (255.255.0.0), solo necesita usar esta función, como por ejemplo:
if check_ip("61.139.1.1","61.139 0,0/16") entonces.
Response.write "mismo segmento de red"
demás
Response.write "No es el mismo segmento de red"
terminar si