找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4810|回复: 0

转 内网的IP地址判断

[复制链接]
发表于 2008-10-27 12:21:15 | 显示全部楼层 |阅读模式
来自: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
  1. //检查是否是内部的IP地址
  2. int QQPetSecurityCheck::CheckInternalIP(const unsigned int ip_addr)
  3. {
  4.     //检查3类地址
  5.     if ((ip_addr >= 0x0A000000 && ip_addr <= 0x0AFFFFFF ) ||
  6.         (ip_addr >= 0xAC100000 && ip_addr <= 0xAC1FFFFF ) ||
  7.         (ip_addr >= 0xC0A80000 && ip_addr <= 0xC0A8FFFF )
  8.         )
  9.     {
  10.         return PET_RET::PET_RET_SUCC;
  11.     }
  12.     ACE_DEBUG((LM_ERROR,"IP[%u|%s] is not a internal IP Address.\n",
  13.         ip_addr,
  14.         zenlib::strntoa(ip_addr)));
  15.     return PET_RET::ERROR_INVALID_INTERNAL_IPADDRESS;
  16. }
复制代码



您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-24 11:17 , Processed in 0.024521 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表