Genel olarak kullanıcı IP adresini tespit etmek için bu zayıf kodu kullanılır:
$_SERVER['REMOTE_ADDR']
Ancak bu kod zayıf kalacaktır ve aşağıdaki durumları oluşturacaktır:
$_SERVER['REMOTE_ADDR']
her tarayıcı ve istemcide belirlenmez. Haliyle web sitenize uğrayan bu tarz istemcilerde $_SERVER['REMOTE_ADDR']
tanımsız bir değişken olduğuna dair bir PHP hatası görülecek.
- Kullanıcı Cloudflare kullanan bir web sitesine uğradığında kullanıcının değil Cloudflare'a ait proxy sunucusunun IP adresi gözükecektir.
- Kullanıcı bir Proxy hizmeti kullanırsa kullanıcının değil Proxy sunucusuna ait bir IP adresi gözükebilir.
Daha iyi yöntem: REMOTE_ADDR
isimli header'e bakmaktan önce başta Cloudflare tarafından gönderilen HTTP_CF_CONNECTING_IP
ve proxy sunucuları tarafından genel olarak gönderilen diğer header tanımlamaları kontrol edilmelidir. Bazı proxy sunucuları kullanıcının gerçek IP adreslerini bu header tanımlamaları kullanarak iletir.
Ayrıca FILTER_VALIDATE_IP
kullanılarak verilerin bir IP adresi olup olmadığı doğrulanabilir. Ayrıca bunların hiçbiri çalışmaz ise ekranda PHP hatası göstermek yerine IP adresinin hiç yazılmamasını sağlayabiliriz.
# Get Remote Client IP address
function Client_IP(){
# Detect IP address script by hasanmerkit.
# $_SERVER Header List
$headers = array(
'HTTP_CF_CONNECTING_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_X_REAL_IP',
'HTTP_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'HTTP_REAL_IP',
'HTTP_CLUSTER_CLIENT_IP',
'FORWARDED_FOR',
'FORWARDED',
'REAL_IP',
'CLIENT_IP',
'CLUSTER_CLIENT_IP',
'CLIENTIP',
'REMOTE_ADDR'
);
# Try get IP address with cheacking headers.
foreach ($headers as $index) {
if (isset($_SERVER[$index]) && filter_var($_SERVER[$index], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
return $_SERVER[$index];
}
}
# If IP is ::1, accept this ipv6 address as 127.0.0.1.
if ( isset($_SERVER["REMOTE_ADDR"]) && $_SERVER["REMOTE_ADDR"] == "::1" ){
return "127.0.0.1";
}
# Detection failed. Return null.
return null;
}
Bu fonksiyonu aşağıdaki örnekteki gibi kullanabilirsiniz:
$ipadresi = Client_IP();
if ( $ipadresi != "" ){
echo "IP adresiniz:".$ipadresi;
} else {
echo "IP adresinizi bulamadık."
}
Kendinize iyi bakın.