PHP ile Ülke Koduna Göre Ziyaretçi IP Adresi Engelleme

IIS Web.Config ile SEO Uyumlu Domain Yönlendirme Nasıl Yapılır?
3 Ocak 2019
cPanel’de “Web Disk” Nedir, Nasıl Kullanılır?
2 Mart 2019

Oluşturduğunuz projenize birçok sebepten ötürü, ülkelerden girişleri engellemek isteyebilirsiniz. Bu en doğal hakkınız. Fakat bu işlemi .htaccess üzerinden takip etmeyi denediğinizde, ülke bazlı IP class’larının sık sık değiştiği için zamanla işe yaramadığını görebilirsiniz. Bu da sizin IP bloklarını sık sık güncellemeniz anlamını taşır. Bunun yerine daha pratik bir çözüm geliştirdik. Aşağıdaki kod bütünü sitenizi ziyaret eden IP’nin anlık sorgusunu yaparak ülke koduna ulaşıyor ve sizin yasaklı listenizde ise, ziyaretçiye 403 Engel yanıtını gönderip çalışmayı durduruyor.

Aşağıdaki satırları, index.php veya ortak kullanılan (örn: config.php gibi) PHP dosyanızın en üstüne, <?php satırının hemen altına ekleyebilirsiniz:

// ZİYARETÇİ IP'SİNİN ÜLKE KODUNA GÖRE ENGELLEME - www.domainhizmetleri.com
function ip_info($ip = NULL, $purpose = "location", $deep_detect = TRUE) {
    $output = NULL;
    if (filter_var($ip, FILTER_VALIDATE_IP) === FALSE) {
        $ip = $_SERVER["REMOTE_ADDR"];
        if ($deep_detect) {
            if (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP))
                $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
            if (filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP))
                $ip = $_SERVER['HTTP_CLIENT_IP'];
        }
    }
    $purpose    = str_replace(array("name", "\n", "\t", " ", "-", "_"), NULL, strtolower(trim($purpose)));
    $support    = array("country", "countrycode", "state", "region", "city", "location", "address");
    $continents = array(
        "AF" => "Africa",
        "AN" => "Antarctica",
        "AS" => "Asia",
        "EU" => "Europe",
        "OC" => "Australia (Oceania)",
        "NA" => "North America",
        "SA" => "South America"
    );
    if (filter_var($ip, FILTER_VALIDATE_IP) && in_array($purpose, $support)) {
        $ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip));
        if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2) {
            switch ($purpose) {
                case "location":
                    $output = array(
                        "city"           => @$ipdat->geoplugin_city,
                        "state"          => @$ipdat->geoplugin_regionName,
                        "country"        => @$ipdat->geoplugin_countryName,
                        "country_code"   => @$ipdat->geoplugin_countryCode,
                        "continent"      => @$continents[strtoupper($ipdat->geoplugin_continentCode)],
                        "continent_code" => @$ipdat->geoplugin_continentCode
                    );
                    break;
                case "address":
                    $address = array($ipdat->geoplugin_countryName);
                    if (@strlen($ipdat->geoplugin_regionName) >= 1)
                        $address[] = $ipdat->geoplugin_regionName;
                    if (@strlen($ipdat->geoplugin_city) >= 1)
                        $address[] = $ipdat->geoplugin_city;
                    $output = implode(", ", array_reverse($address));
                    break;
                case "city":
                    $output = @$ipdat->geoplugin_city;
                    break;
                case "state":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "region":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "country":
                    $output = @$ipdat->geoplugin_countryName;
                    break;
                case "countrycode":
                    $output = @$ipdat->geoplugin_countryCode;
                    break;
            }
        }
    }
    return $output;
}

// Engellenecek ülkelerin Country Kod'larını aşağıdaki array içine ekleyebilirsiniz
// 2 Harfli ISO kodlarını buradan bulabilirsiniz: https://www.nationsonline.org/oneworld/country_code_list.htm
$engelli_ulke_kodlari=array("RU"=>0, "FR"=>0, "CN"=>0, "CO"=>0);

$ziyaretci_ulke_kodu = ip_info("Visitor", "Countrycode");
if (array_key_exists($ziyaretci_ulke_kodu,$engelli_ulke_kodlari)){
  header('HTTP/1.1 403 Forbidden'); 
  echo "Forbidden Country IP! / Yasaklı Ülke IP'si";
  die();
}

// SON - ZİYARETÇİ IP'SİNİN ÜLKE KODUNA GÖRE ENGELLEME - www.domainhizmetleri.com

 

Bu makale yardımcı oldu mu?

Subscribe
Bildir
guest
6 Yorum
Newest Oldest
Inline Feedbacks
View all comments
Tevfik
1 yıl önce

Merhaba. Websiteme japonya üzerinden sürekli link geliyor ve sürekli google sıralamadan kaybolmasına sebep oluyor. düz html sayfa içine eklerken nasıl ekleme yapmamı önerirsiniz acaba?

tekzen
tekzen
8 ay önce

PHP üzeri Yurtdisi engelleme nasil kaldirilir?
Önek vereyim yurtdisindan Türkiye adresini acma nasil calisir

turgay
turgay
7 ay önce

Merhaba bu kod çok güzel ama şu şekilde ayarlıyabilirmisiniz , mesela 37.154 ve 92.235 ip bloğundan adana ve mersinden giriş yapan kişileri başka sayfaya yönlendirsin olmaz mı

Ömer
Ömer
4 ay önce

Allah razı olsun çok işime yaradı. Türkiye’yi engelledim ama kendi ip adresimi engellemek istemiyorum bunun bir yolu var mı? Bir de vpn kullananlar yine erişebiliyor vpn tespit edip engellemenin bir yolu var mıdır? Teşekkür ederim 🙂

Ömer
Ömer
4 ay önce
Reply to  Ömer

Keşke cevapta yazsanız ne güzel olurdu 🙂

Show Buttons
Hide Buttons