
PHP uygulamalarında IP adresi; güvenlik kaydı, hız sınırlama, oturum risk analizi veya bölgesel istatistik gibi amaçlarla kullanılabilir. Ancak internette sıkça paylaşılan kısa kodların önemli bir bölümü, ziyaretçinin gönderdiği HTTP başlıklarına koşulsuz güvenir. Bu yaklaşım yanlış IP kaydına ve güvenlik kontrollerinin kolayca aşılmasına yol açabilir. Sağlam çözüm, doğrudan bağlantı adresi ile güvenilir proxy bilgisini birbirinden ayırmaktır.
En temel yöntem: REMOTE_ADDR
Web sunucusunun PHP’ye aktardığı $_SERVER['REMOTE_ADDR'], isteği doğrudan gönderen bağlantı noktasının IP adresidir. Site ziyaretçisi sunucuya doğrudan bağlanıyorsa çoğu durumda aranan değer budur.
<?php
$ip = $_SERVER['REMOTE_ADDR'] ?? null;
if ($ip !== null && filter_var($ip, FILTER_VALIDATE_IP)) {
echo htmlspecialchars($ip, ENT_QUOTES, 'UTF-8');
} else {
echo 'Geçerli bir IP adresi alınamadı.';
}
FILTER_VALIDATE_IP hem IPv4 hem IPv6 adreslerini doğrulayabilir. PHP’nin filter_var() fonksiyonunda varsayılan filtrenin ham değeri değiştirmediğini unutmayın; doğrulama için filtre sabiti açıkça belirtilmelidir.
Cloudflare, CDN veya reverse proxy varsa ne olur?
Uygulamanın önünde yük dengeleyici, CDN ya da reverse proxy bulunuyorsa REMOTE_ADDR ziyaretçiyi değil bu ara sunucuyu gösterebilir. Gerçek istemci adresi genellikle X-Forwarded-For, Forwarded veya sağlayıcıya özel bir başlık üzerinden iletilir. Kritik nokta şudur: Bu başlıklar yalnızca isteğin gerçekten güvendiğiniz proxy’den geldiği doğrulandıktan sonra kullanılmalıdır.
İnternetten doğrudan gelen istekte kullanıcı kendi X-Forwarded-For başlığını yazabilir. Aşağıdaki gibi koşulsuz bir kullanım güvenli değildir:
<?php
// Güvenli değildir:
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'];
Güvenilir proxy yaklaşımı
Önce bağlantıyı yapan adresin tanımlı proxy listenizde olup olmadığını kontrol edin. Yalnızca eşleşme varsa proxy başlığını değerlendirin. Birden fazla adres içeren X-Forwarded-For zincirinin yorumlanması altyapı topolojinize göre yapılmalıdır; her zaman “ilk değer gerçektir” varsayımı doğru değildir.
<?php
$remoteAddress = $_SERVER['REMOTE_ADDR'] ?? '';
$trustedProxies = array('127.0.0.1', '10.0.0.10');
$clientIp = $remoteAddress;
if (in_array($remoteAddress, $trustedProxies, true)
&& !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$forwarded = array_map('trim', explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']));
$candidate = $forwarded[0] ?? '';
if (filter_var($candidate, FILTER_VALIDATE_IP)) {
$clientIp = $candidate;
}
}
if (!filter_var($clientIp, FILTER_VALIDATE_IP)) {
$clientIp = null;
}
Üretim ortamında proxy IP’leri elle yazmak yerine sağlayıcının güncel IP aralıklarını veya web sunucusunun güvenilir proxy özelliğini kullanmak daha doğru olabilir. Cloudflare kullanılıyorsa bağlantının Cloudflare ağından geldiğini doğrulamadan CF-Connecting-IP başlığına güvenilmemelidir.
IPv4 ve IPv6 ayrımı
Yalnızca belirli bir adres ailesini kabul etmek gerekiyorsa ek bayrak kullanılabilir:
<?php
$isIpv4 = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
$isIpv6 = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
Yeni uygulamalarda veritabanı alanı yalnızca 15 karakterlik IPv4 yapısına göre tasarlanmamalıdır. Metin olarak saklanacaksa IPv6’yı karşılayacak uzunluk seçilmeli; daha verimli depolama için veritabanının ikili IP fonksiyonları değerlendirilebilir.
IP adresi güvenlik kimliği değildir
Aynı kurumsal ağdaki yüzlerce kullanıcı tek IP’den çıkabilir; mobil ağlarda adres sık değişebilir; VPN ve proxy hizmetleri gerçek konumu gizleyebilir. Bu nedenle IP adresi tek başına kullanıcı kimliği, kesin konum veya dolandırıcılık kanıtı sayılmamalıdır. Hız sınırı gibi kontroller hesap, oturum, cihaz ve davranış sinyalleriyle desteklenmelidir.
Gizlilik ve kayıt süresi
IP adresleri kişisel veri kapsamına girebilir. Toplama amacı açık olmalı, gereksiz süreyle saklanmamalı ve erişim yetkileri sınırlandırılmalıdır. İstatistik ihtiyacında tam adres yerine anonimleştirme veya kısa süreli özet değer kullanmak daha uygun olabilir. Log dosyaları da veritabanı kadar dikkatli korunmalıdır.
Framework ve web sunucusu ayarlarını tercih edin
Laravel, Symfony ve benzeri framework’ler güvenilir proxy listesini merkezi olarak tanımlamaya imkân verir. Nginx real_ip veya Apache mod_remoteip gibi sunucu özellikleri de doğru proxy aralıkları tanımlandığında uygulamaya tutarlı adres aktarabilir. Bu katmanlardan biri doğru yapılandırılmışsa her projede farklı başlık ayrıştırma kodu yazmak yerine altyapının standart değerini kullanmak daha az hata üretir.
IP alma kodu nasıl test edilir?
- Doğrudan bağlantı, izin verilen proxy ve bilinmeyen proxy senaryolarını ayrı test edin.
- IPv4 ile birlikte sıkıştırılmış ve tam biçimli IPv6 örnekleri kullanın.
- Sahte
X-Forwarded-Forbaşlığının güvenilmeyen bağlantıda reddedildiğini doğrulayın. - Birden fazla proxy adresi içeren zinciri gerçek ağ topolojinize göre sınayın.
- Geçersiz değer geldiğinde uygulamanın hata vermeden güvenli biçimde devam ettiğini kontrol edin.
Sık yapılan hatalar
- Kullanıcı tarafından değiştirilebilen başlıklara doğrudan güvenmek
- IP değerini doğrulamadan HTML veya sorgu içinde kullanmak
- IPv6 desteğini göz ardı etmek
- Proxy zincirini altyapıyı bilmeden ilk elemana indirgemek
- IP adresini tek başına kullanıcı kimliği kabul etmek
- Toplama amacı ve saklama süresi belirlemeden loglamak
Sonuç
Doğrudan bağlantıda başlangıç noktası REMOTE_ADDR ve FILTER_VALIDATE_IP olmalıdır. Proxy başlıkları ancak güvenilir ara sunucu doğrulandıktan sonra işlenmelidir. Uygulamanın ağ mimarisi değiştiğinde IP alma kodu da yeniden gözden geçirilmelidir.
Resmî kaynak: PHP IP doğrulama örnekleri.
İçerik editörlüğü ve destek
Bu içerik İlter Web Tasarım editör ekibi tarafından bilgilendirme amacıyla hazırlanmıştır. Projenize özel değerlendirme için ekibimizle iletişime geçebilirsiniz.
Uzmanla Görüşünİlgili İçerikler
Yorum Yapabilirsiniz.
E-posta mailiniz gizli kalacaktır.*


