专业虚拟主机提供商! 正规合法诚信公司、拥有ICP/ISP双经营许可证
域名空间实时开通立即使用,几分钟即可完成
安全方便的网上支付,超强的域名空间管理程序
我要购买空间,请点这里
我要注册域名,请点这里
我要建设网站,请点这里
我要续费域名,请点这里
我要续费空间,请点这里
我要在线支付,请点这里
首 页 特惠套餐 域名注册 虚拟主机 托管租用 FTP空间 数据库 企业邮局 网站建设 联系我们 付款方式
 | 网站首页 | 虚拟主机资讯 | 域名注册资讯 | 托管租用资讯 | 网络编程 | 网站备案 | 系统安全 | 源码下载 | 
您现在的位置: IDC资讯网 >> 网络编程 >> Asp.net编程 >> 正文
[组图]Asp.net教程:设计IP地址屏蔽功能           ★★★
Asp.net教程:设计IP地址屏蔽功能
点击数: 更新时间:2009-9-27 15:58:09

出于安全考虑,几乎每个动态网站都具备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)

{
    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:

以下为引用的内容:

/// <summary>

/// 将整数转为IP地址

/// </summary>

/// <returns>IP地址</returns>

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

以下为引用的内容:

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

    }

}

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


以上内容均来自网络,由 稳速网络 搜集整理,如有侵权请联系我们立即删除,如转载请注明原文出处,并保留以下内容。
    [稳速网络] http://www.765.com.cnhttp://www.wsu.cn 是深圳市稳速网络科技有限公司的网络服务品牌,专业经营域名注册虚拟主机网站建设服务器租用托管等业务。经过多年的高速发展,“稳速网络”已经成为我国一家知名的互联网服务提供商。
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新推荐  更多内容
    最新热门  更多内容
    资讯中心首页
    虚拟主机资讯 | 域名注册资讯 | 托管租用资讯 | 网络编程 | 网站备案 | 系统安全 | 源码下载 | ASP | Asp.Net | PHP | MSSQL |MYSQL |
    关于我们 | 联系我们 | 产品价格 | 代理加盟 | 咨询反馈 | 诚聘英才 | 在线对话系统 | ASP技术网 | 帮助中心 | 网站地图
    ICP/ISP证B2-20050322
    ICP/ISP经营许可证编号:粤ICP证B2-20050322 网站备案号:粤B2-20050322号
    客服热线:0755-26499456 0755-26499435 [共8线] 24小时值班:0755-21852765 [更多]
    客服QQ:
    [ 63103 ]
    [ 959260 ]
    代理咨询:
    [ 519065 ]
    [更多]
    客户服务中心:深圳市南山区桃园路前海金岸金丰阁706  邮编:518052
    本站推广词:动态空间 | 网站空间 | 虚拟主机 | 深圳网站建设 | 空间购买 | 域名空间 | ASP空间申请购买
    服务范围:广州·深圳·东莞·珠海·汕头·惠州·中山·佛山·上海·重庆等全国其它地区
    广东省深圳市稳速网络科技有限公司版权所有 严禁以任何形式进行复制、抄袭