欢迎您访问北大青鸟昌平校区

400-870-7892

全国咨询热线

您现在所在位置:北大青鸟 >网络学院 >

.net教程:Asp.net的IP地址屏蔽功能设计

来源:北大青鸟昌平校区 | 更新时间:2017-08-01

  “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个段的值,然后将它们组合为一个整数,下面将提供这个扩展方法:

  ///

  /// 将IP地址转为整数形式

  ///

  /// 整数

  public static long 转换为整数(this IPAddress ip)

  {

  int x = 3;

  long o = 0;

  foreach (byte f in ip.GetAddressBytes())

  {

  o += (long)f << 8 * x--;

  }

  return o;

  }

  你可以这样使用这个扩展方法:

  IPAddress.Parse("127.0.0.1").转换为整数()

  这里还有一个用于逆转换的扩展方法,用于将long转回IPAddress:

  ///

  /// 将整数转为IP地址

  ///

  /// IP地址

  public static IPAddress 转换为IP地址(this long l)

  {

  var b = new byte[4];

  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屏蔽记录的代码:

  ///

  /// 添加一个新的IP屏蔽区段

  ///

  /// 起始IP,如61.51.200.0

  /// 终止IP,如61.51.255.255

  /// 屏蔽截止时间

  /// ID号

  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地址是否被屏蔽的代码:

  ///

  /// 检测指定IP地址是否已受到屏蔽

  ///

  /// 要检测的IP地址

  /// 是否属于已屏蔽的IP

  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;

  }

  }

  这种方案比起以往的字符串验证方案来说优雅了许多,并可以提高数据库查询的效率,建议各位在日后的网站开发中都采用此方案。

  • 北京哪个电脑培训学校好?

    北京哪个电脑培训学校好?在这个网络时代,很多人都想通过学好电脑知识来找一份工资待遇好一点的工作。由于电脑知识比较广泛,需要学习的方向很多,因此建议学电脑的人选择...详细

  • 北大青鸟计算机学校有什么优势

    现在的行业竞争非常激烈,要想学到真知识和过硬技能,就快快到最具优势的北大青鸟昌平校区学习吧。预知详情,请点击下文...详细

  • 北大青鸟计算机专业的就业方向

    想拿高薪,想拥有更好更宽广的就业机会吗?北大青鸟昌平校区网络营销专业圆你就业梦。...详细

  • 北京北大青鸟网络工程师就业好吗?

    张磊同学:老师好,我是我今年高中毕业,自己想找个行业技术培训的地方比较好好培训自己为的是将来自己能用有个好的工作,听问北京北京 北大青鸟 不错,所以我想问问 北京...详细

  • 北京北大青鸟哪家好

    北京北大青鸟哪家好?北大青鸟昌平校区从开办以来,已经为社会输送了大批的人才,并受到各个企业的赞誉,学校内先进的课程体系,强劲的师资力量,优秀的办学模式都是促进学员成才...详细

  • 北大青鸟benet5.0网络工程师课程特点

    BENET网络工程师培训 BENET网络工程师培训--培养目标 : BENET产品定位的目标是就业岗位(网络工程师)的核心技能点。作为产品的培养目标,即培养学员能够纵横职场的6大就...详细

  • 北大青鸟学校哪个好?

    很多学生在选择 北大青鸟 学校的时候,都要对比一下看看 北大青鸟学校 哪个好? 北大青鸟学校哪个好?不能听人说,而要自己去考察,北大青鸟学校哪个好?只有亲自来看过的人才...详细

  • 北大青鸟学费多少?有没有什么收费的标准?

    老师您好!我是一名高中生,因为文化课成绩不是很好,所以我对考重点大学是没太大希望的,所以想学计算机技术,靠自己的能力挣钱,不知道北大青鸟学费是什么?有没有什么收...详细

  • 关于北大青鸟学费是多少?学校怎么样?

    我是北大青鸟的一名在读生、关于 北大青鸟学费多少 的问题,相信是所有想来北大青鸟的人都关心的问题。很多人在没来之前应该已经了解了很多关于学IT方面的学校、会觉得北大...详细

  • 北大青鸟学校怎么样、学费是多少?

    吉勇哲同学问:你好老师您好,我由于成绩不理想,没能考上大学。但是我对电脑、网络这方面比较感兴趣,所以我想学习电脑技术。听说北大青鸟还不错,所以我想来北大青鸟学习...详细

  • 北大青鸟云计算课程

    1、采用微电影形式,使用真实的硬件服务器进行演练,网络原理采用了Flsh动画形式,实现快速入门; 2、能够掌握计算机网络、安全及Liunx系统基础知识,会进行Liunx系统管 ...详细

  • 北大青鸟BCUI专业详细介绍

    北大青鸟职业教育《U世界薪技能BCUI 2.0》新专业线上发布会 专业概述:BCUI2.0 全称:北大青鸟认证的全链路UI设计专业 培养目标: 养成严谨、规范的工作习惯 具备审美情趣...详细

  • 北大青鸟学士后Java软件工程师

    Java做为一种全球开发者最多的一种独立的开发工具,不光有着强大的应用范围,同时在其各种就业岗位上,薪资也一直是位居前列的。从而吸引了如此之多的软件开发人员参与进来...详细

  • 北大青鸟昌平校区都有什么课程?

    现在有很多学员想学习IT行业技术可是因为自己有工作所以想问北大青鸟昌平校区有什么课程? 首先老师要对想通过培训来进步自己的行业技术水准从而进入互联网网络这一行的同...详细

  • 北大青鸟昌平校区:转角,阳光依旧精彩

    每一位来到北大青鸟昌平校区的学员一进门就能看到,教育改变生活就几个大字。可见,这几个字对于北大青鸟的重要意义,也正因为坚信着这个理念,多年来,北大青鸟昌平校区为...详细

  • 北大青鸟网络工程师培训系列课程

    全国人民耳熟能详的北大青鸟,拥有课程是面向全社会的系统化、职业化、北大青鸟IT培训的课程北大青鸟昌平校区是全国三甲校区。 为了满足社会大众合学员的学习需求,适应新...详细

  • 教育规范化成为北大青鸟致胜关键

    现如今,想要在这个发展迅速的复社会找到立足之处,能不能更好的完善自己是解决问题的关键。而且善于从别的人身上发现优点会是未来的生存之道,所以,提升自己成为更好生存...详细

  • 北大青鸟网络工程师课程怎么样?

    蒋晴晴同学问:老师您好,我现在想学习网络工程师课程,因为现在的待遇不是很好,网络工程师的待遇听说不错,但是不太了解北大青鸟网络工程师课程怎么样? 选择北大青鸟,...详细

  • COT与专业课的完美融合,打造职场精英

    随着企业和网络的发展,企业对用人方面要求也在逐渐提高,并不是指要求高学历,而是更多的要求员工的工作经验和能力,这些才是用人单位比较看重的。所以在大学里学到的知识...详细

  • 北大青鸟Java软件开发为大学生成功就业增添胜利筹码

    在招聘会上,大量的求职者都想要能够在这里结束自己的求职生涯,找到一份好工作。因此很多人进行了精心的准备。但是最后的结果,那些经过精心准备的应届毕业生成功入职的人...详细

热门话题

在线客服

ONLINE SERVICE

联系电话

18210170187

返回顶部