1

IP/マスク範囲を含むファイルを読み取ろうとしていますが、指定された IP がファイル内の任意の範囲と一致する場合、TRUE または同様の関数が返されます。ここに私が持っているコードがあります

function myip2long($ip) {  
   if (is_numeric($ip)) {  
       return sprintf("%u", floatval($ip));  
   } else {  
       return sprintf("%u", floatval(ip2long($ip)));  
   }  
}

function ipfilter($ip) {  
   $match = 0;  

   $ip_addr = decbin(myip2long($ip));  

   if (file_get_contents('./countryip/all-zones/us.zone')) {  
       $source = file('./countryip/all-zones/us.zone');  

       foreach ($source as $line) {  

           $network = explode("/", $line);  
           $net_addr = decbin(myip2long($network[0]));  
           $cidr = $network[1];  

           if (substr($net_addr, 0, $cidr) == substr($ip_addr, 0, $cidr)) {  
               $match = 1;  
               break;  
           }  
       }  
   }  
   return $match;  
} 

$user_ip = $_SERVER['REMOTE_ADDR'];  

if (ipfilter($user_ip) == 1)  echo "<br />allowed! Your IP is a United States IP!";  
else echo "deny!";

サンプル ファイル (上記の例のようなもの) は、 http://www.ipdeny.com/ipblocks/data/countries/us.zoneから入手できます。

上記のコードが正しいかどうかわからないので、ここから取得しました' http://www.php.net/manual/en/function.ip2long.php#86793

4

1 に答える 1

0

何が起こっているのかを理解するために、おそらくデバッグ コードを追加する必要があります。

ちょうどこのような:

if (substr($net_addr, 0, $cidr) == substr($ip_addr, 0, $cidr)) {  
   echo "My IP: $ip\n";
   echo "IP to check: $network[0]\n";
   echo "CIDR: $cidr\n"
   echo "ip digits, my: $ip_addr, check: $net_addr\n";
   $match = 1;  
   break;  
}

それで、何がうまくいかないかがわかります。

于 2012-04-09T09:11:06.187 に答える