winston 发表于 2008-10-27 12:21:15

转 内网的IP地址判断

来自:http://blog.csdn.net/fullsail/archive/2008/10/17/3088136.aspx
谢谢博主授权转载。
分布式系统的设计中,经常要判断一个请求是否来自于内外还是外网,如果外网用户使用了内网的请求往往会发生恐怖的事情。
对企业网的IP分配一般以RFC1918中定义的非Internet连接的网络地址,
也称为私有地址。由Internet地址授权机构(IANA)控制的IP地址分配方案中,
留出了三类网络地址,给不连到Internet上的专用网使用。它分别是:
A类:10.0.0.0 ~ 10.255.255.255;
B类:172.16.0.0 ~ 172.31.255.255;
C类:192.168.0.0 ~ 192.168.255.255。
其中的一个私有地址网段是:192.168.0.0是我们在内网IP分配中最常用的网段。IANA保证这些网络号不会分配给连到Internet上的任何网络,因此任何人都可以自由地选择这些网络地址作为自己的私有网络地址。在申请的合法IP不足的情况下,企业网内网可以采用私有IP地址的网络地址分配方案;企业网外网接入、DMZ区使用合法IP地址。
根据这些特性,我们可以在代码中间检查请求的IP地址是否是内网来保证安全。增加了一个函数CheckInternalIP。


//检查是否是内部的IP地址
int QQPetSecurityCheck::CheckInternalIP(const unsigned int ip_addr)
{
    //检查3类地址
    if ((ip_addr >= 0x0A000000 && ip_addr <= 0x0AFFFFFF ) ||
      (ip_addr >= 0xAC100000 && ip_addr <= 0xAC1FFFFF ) ||
      (ip_addr >= 0xC0A80000 && ip_addr <= 0xC0A8FFFF )
      )
    {
      return PET_RET::PET_RET_SUCC;
    }

    ACE_DEBUG((LM_ERROR,"IP[%u|%s] is not a internal IP Address.\n",
      ip_addr,
      zenlib::strntoa(ip_addr)));
    return PET_RET::ERROR_INVALID_INTERNAL_IPADDRESS;
}



页: [1]
查看完整版本: 转 内网的IP地址判断