歡迎訪問北大青鳥魯廣校區~

  1. 加入收藏
  2. 設為主頁
  3. 學校簡介

三分鐘了解北大青鳥

×
  • 北大青鳥大數據課程
  • 北大青鳥網絡工程師
  • 北大青鳥web設計專業
  • 北大青鳥PHP專業
  • 北大青鳥啟蒙星課程

.net教程:Asp.net的IP地址屏蔽功能設計

責任編輯:027hpedu來源:北大青鳥魯廣校區.Net技術教程發布時間:2014-04-29 09:56
導讀:許多人在訪問一些網站時不想讓別人看到自己的ip地址,但是不知道該如何設置。北大青鳥魯廣校區專業老師教大家Asp.net的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個段的值,然后將它們組合為一個整數,下面將提供這個擴展方法:

  ///

  /// 將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;

  }

  }

  這種方案比起以往的字符串驗證方案來說優雅了許多,并可以提高數據庫查詢的效率,建議各位在日后的網站開發中都采用此方案。

  武漢北大青鳥魯廣校區,專業老師會幫你找到適合自己學習的課程和就業方向,詳細了解ip地址屏蔽功能設計,現在就與專業老師在線老師溝通或撥打電話:027-87807717,或QQ咨詢:027-87807717.

本文標題:.net教程:Asp.net的IP地址屏蔽功能設計,責任編輯:027hpedu,于2014年04月29日09時56分發布于北大青鳥魯廣校區。武漢北大青鳥宏鵬魯廣校區,是北大青鳥武漢電腦學校,專業IT計算機培訓,擁有軟件/網絡/安卓/Web前端/Java課程.北大青鳥地址:光谷廣場魯巷數碼港.電話:027-87807717

專業老師指導

趙老師

從事IT教育培訓十年有余,致力于幫助廣大學子找到適合自己的專業。

培訓咨詢客服

劉老師

IT培訓專業客服,用自己的真誠解決了無數學子的困惑。

本文地址:
文章標題:
  • 北大青鳥Java軟件開發
  • 北大青鳥UI設計課程_零基礎可學
  • 北大青鳥動漫設計_武漢設計學校
  • 北大青鳥數字藝術_武漢電腦學校
×
在線咨詢更多問題

如您有任何疑問
在線咨詢隨時為您解答或撥打咨詢熱線:17740513250

×
  • 姓 名*
  • 手 機*
  • QQ號/微信號
  • 所報學科 *
  • 其他備注
  • 溫馨提示:請保持手機暢通,咨詢老師將為您提供專屬的一對一報名服務。

湖北30选5开奖奖结果查询