$rfc1918 = array("10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"); function match_network ($nets, $ip, $first=true) { $return = false; if (!is_array ($nets)) $nets = array ($nets); foreach ($nets as $net) { $rev = (preg_match ("/^\!/", $net)) ? true : false; $net = preg_replace ("/^\!/", "", $net); $ip_arr = explode('/', $net); $net_long = ip2long($ip_arr[0]); $x = ip2long($ip_arr[1]); $mask = long2ip($x) == $ip_arr[1] ? $x : 0xffffffff << (32 - $ip_arr[1]); $ip_long = ip2long($ip); if ($rev) { if (($ip_long & $mask) == ($net_long & $mask)) return false; } else { if (($ip_long & $mask) == ($net_long & $mask)) $return = true; if ($first && $return) return true; } } return $return; } if (getenv(HTTP_X_FORWARDED_FOR)) { $ipaddress = getenv(HTTP_X_FORWARDED_FOR); if (match_network($rfc1918,$ipaddress)) { $ipaddress = getenv(REMOTE_ADDR); } } else { $ipaddress = getenv(REMOTE_ADDR); } ?>