用asp判断某IP是否属于某网段的另类算法
作者:环球万维 来源:netInter.cn 发布时间:2007-09-28 12:33:00
有时候我们需要判断某一个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进制换算成10进制并进行比较得出,如先计算出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本身不具备位运行功能,所以要实现这个只有我们手工实现,具体如下:
'将十进制转为二进制字符串
function dec2bin(octNumber)
vara=octNumber
do
dec2bin=cstr(vara mod 2) & dec2bin
vara=vara \ 2
loop until vara=0
end function
'将二进制字符串填充为8位
function pad(str)
pad=right("00000000" & str,8)
end function
'判断是否是一个IP地址
function 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})"
if oReg.test(ipadd) then isIp=true
set oReg=nothing
end function
'其中UserIP是我们要检测的IP
'NetIP是要检测的网段或某个IP,用xxx.xxx.xxx.xxx/N来表示网段,其中N表示子网掩码位数
'注,该程序是环球万维原创程序,所以如果您要转载,请保留出处信息,谢谢.
'程序设计:环球万维
'网址:http://www.netInter.cn
'以上信息与文章正文是不可分割的一部分,所以如果您要转载本文章,您必须保留以上信息.
Function check_ip(UserIp,NetIP)
currentip=UserIp
collection_ips=split(iplist,",") '将网络按点分割成4段
check_ip=false '初始函数值,false假设IP不在这网段
NetIP=trim(NetIP)
slashPos=inStr(NetIP,"/")
if slashPos=0 then '网段没含有/符号,他只是一个IP,所以比较比个字符串是否相同就可以了
if NetIP=currentip then
check_ip=true 'check_ip=true表示IP相等
exit function
end if
else
netRang=mid(NetIP,slashPos+1) '得到/后边的数字
if not isNumeric(netRang) then '/后边不是数字,格式不正确
exit function
end if
netRang=cint(netRang) '将字符转为数字
if netRang>31 then
exit function '/后的数字不能超过32位
end if
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),"/") '最后一点格式应该是 数字/数字
if sPos=0 then
exit function
end if
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=true
end if
end if
end function
应用举例:
要判断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") then
Response.write "同一网段"
else
Response.write "不是同一网段"
end if
猜你喜欢
- 功能输入一个特定格式的时间戳,自动获取前进或者后退多少小时之后的时间附加函数时间戳转换函数def date_time_str_to_long
- 一个最最简单的例子:绘制一个从 0 到 360 度完整的 SIN 函数图形import numpy as npimport matplotl
- 本文实例讲述了PHP实现的curl批量请求操作。分享给大家供大家参考,具体如下:<?php$ch = array();$res = a
- 第1种 (通过mysql自带的客户端,MySQL 5.5 Command Line Client) 不推荐这种方式注意:这种登录方式,只适用
- 最近工作中的一个项目需要自动发送一些信息邮件到指定邮箱的需求,那么如何实现Python自动发送邮件的功能呢?接下来我们就来简单的介绍下如何利
- 什么是字符串格式化,为什么需要这样做?我们有时候刷抖音/B站看到封面很好看,但是进入直播发现,不过如此!想必主播通过某种方式把输出转换为读者
- python实现四舍五入""" 四舍五入 :param
- 使用在Safari和WebKit中可用的CSS高级特性,你可以为你的网站和网络应用带来一个新的级别的令人兴奋的东西。WebKit是Safar
- 一、BN(Batch Normalization)算法1. 对数据进行归一化处理的重要性神经网络学习过程的本质就是学习数据分布,在训练数据与
- 如何用PYTHON制作填词游戏新建一个PYTHON文档。用JUPYTER NOTEBOOK打开即可。print("Heart is
- 本文为大家分享了做360度的全景照片的详细步骤,其中要注意以下几个问题:1、如何在拖图片时,使其加载变快?---注意让图片隐藏的性能比让图片
- 问:Perl下应当如何连接Access数据库答:首先需要安装Win32-ODBC模块,具体的步骤如下:1:从TOOLS栏目中下载Win32-
- 下面看下python调用函数加括号和不加括号的区别,具体代码如下所示; def bracket(data):return dat
- 最近因为要安装Tensorflow,然后发现tensorflow居然不支持python3.7,于是怒而将其降级到3.6以下是具体命令,mar
- python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,
- 本文实例讲述了Python使用dict.fromkeys()快速生成一个字典。分享给大家供大家参考,具体如下:>>> re
- 前言随着微信的普及,越来越多的人开始使用微信。微信渐渐从一款单纯的社交软件转变成了一个生活方式,人们的日常沟通需要微信,工作交流也需要微信。
- Bootstrap,来自 Twitter,是目前最受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,
- 最近使用python写一些东西,在参考资料的时候发现字典是没有顺序的,那么怎么样按照一定顺序访问字典呐,我找到了一个小方法:假设一个字典是:
- JS操作二进制很麻烦,而且一直没有一个好的无损压缩工具来实现纯文本的压缩。所以钻研了一段时间的gzip,后来发现还是仅用 LZ77 比较容易