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)

{

    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值