= $idxpart && $ip_chunk < (int) $data[0]) { return [$recnum, (int) $data[1]]; } // Store for next compare $idxpart = (int) $data[0]; $recnum = (int) $data[1]; } // Return record number found return [$recnum, -1]; } // Find the country searching from record $idx // $ip should be an IP number and not an IP address function i2c_search_in_db($ip, $idx) { // Default range and country $range_start = 0; $range_end = 0; $country = "NA"; // Open DB for reading $ipdb = fopen( $_SERVER['DOCUMENT_ROOT'] . "/backend/ip-to-country.db", "r", ); // Return with "NA" in case of we cannot open the db if (!$ipdb) { return $country; } // Jump to record $idx fseek($ipdb, ($idx[0] ? (($idx[0] - 1) * 24) : 0)); // Read records until we hit the end of the file, // or we find the range where this IP is, or we // reach the next indexed part [where the IP should // not be found, so there is no point in searching further] while (!feof($ipdb) && !($range_start <= $ip && $range_end >= $ip)) { // We had run out of the indexed region, // where we expected to find the IP if ($idx[1] != -1 && $idx[0] > $idx[1]) { $country = "NA"; break; } // Try to read record $record = fread($ipdb, 24); // Unable to read the record => error if (strlen($record) != 24) { $country = "NA"; break; } // Split the record to it's parts $range_start = (float) substr($record, 0, 10); $range_end = (float) substr($record, 10, 10); $country = substr($record, 20, 3); // Getting closer to the end of the indexed region $idx[0] += 1; } // Close datafile fclose($ipdb); // Return with the country found return $country; } // Check if the current country is valid function i2c_valid_country() { global $COUNTRY, $COUNTRIES; return (!empty($COUNTRY) && $COUNTRY != "NA" && isset($COUNTRIES[$COUNTRY])); } // Returns the real IP address of the user function i2c_realip() { // No IP found (will be overwritten by for // if any IP is found behind a firewall) $ip = false; // If HTTP_CLIENT_IP is set, then give it priority if (!empty($_SERVER["HTTP_CLIENT_IP"])) { $ip = $_SERVER["HTTP_CLIENT_IP"]; } // User is behind a proxy and check that we discard RFC1918 IP addresses // if they are behind a proxy then only figure out which IP belongs to the // user. Might not need any more hackin if there is a squid reverse proxy // infront of apache. if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { // Put the IP's into an array which we shall work with shortly. $ips = explode(", ", $_SERVER['HTTP_X_FORWARDED_FOR']); if ($ip) { array_unshift($ips, $ip); $ip = false; } for ($i = 0; $i < count($ips); $i++) { // Skip RFC 1918 IP's 10.0.0.0/8, 172.16.0.0/12 and // 192.168.0.0/16 // Also skip RFC 6598 IP's if (!preg_match('/^(?:10|100\.(?:6[4-9]|[7-9]\d|1[01]\d|12[0-7])|172\.(?:1[6-9]|2\d|3[01])|192\.168)\./', $ips[$i]) && ip2long($ips[$i])) { $ip = $ips[$i]; break; } } } // Return with the found IP or the remote address return $ip ?: $_SERVER['REMOTE_ADDR']; }