Yıllar sonra konuyu tekrar uyandırmış olacağım. Paylaştığınız kod işime yaramışken güncel php sürümüne göre dahada iyi hale getireyim dedim.
Artıları:
Özel ve rezervli IP filtreleri kullanıldı. (FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE).
$_SERVER değişkeni şuanda,
getenv() yerine daha güvenlidir.
Dikkat: Eğer Cloudflare kullanıyorsanız
HTTP_CF_CONNECTING_IP kullanmanız gerekiyor.
function GetSecureIP() {
if (!empty($_SERVER['HTTP_CLIENT_IP']) && filter_var($_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP)) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
foreach ($ips as $ip) {
$ip = trim($ip);
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
return $ip;
}
}
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return filter_var($ip, FILTER_VALIDATE_IP) ? $ip : 'UNKNOWN';
}