互联网软件@产业

JasperZhu's Tech Web
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C#,Web系统中如何判断访问来源IP为本地(IPv4)

Posted on 2010-11-08 17:39  JasperZhu  阅读(1472)  评论(0编辑  收藏  举报
本地是指:访问来自本机(127.0.0.1)或IP地址与服务器的相同,或与服务器在同一个局域网内。
一.首先用HttpRequest.IsLocal 属性。如果发出请求方的 IP 地址为 127.0.0.1,或者,如果请求的 IP 地址与服务器的 IP 地址相同,IsLocal 属性就会返回 true。
二.然后,将IP转化为float值,看是否在局域网保留IP的值的范围内。
三类局域网保留IP段:
Class A 10.0.0.0-10.255.255.255
Class B 172.16.0.0-172.31.255.255
Class C 192.168.0.0-192.168.255.255
计算出的值范围:
127.0.0.1 – 值 2130706432
10.0.0.0-10.255.255.255   值范围 167772160 -- 184549375
172.16.0.0-172.31.255.255   值范围 2886729728 – 2887778303
192.168.0.0-192.168.255.255   值范围 3232235520 – 3232301055

IP值计算方法:

IP分为4段后,用256 ^ (4 - i - 1),四个值相加。数据类型应该为double,single类型当值大时精度不够。

代码

代码
        /// <summary>
        
/// 根据一个IPV4地址生成一个IP值,如果地址错误,返回-1
        
/// 需要用double,如果用single后面的位数不准确,变成0了
        
/// by JasperZhu 20101108
        
/// </summary>
        
/// <param name="sIPAddress"></param>
        
/// <returns></returns>
        
public static double GetIPFloatValue(string sIPAddress)
        {
            
double fIPValue = -1;

            
if (sIPAddress.Trim() == string.Empty) return -1;

            string
[] arrIPSec = sIPAddress.Split('.');

            
if (arrIPSec.Length != 4)
            {
                
return -1;
            }
            
else
            {
                
for (int i = 0; i < arrIPSec.Length; i++)
                {
                    
int nowIPSec = -1;
                    try { nowIPSec 
= Convert.ToInt16(arrIPSec[i]); }
                    catch { }
                    
if (nowIPSec != -1)
                    {
                        fIPValue 
+= nowIPSec * System.Math.Pow(256, (4 - i - 1)); //用表达式(256 ^ (4 - i - 1))的结果是错的; 
                    }
                    
else
                    {
                        
return -1;
                    }
                }

                
return fIPValue;
            }
        }

注意:C#中不支持直接用幂符号(^)计算表达式,应该用System.Math.Pow(x,y),如果强用计算出的是错误值。

另外,在SQL中也不支持幂符号(^)计算表达式,应该用power(x,y)。

代码
--error result
select 61*(256^3)+50*(256^2)+136*256+182
--1026721974
select 61*(power(256,3))+50*power(256,2)+136*256+182 
--值较大时
select (cast(192 as float)*power(256,3+168*power(256,2)+255*256+255)