php判断用户IP网上有好多方法,我今天总结出其中一种方法利用IP数据包

代码如下:

 

 
  
  1. <?php 
  2. //获取访客真实IP 
  3. function getip() 
  4.     if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) 
  5.     { 
  6.         $ip = getenv('HTTP_CLIENT_IP'); 
  7.     } 
  8.     elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) 
  9.     { 
  10.         $ip = getenv('HTTP_X_FORWARDED_FOR'); 
  11.     } 
  12.     elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) 
  13.     { 
  14.         $ip = getenv('REMOTE_ADDR'); 
  15.     } 
  16.     elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) 
  17.     { 
  18.         $ip = $_SERVER['REMOTE_ADDR']; 
  19.     } 
  20.     return preg_match("/[\d\.]{7,15}/"$ip$matches) ? $matches[0] : 'unknown'
  21.  
  22. //=================================== 
  23. // 
  24. // 功能:IP地址获取真实地址函数 
  25. // 参数:$ip - IP地址 
  26. // 作者:[Discuz!] (C) Comsenz Inc. 
  27. // 
  28. //=================================== 
  29. function convertip($ip) { 
  30.     //IP数据文件路径   注意大小写 
  31.     $dat_path = './qqwry.dat'
  32.  
  33.     //检查IP地址 
  34.     if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$"$ip)){ 
  35.         return 'IP Address Error'
  36.     } 
  37.  
  38.     //打开IP数据文件 
  39.     if(!$fd = @fopen($dat_path'rb')){ 
  40.         return 'IP date file not exists or access denied'
  41.     } 
  42.  
  43.     //分解IP进行运算,得出×××数 
  44.     $ip = explode('.'$ip); 
  45.     $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3]; 
  46.  
  47.     //获取IP数据索引开始和结束位置 
  48.     $DataBegin = fread($fd, 4); 
  49.     $DataEnd = fread($fd, 4); 
  50.     $ipbegin = implode('', unpack('L'$DataBegin)); 
  51.     if($ipbegin < 0) $ipbegin += pow(2, 32); 
  52.     $ipend = implode('', unpack('L'$DataEnd)); 
  53.     if($ipend < 0) $ipend += pow(2, 32); 
  54.     $ipAllNum = ($ipend - $ipbegin) / 7 + 1; 
  55.  
  56.     $BeginNum = 0; 
  57.     $EndNum = $ipAllNum
  58.  
  59.     //使用二分查找法从索引记录中搜索匹配的IP记录 
  60.     while($ip1num>$ipNum || $ip2num<$ipNum) { 
  61.         $Middleintval(($EndNum + $BeginNum) / 2); 
  62.  
  63.         //偏移指针到索引位置读取4个字节 
  64.         fseek($fd$ipbegin + 7 * $Middle); 
  65.         $ipData1 = fread($fd, 4); 
  66.         if(strlen($ipData1) < 4) { 
  67.             fclose($fd); 
  68.             return 'System Error'
  69.         } 
  70.         //提取出来的数据转换成长×××,如果数据是负数则加上2的32次幂 
  71.         $ip1num = implode('', unpack('L'$ipData1)); 
  72.         if($ip1num < 0) $ip1num += pow(2, 32); 
  73.  
  74.         //提取的长整型数大于我们IP地址则修改结束位置进行下一次循环 
  75.         if($ip1num > $ipNum) { 
  76.             $EndNum = $Middle
  77.             continue
  78.         } 
  79.  
  80.         //取完上一个索引后取下一个索引 
  81.         $DataSeek = fread($fd, 3); 
  82.         if(strlen($DataSeek) < 3) { 
  83.             fclose($fd); 
  84.             return 'System Error'
  85.         } 
  86.         $DataSeek = implode('', unpack('L'$DataSeek.chr(0))); 
  87.         fseek($fd$DataSeek); 
  88.         $ipData2 = fread($fd, 4); 
  89.         if(strlen($ipData2) < 4) { 
  90.             fclose($fd); 
  91.             return 'System Error'
  92.         } 
  93.         $ip2num = implode('', unpack('L'$ipData2)); 
  94.         if($ip2num < 0) $ip2num += pow(2, 32); 
  95.  
  96.         //没找到提示未知 
  97.         if($ip2num < $ipNum) { 
  98.             if($Middle == $BeginNum) { 
  99.                 fclose($fd); 
  100.                 return 'Unknown'
  101.             } 
  102.             $BeginNum = $Middle
  103.         } 
  104.     } 
  105.  
  106.     //下面的代码读晕了,没读明白,有兴趣的慢慢读 
  107.     $ipFlag = fread($fd, 1); 
  108.     if($ipFlag == chr(1)) { 
  109.         $ipSeek = fread($fd, 3); 
  110.         if(strlen($ipSeek) < 3) { 
  111.             fclose($fd); 
  112.             return 'System Error'
  113.         } 
  114.         $ipSeek = implode('', unpack('L'$ipSeek.chr(0))); 
  115.         fseek($fd$ipSeek); 
  116.         $ipFlag = fread($fd, 1); 
  117.     } 
  118.  
  119.     if($ipFlag == chr(2)) { 
  120.         $AddrSeek = fread($fd, 3); 
  121.         if(strlen($AddrSeek) < 3) { 
  122.             fclose($fd); 
  123.             return 'System Error'
  124.         } 
  125.         $ipFlag = fread($fd, 1); 
  126.         if($ipFlag == chr(2)) { 
  127.             $AddrSeek2 = fread($fd, 3); 
  128.             if(strlen($AddrSeek2) < 3) { 
  129.                 fclose($fd); 
  130.                 return 'System Error'
  131.             } 
  132.             $AddrSeek2 = implode('', unpack('L'$AddrSeek2.chr(0))); 
  133.             fseek($fd$AddrSeek2); 
  134.         } else { 
  135.             fseek($fd, -1, SEEK_CUR); 
  136.         } 
  137.  
  138.         while(($char = fread($fd, 1)) != chr(0)) 
  139.             $ipAddr2 .= $char
  140.  
  141.         $AddrSeek = implode('', unpack('L'$AddrSeek.chr(0))); 
  142.         fseek($fd$AddrSeek); 
  143.  
  144.         while(($char = fread($fd, 1)) != chr(0)) 
  145.             $ipAddr1 .= $char
  146.     } else { 
  147.         fseek($fd, -1, SEEK_CUR); 
  148.         while(($char = fread($fd, 1)) != chr(0)) 
  149.             $ipAddr1 .= $char
  150.  
  151.         $ipFlag = fread($fd, 1); 
  152.         if($ipFlag == chr(2)) { 
  153.             $AddrSeek2 = fread($fd, 3); 
  154.             if(strlen($AddrSeek2) < 3) { 
  155.                 fclose($fd); 
  156.  
  157.                 return 'System Error'
  158.             } 
  159.             $AddrSeek2 = implode('', unpack('L'$AddrSeek2.chr(0))); 
  160.             fseek($fd$AddrSeek2); 
  161.         } else { 
  162.             fseek($fd, -1, SEEK_CUR); 
  163.         } 
  164.         while(($char = fread($fd, 1)) != chr(0)){ 
  165.             $ipAddr2 .= $char
  166.         } 
  167.     } 
  168.     fclose($fd); 
  169.  
  170.     //最后做相应的替换操作后返回结果 
  171.     if(preg_match('/http/i'$ipAddr2)) { 
  172.         $ipAddr2 = ''
  173.     } 
  174.     $ipaddr = "$ipAddr1 $ipAddr2"
  175.     $ipaddr = preg_replace('/CZ88.Net/is'''$ipaddr); 
  176.     $ipaddr = preg_replace('/^s*/is'''$ipaddr); 
  177.     $ipaddr = preg_replace('/s*$/is'''$ipaddr); 
  178.     if(preg_match('/http/i'$ipaddr) || $ipaddr == '') { 
  179.         $ipaddr = 'Unknown'
  180.     } 
  181.     return $ipaddr
  182.  $ip=getip(); 
  183. $area=convertip($ip); 
  184. //IP白名单 
  185. $king_oasis_ip_array = array"127.0.0.2"
  186.                    "58.221.100.174"
  187.                    "58.221.100.170"
  188.                    "58.221.113.130"
  189.                    "58.221.140.94"
  190.                    "58.221.113.242"
  191.                    "58.221.113.238"
  192.                    "116.236.228.62"
  193.                    "116.236.164.190"
  194.                    "116.236.228.50"
  195.                    "180.169.34.226"
  196.                    "116.226.6.218"
  197.                    "116.228.216.254"
  198.                    "27.115.108.210" 
  199.                    ); 
  200.                                 
  201. if((strpos($area,'上海')!==false)&&($_SERVER['HTTP_REFERER']=='')&&(!in_array($ip$king_oasis_ip_array))) 
  202.     header('Location:403.html'); 
  203.     exit
  204. else 
  205.     header('Location:index.html'); 
  206.     echo file_get_contents('./index.html');//针对织梦等有生成静态页的,如果是wordpress,这一句和下一句不要 
  207.     exit
  208.  
  209. ?> 

限制上海地区IP访问 并通过白名单中的IP。

本地IP数据包下载 http://down.51cto.com/data/677150