Às vezes precisamos determinar se um determinado endereço IP pertence a um segmento de rede para determinar se o usuário pode acessar o sistema.
Por exemplo, o IP logado do usuário é 218.6.7.7, e nosso programa deve determinar se ele pertence ao segmento de rede 218.6.0.0/16 (onde /16 é a representação da nova máscara de sub-rede, equivalente a 255.255.0.0) .
Para alcançar tal função, o algoritmo popular agora é converter 218.6.0.0 e 218.6.7.7 em decimal com base em 256 e compará-los. Por exemplo, primeiro calcule o decimal de 218.6.0.0 e 218.6.255.255: 218× 256×256. ×256+6×256×256=3657826304, 218×256×256×256+6×256×256+255×256×256+255=3657891839. Em seguida, calcule o decimal de 218.6.7.7: 218×256×256×256+6×256×256+7×256+7=3657828103 e, finalmente, compare se 3657828103 é maior ou igual a 3657826304 e menor ou igual a 3657891839 . Mas obviamente há um problema. O valor do cálculo é muito grande e o valor é muito grande. Se o endereço IP começar com 61, tudo bem. Se começar com 218, isso causará excesso de dados e erro.
Na verdade, a melhor maneira de comparar se um IP pertence a um determinado segmento de rede é converter o IP e o segmento de rede em binário de 32 bits e, em seguida, comparar se suas partes de rede são iguais. O próprio ASP não possui a operação de bits. função, então é necessário implementar Só podemos implementar isso manualmente, da seguinte forma:
'Converter decimal em string binária
função dec2bin (número de outubro)
vara = número de outubro
fazer
dec2bin=cstr(vara mod 2) & dec2bin
vara = vara 2
loop até vara = 0
end function
'Preenchendo string binária para 8 bits
bloco de funções (str)
pad=direita("00000000"&str,8)
end function
'Determina se é um endereço IP
função éIp(ipadd)
isIp=falso
definir oReg = novo 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})"
se oReg.test(ipadd) então isIp=true
definir oReg = nada
função final
'onde UserIP é o IP que queremos detectar
'NetIP é o segmento de rede ou um determinado IP a ser detectado. Use xxx.xxx.xxx.xxx/N para representar o segmento de rede, onde N representa o número de dígitos da máscara de sub-rede.
'Observação, este programa é um programa original da Global Wanwei, então se você quiser reimprimi-lo, guarde as informações da fonte, obrigado.
'Programação: Global Wanwei, especializada em registro de nomes de domínio e serviços de hospedagem virtual
'Site: http://www.netInter.cn
'As informações acima são parte integrante do texto do artigo, portanto, se você quiser reimprimir este artigo, deverá reter as informações acima
Function check_ip(UserIp,NetIP)
currentip = UserIp
collection_ips=split(iplist,",") 'Divide a rede em 4 segmentos por pontos
check_ip=false 'Valor inicial da função, false assume que o IP não está neste segmento de rede
NetIP=cortar(NetIP)
barraPos=inStr(NetIP,"/")
if slashPos=0 then 'O segmento de rede não contém o símbolo /, é apenas um IP, então basta comparar as strings para ver se são iguais.
se NetIP = ip atual então
check_ip=true 'check_ip=true significa que os IPs são iguais
função de saída
terminar se
outro
netRang=mid(NetIP,slashPos+1) 'Obtém o número após /
se não for isNumeric(netRang) então '/Não é seguido por um número, o formato está incorreto
função de saída
terminar se
netRang=cint(netRang) 'Converte caracteres em números
se netRang>31 então
O número após a função de saída '/ não pode exceder 32 dígitos
terminar se
ipsets=split(currentip,".") 'Divide o IP do usuário em quatro segmentos por pontos
C_IP_BIN=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets( 2) ))) & pad(dec2bin(ipsets(3)))
'A linha acima serve para converter manualmente o endereço IP do usuário em um binário correspondente de 32 caracteres
ipsets=split(NetIP,".") 'Siga o processo acima para converter o IP do segmento de rede em um binário de 32 caracteres
sPos=instr(ipsets(3),"/") 'O último formato deve ser números/dígitos
se sPos=0 então
função de saída
terminar se
ipsets(3)=left(ipsets(3),sPos-1) 'Obtém o último/anterior número
S_IP_BIN=pad(dec2bin(ipsets(0))) & pad(dec2bin(ipsets(1))) & pad(dec2bin(ipsets(2))) & pad(dec2bin(ipsets(3)))
'Converta-o para um binário de 32 caracteres
if left(C_IP_BIN,netRang) = left(S_IP_BIN,netRang) then 'Ao comparar se os segmentos de rede são iguais, você pode determinar se o IP do usuário pertence a um determinado segmento de rede.
check_ip = verdadeiro
terminar se
terminar se
Exemplo de aplicação
de função final
:para determinar se 61.139.1.1 está no segmento de rede 61.139.0.0/16 (255.255.0.0), você só precisa simplesmente usar esta função, como:
if check_ip("61.139.1.1","61.139 0,0/16") então
Response.write "mesmo segmento de rede"
outro
Response.write "Não é o mesmo segmento de rede"
terminar se