Иногда нам необходимо определить, принадлежит ли определенный 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)
вара = октябрь
делать
dec2bin=cstr(вара мод 2) и dec2bin
вара=вара 2
цикл до тех пор, пока вара = 0
конечная функция
'Заполнение двоичной строки до 8 бит
функциональная панель(строка)
Pad = вправо («00000000» и строка, 8)
конечная функция
'Определить, является ли это IP-адресом
функция isIp (ipad)
isIp = ложь
установить oReg=новое регулярное выражение
oReg.IgnoreCase=истина
oReg.global=истина
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=ничего
конечная функция
'где UserIP - это IP-адрес, который мы хотим обнаружить
'NetIP — это сегмент сети или определенный IP-адрес, который необходимо обнаружить. Используйте xxx.xxx.xxx.xxx/N для обозначения сегмента сети, где N представляет количество цифр маски подсети.
«Обратите внимание: эта программа является оригинальной программой Global Wanwei, поэтому, если вы хотите ее перепечатать, сохраните исходную информацию, спасибо.
'Программирование: Global Wanwei, специализирующаяся на регистрации доменных имен и услугах виртуального хостинга.
'Веб-сайт: http://www.netInter.cn
'Вышеуказанная информация является неотъемлемой частью текста статьи, поэтому если вы хотите перепечатать эту статью, вам необходимо сохранить вышеуказанную информацию.
Функция check_ip(UserIp,NetIP)
currentip=UserIp
Collection_ips=split(iplist,",") 'Разобьем сеть на 4 сегмента по точкам
check_ip=false 'Начальное значение функции, false предполагает, что IP-адрес не находится в этом сегменте сети.
NetIP=обрезать(NetIP)
slashPos=inStr(NetIP,"/")
if slashPos=0 then 'Сегмент сети не содержит символа /, это просто IP-адрес, поэтому просто сравните строки, чтобы убедиться, что они одинаковы.
если NetIP=currentip, то
check_ip=true 'check_ip=true означает, что IP-адреса равны
функция выхода
конец, если
еще
netRang=mid(NetIP,slashPos+1) 'Получаем номер после /
если не isNumeric(netRang), то '/За ним не следует число, формат неверен
функция выхода
конец, если
netRang=cint(netRang) 'Преобразуем символы в числа
если netRang>31, то
Число после функции выхода '/ не может превышать 32 цифр.
конец, если
ipsets=split(currentip,".") 'Разделим IP-адрес пользователя на четыре сегмента по точкам
C_IP_BIN=pad(dec2bin(ipsets(0))) &pad(dec2bin(ipsets(1))) &pad(dec2bin(ipsets( 2) ))) & Pad(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=pad(dec2bin(ipsets(0))) &pad(dec2bin(ipsets(1))) &pad(dec2bin(ipsets(2))) &pad(dec2bin(ipsets(3)))
'Преобразуем его в двоичный файл длиной 32 символа
if left(C_IP_BIN,netRang) = left(S_IP_BIN,netRang) then 'Сравнивая, совпадают ли сегменты сети, вы можете определить, принадлежит ли IP-адрес пользователя определенному сегменту сети.
check_ip=истина
конец, если
конец, если
Пример применения
конечной функции
:Чтобы определить, находится ли 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 «Не тот сегмент сети»
конец, если