欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【Asp.net教程:设计IP地址屏蔽功能】,下面是详细的分享!
Asp.net教程:设计IP地址屏蔽功能
出于安全考虑,几乎每个动态网站都具备IP地址屏蔽功能,而网上流传的很多关于该功能的教程大都采用字符串保存和验证IP地址,我认为这是不太科学的,我试图找到最佳的设计方案。
“IP地址的长度为32位,分为4段,每段8位,用十进制数字表示,每段数字范围为0~255,段与段之间用句点隔开。”
由此我们了解到,IP地址实际上是一个32位正整数,在C#中可以使用uint类型来表示,但SQLServer数据库里好像没有对应的类型;转而使用数据库支持的int类型的话,则会出现溢出的情况;因此我们做出妥协:使用long(bigint)类型。
| 以下为引用的内容:
TIP: int取值范围:-2,147,483,648 到 2,147,483,647 uint取值范围:0 到 4,294,967,295 long取值范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
那么如何将IP地址转为整数呢?我们看到IPAddress类中有一个“[否决的]”实例属性Address,这个属性的确可以返回一个long值,但是测试一下,得到的数据确实这样的:
| 以下为引用的内容:
“127.0.0.1” -> 16777343 “127.0.0.2” –> 33554559 |
的确该让它“否决”,这样的整数对我们来说毫无意义,我们是无法通过这样的方法比较传入的IP是否介于两个IP值之间的。
那么只有自己动手了,我们将通过IPAddress类的GetAddressBytes()实例方法获取IP的4个段的值,然后将它们组合为一个整数,下面将提供这个扩展方法:
| 以下为引用的内容:
/// <summary> /// 将IP地址转为整数形式 /// </summary> /// <returns>整数</returns> public static long 转换为整数(this IPAddress ip) { long o=0; foreach (byte f in ip.GetAddressBytes()) { o +=(long)f << 8 * x--; } return o; |
你可以这样使用这个扩展方法:
IPAddress.Parse("127.0.0.1").转换为整数()
这里还有一个用于逆转换的扩展方法,用于将long转回IPAddress:
| 以下为引用的内容:
/// <summary> /// 将整数转为IP地址 /// </summary> /// <returns>IP地址</returns> public static IPAddress 转换为IP地址(this long l) { for (int i=0; i < 4; i++) { b[3 - i]=(byte)(l >> 8 * i & 255); } return new IPAddress(b); } |
这样我们就可以通过计算得到正确并有意义的整数了:
| 以下为引用的内容:
“127.0.0.1” -> 2130706433 “127.0.0.2” –> 2130706434 |
OK,确立了方案核心,下面开始设计SQLServer数据表:

这样设计后,在添加时将起始和终止IP地址转为long类型并存入,并指定一个过期时间。
在验证时只需要获取所有未过期的条目,比较传入的IP地址是否介于起始值和终止值之间即可。
以往通过字符串存储和验证的方案中,屏蔽时要么屏蔽一个精确的IP地址,要么就屏蔽一段或两段IP,如“192.168.*.*”,要想屏蔽“192.168.1.200”到“192.168.4.64”之间的IP的话,将会非常麻烦;
而我们这样设计就可以轻松实现:“192.168.1.200”在数据库里存储的是“3232235976”,“192.168.4.64”在数据库中是“3232236608”,即使使用肉眼也能极快地判断传入的地址是否介于它们之间,更不要说计算机查询了。
下面为数据表生成EDM模型:

添加IP屏蔽记录的代码:
/// <summary>
/// 添加一个新的IP屏蔽区段
/// </summary>
/// <param name="IP区段起始值">起始IP,如61.51.200.0</param>
/// <param name="IP区段终止值">终止IP,如61.51.255.255</param>
/// <param name="过期时间">屏蔽截止时间</param>
/// <returns>ID号</returns>
public static Guid 添加(string IP区段起始值, string IP区段终止值, DateTime 过期时间)
{
var id=Guid.NewGuid();
var sip=IPAddress.Parse(IP区段起始值).转换为整数();
var eip=IPAddress.Parse(IP区段终止值).转换为整数();
using (var c=new SiteMainEntities())
{
//检测是否已存在相同的IP屏蔽记录
var a=c.IP地址屏蔽.Where(f=> f.区段起始值==sip && f.区段终止值==eip);
//如果存在则更新其过期时间
if (a.Count()>0)
{
var l=a.First();
if (l.过期时间 < 过期时间) l.过期时间=过期时间;
}
//不存在则正常添加一个新的屏蔽记录
else c.AddToIP地址屏蔽(new IP地址屏蔽 { ID=id, 过期时间=过期时间, 区段起始值=sip, 区段终止值=eip });
c.SaveChanges();
}
return id;
}
检测指定IP地址是否被屏蔽的代码:
/// <summary>
/// 检测指定IP地址是否已受到屏蔽
/// </summary>
/// <param name="IP地址">要检测的IP地址</param>
/// <returns>是否属于已屏蔽的IP</returns>
public static bool 检测是否被屏蔽(string IP地址)
{
var ip=IPAddress.Parse(IP地址).转换为整数();
using (var c=new SiteMainEntities())
{
return c.IP地址屏蔽.Count(f=> f.过期时间 > DateTime.Now && ip >=f.区段起始值 && ip <=f.区段终止值) > 0;
}
}
以上所分享的是关于Asp.net教程:设计IP地址屏蔽功能,下面是编辑为你推荐的有价值的用户互动:
相关问题:asp.net的web.config中如何禁止一些ip访问网站
答:不能在这埃操作系统可以设置 >>详细
相关问题:asp.net 怎么禁止国内ip访问
答:判断访问客户的IP地址,如果是国内IP ,禁止访问,这样可行不? >>详细
相关问题:完整的asp.net教程那里有
答:IT学习联盟网站的(喜欢《零基础aspnet就业班》的可以复制 sina.lt/bsjr 粘贴浏览器地址栏按回车键即打开)。零基础aspnet就业班包括aspnet基础 进阶 高级 项目。是一套完整的aspnet视频教程。它从零基础开始教起,零基础到就业水平,就算没基础... >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
