Php İle Web Sitenizi Ziyaret Eden Kullanıcıların Bilgilerini Çekme

Php İle Web Sitenizi Ziyaret Eden Kullanıcıların Bilgilerini Çekme

31 Mart 2019 3 Yazar: Onur Cici

Bu Yazımızda web sitemizi ziyaret eden kullanıcıların bilgilerini kendi veri tabanımıza kaydetmeyi öğreneceğiz.

Peki bu ne işimize Yarar? , Neden Log Tutmalıyız?

Log Nedir?

Tam kelime anlamı ile seyir defterinde kayıt tutulması demektir. Bilişim terminolojisinde bir bilgisayarın gerçekleştirdiği etkinliğin kayıtlarının tutulması anlamında kullanılır. Örneğin yerel bilgisayarınız karşılaştığı tüm hata olaylarını tanım ve tarih bilgisi ile bir dosyada saklar. Ya da web sitenizi barındırdığınız sunucu, olmayan bir sayfanın çağrılması, kodda brir hata olması vb. tüm gerekçelerle oluşan hataların tanım ve tarihlerini bir dosyada tutarken, başka dosyalarda da tüm başarılı işlemleri, ya da e-posta etkinliklerinin hatalarını tutar.

Log Ne Amaçla Tutuluyor?

Loglar sayesinde sistemlerin hataları uzmanlar tarafından görülür ve düzeltilir. Saldırı ya da güvenlik riskleri görülür ve tedbir alınır. İşlemleri gerçekleştirenlerin yaptıklarından sorumlu olmaları sağlanır.

İnternet Erişim Logu Ne Amaçla Tutulmalıdır?

Herhangi bir şekilde kişi ve kişilerin İnternet erişimine imkan sağlıyorsanız, yani İnternete erişim sağlayan bir modemin sahibi iseniz, bu modemin üzerinden geçen iletişim trafiğinde işlenen bilişim suçlarından sorumlu olursunuz.

Örneğin şirketinizde sunduğunuz İnternet bağlantısı ile herhangi bir web sitesine yazılan hakaret dolu yorumu yapanın cezalandırılması talep edildiğinde IP (bilgisayarınızın/modeminizin İnternet bağlantısı sırasında aldığı tekil numara) kayıtları esas alınmaktadır. Söz konusu web sitesi yöneticileri yasa gereği, erişim loglarında suçun işlendiği IP adresini Bilişim Suçları bölümüne verecek ve bu IP adresi sizi işaret edecektir.

Bu durumda sizin de yasal olarak kabul edilen bir yöntemle, ağınızdaki hangi bilgisayardan söz konusu eylemin gerçekleştiğini kanıtlayabilmeniz gereklidir. Aksi taktirde modem sahibi olarak suçu siz işlemiş olursunuz. Çünkü 5651 sayılı kanun ve ayrıca TİB (Telekomünükasyon İletişim Başkanlığı) yönetmelikleri gereği her kurum, bu erişim kayıtlarını tutmakla yükümlüdür. Mevcut olan log kayıtlarının en az iki yıl saklanması da, ilgili yönetmelikte yer almaktadır.

 

En Basit Yöntem

 

<?php

//ipStackAPI


function location ($ip_adress){ // location Adında bir fonsiyon oluşturduk
$api_key = "cab97e7801c00776e291a1f11be00bd7"; // ipstack.com dan api key aldık
$url = "https://api.onurcici.com?api=location&ip=$ip_adress"; 
$json = file_get_contents($url);// Kullanıcının ip adresini ipstack.com a gönderdik
return json_decode($json) ;	// gelen json cıktıyı decode ederek fonksiyondan çıktı verdik
}

$ip_adress ="5.26.214.130"; // Kullanıcının İp Adresini Aldık decode edilmiş halde geldi
$data = location($ip_adress);

// echo yazan yerleri silip verileri değişkenlere atayabilirsiniz
// Örneğin.. $tip =.$data->type;   .. gibi  

echo "<br> Type : ".$data->type;
echo "<br> Kıta : ".$data->continent_name;
echo "<br> Ülke Kodu : ".$data->country_code;
echo "<br> Ülke : ".$data->country_name;
echo "<br> Plaka Kodu : ".$data->region_code;
echo "<br> Şehir : ".$data->region_name;
echo "<br> Posta Kodu : ".$data->zip;
echo "<br> Enlem : ".$data->latitude;
echo "<br> Boylam : ".$data->longitude;
echo "<br> Başkenti : ".$data->capital;
echo "<br> Dil Kodu : ".$data->languages->code;
echo "<br> Dil : ".$data->languages->native;

//Pw By OnurYazılım

 

Yukarıda aşağıdaki kodlarla uğraşmadan API Servisimiz ile Ziyaretci Bilgisi Alabilirsiniz

 

 

 

Biraz Daha Dolaylı Yollardan

İlk İşimiz Bir Veritabanı Oluşturmak kullanıcıların telefon model bilgilerini de alacağımız için model numaralarının saklandığı bir veritabanına ihtiyacımız olacak

ve bu veri tabanından ayrı olarak bir de sitemizi ziyaret eden kullanıcıların logunu tutmak icin bir veritabananına daha ihtiyacımız olacak

ben sql dosyalarını yazının sonunda paylaşacağım.

Kodlar

Çok Fazla Dosya Oluşturmadan Tüm Kodları tek bir log.php dosyasnın içine yazdım ama bu yazıda sizleri için kodları görevlerine göre bölerek anlatacağım.

$referans = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$browser = $_SERVER['HTTP_USER_AGENT'];
$tarih = date('d.m.Y');

Yukarıdaki kodda kullanıcının ziyaret ettiği url bilgisini , tarayıcı bilgisini , ve tarih bilgisini aldık aslında tarihi veritabanında da alabilirdik ama sebebini sonra anlayacaksınız ayrıca tarayıcı bilgisi bize extra olarak kullanıcının telefon model numarasını verecek bizde bu model numarasını oluşturduğumuz veritabanına sorgulatarak kullanıcının tam telefon adını bulabileceğiz.


$client  = @$_SERVER['HTTP_CLIENT_IP'];

    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];

    $remote  = @$_SERVER['REMOTE_ADDR'];

    $result  = array('country'=>'', 'city'=>'');

    if(filter_var($client, FILTER_VALIDATE_IP)){

        $ip = $client;

    }elseif(filter_var($forward, FILTER_VALIDATE_IP)){

        $ip = $forward;

    }else{

        $ip = $remote;

    }
	
	if (strlen($_POST["ipsorgula"])>=7) {
	$ip=$_POST["ipsorgula"];
	}

    $ip_data = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip));   
	//echo $ip_data; 

    if($ip_data && $ip_data->geoplugin_countryName != null){

        

        
		$sonuc['enlem'] = $ip_data->geoplugin_latitude;
		$sonuc['boylam'] = $ip_data->geoplugin_longitude;
	
bu satır
	
		$enlem=  $sonuc['enlem'];
		$boylam= $sonuc['boylam'];
		
	}

Yukarıdaki kodda ise kullanıcının ip adresini $ip değişkenine aldık ve bu ip adresini http://www.geoplugin.net adresine json sorgusu yaparak kullanıcının enlem ve boylam bilgisini aldık yukarıdaki kodda kullanıcının ülke ve şehir bilgisini de alabilirdik yalnız daha yüksek doğrulukta bir kaynak bildiğim için ben ülke ve şehir bilgisini bu sorguda çekmedim ama isteyen olursa hemen alttaki kod bloğunu “bu satır” yazan yere eklerseniz şehir ve ülke bilgisini de çekersiniz

$sonuc['ulke'] = $ip_data->geoplugin_countryCode;

$sonuc['sehir'] = $ip_data->geoplugin_city;

$ulke =  $sonuc['ulke'];

$sehir=  $sonuc['sehir'];

$site_url = file_get_contents("https://whatismyipaddress.com/ip/$ip");



function startBot($site_url , $timeout = 5)
{

    $ch = curl_init();

    $tarayici = $_SERVER['HTTP_USER_AGENT'];

    curl_setopt($ch, CURLOPT_URL,$site_url);

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1);
    curl_setopt($ch, CURLOPT_HEADER         , 0);
    curl_setopt($ch, CURLOPT_TIMEOUT        , $timeout);
    curl_setopt($ch, CURLOPT_USERAGENT      , $tarayici);

    $result = curl_exec($ch);
    curl_close($ch);

    return $result;

}

// siteden 5 sn cevap gelmezse ba




$kaynak1 = startBot("https://whatismyipaddress.com/ip/$ip");

preg_match_all('@<tr><th>ISP:</th><td>(.*?)</td></tr>@si' , $kaynak1 , $cikti1);



$dg =  "".$cikti1[1][0];




$kaynak2 = startBot("https://whatismyipaddress.com/ip/$ip");

preg_match_all('@<tr><th>City:</th><td>(.*?)</td></tr>@si' , $kaynak2 , $cikti2);



$ds =  "".$cikti2[1][0];




$kaynak3 = startBot("https://whatismyipaddress.com/ip/$ip");

preg_match_all('@<tr><th>Postal Code:</th><td>(.*?)</td></tr>@si' , $kaynak3 , $cikti3);



$dp =  "".$cikti3[1][0];

Bu yazıyı okuyan ziyaretcilerimin bir siteden elinde api veya json kaynağı olmadan bir siteden veri çekmeyi bildiğini varsayarak yazıya devam ediyorum

yukarıdaki kodumuzda https://whatismyipaddress.com/ adresini normal bir bot gibi ziyaret ettik sonra sonuna /ip/ ekleyerek ip sorgulama ekranına ulaştık

daha sonra son olarak sonuna /$ip/ ekleyerek sitemizi ziyaret eden kullanıcının ipadresini yazdırdık yani şöyle bir çıktı oldu aslında

https://whatismyipaddress.com/ip/192.168.1.1/ bu siteye böyle bir sorgu gönderirseniz site sona yazdığınınz o ip adresinin size operatör bilgisi ülke bilgisi şehir bilgisi posta kodu bilgisi gibi bilgeri ekranda bize gösteriyor peki api yok json yok bu bilgileri nasıl oradan alacağız ki ? işte burada

file_get_contents();

fonksiyonumuz devreye giriyor biz o siteye bir bot göndererek sitemizdeki kullanıcının ip adresini sorgulatıyoruz ve aşağıdaki kod ile operatör bilgisini çekiyoruz.

NOT : burada anlamadığınız yerler olacaktır yazının bu bölümünü kolayca anlayabilmek için file_get_contents(); fonksiyonu ile veri çekme araması yapabilirsiniz.

$kaynak1 = startBot("https://whatismyipaddress.com/ip/$ip");

preg_match_all('@<tr><th>ISP:</th><td>(.*?)</td></tr>@si' , $kaynak1 , $cikti1);



$dg =  "".$cikti1[1][0];

Aşağıdak kod ile de şehir bilgisini çekiyoruz

$kaynak2 = startBot("https://whatismyipaddress.com/ip/$ip");

preg_match_all('@<tr><th>City:</th><td>(.*?)</td></tr>@si' , $kaynak2 , $cikti2);



$ds =  "".$cikti2[1][0];

Aşağıdaki kod ile de posta kodu bilgisini çekiyoruz.

$kaynak3 = startBot("https://whatismyipaddress.com/ip/$ip");

preg_match_all('@<tr><th>Postal Code:</th><td>(.*?)</td></tr>@si' , $kaynak3 , $cikti3);



$dp =  "".$cikti3[1][0];

//TELEFON MODELİ SORGUSU YAPACAĞIMIZ VERİTABANI BAĞLANTISI

$servername_ = "localhost";
$database_ = "TELEFONSORGU";
$username_ = "TELEFONSORGU";
$password_ = "TELEFONSORGU";

// Create connection

$conn_ = mysqli_connect($servername_, $username_, $password_, $database_);

// Check connection

if (!$conn_) {

    die("Connection failed: " . mysqli_connect_error());

}




//İPLOGLARIN KAYIT VERŞTABANI BAĞLANTISI

$servername = "localhost";
$database = "İPLOG";
$username = "İPLOG";
$password = "İPLOG";

// Create connection

$conn = mysqli_connect($servername, $username, $password, $database);

// Check connection

if (!$conn) {

    die("Connection failed: " . mysqli_connect_error());

}

Yukarıdaki kodlarda iki veritabanımızın da bağlantısını kurduk


$sql="SELECT * FROM modeller";
$sorgu=mysqli_query($conn_,$sql);
while( $sonuc=mysqli_fetch_assoc($sorgu) ){
     $telmodelno = $sonuc["tel_modelno"]; 
     $telmodel   = $sonuc["tel_model"]; 
     $telmarka   = $sonuc["tel_marka"]; 
   

    
    if(stristr($browser, $telmodelno)) {
        
        $tel_marka = $telmodel ;

    }
    
}

Yazının başında tarayıcı bilgisini almıştık hatırlar iseniz $browser değişkineni tanımlamıştık ve tarayivi bilgisi bize telefonun model numarasını da verecekti herşey mükemmel yalnız tarayici bilgisi bize sade salt okunur model numarası vermeyecek li peki nasıl bir bilgi verecek ?

Mozilla/5.0 (Linux; Android 9; SM-G960F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36

bize yukarıdaki gibi bir çıktı verecek ama bize lazım olan yer “SM-G960F” bu kısım bu kısımı php ile cımbızla çekeceğiz nasıl mı?

if(stristr($browser, $telmodelno)) {
        
        $tel_marka = $telmodel ;

    }

yukarıdaki kodda stristr() fonksiyonu ile $browser değişkeninin içinde veritabanında olan bizim daha önceden kaydettiğimizz bir telefon modeli var ise $telmodelno fonksiyonu ile karşılaştırıyoruz ve karşılık gelen veritabanı dizinini $tel_marka değişkenine tanımlıyoruz ve böylece telefon modeli sorgusunu gerçekleştirmiş olduk ve tüm bilgileri topladık şimdi bu bilgileri veritabanına kaydedelim


$sql_="SELECT * FROM loglar";
$sorgu_=mysqli_query($conn,$sql_);
while( $sonuc_=mysqli_fetch_assoc($sorgu_) ){
     $ipadresss = $sonuc_["log_ip"]; 
     $refer = $sonuc_["log_referans"]; 

}

öncelikle yukarıdaki bilgileri iplogların tutulduğu veritabanından çektik çünkü filtreleme için kullanacağız filtrelemeden kastım bir kullanıcı aynı sayfada sayfa yenileme işlemi yaparsa ikinci kez kayıt oluşmasın. ama bu filtrelemeyi aşağıdaki kodda yapacağız yukardaki kodda sadece lazım olan bilgileri veritabanından çektik.

$sql = "INSERT INTO loglar (log_ip, log_tarayici, log_referans, log_ulke, log_sehir, log_enlem, log_boylam, log_telmodel,log_tarih, log_isp, log_postakod) VALUES


('$ip','$browser','$referans','$ulke','$ds','$enlem','$boylam','$tel_marka',
'$tarih','$dg','$dp')";


 if(stristr($ipadresss, $ip)  && stristr($referans, $refer) && empty($tel_marka) && empty($ulke) && empty($ds)){
    
    
}else{

if (mysqli_query($conn, $sql)) {
      
} else {
      echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
mysqli_close($conn);


}

yukarıdaki kodda hepinizin bildiğini varsaydığım veritabanına veri ekleme kodları mevcut bilmeyen arkadaşlarımız Php ile Mysql Veritabanına Kayıt Ekleme (mysqli)

adlı yazımıza göz atabilirler. Şimdi yukarıda dikkat edilmesi gereken kısım

 if(stristr($ipadresss, $ip)  && stristr($referans, $refer) && empty($tel_marka) && empty($ulke) && empty($ds)){
    
    
}else{

hemen üstte verdiğim kısım burada kullanıcıların kayıtları defalarca tutulmasın diye filtreleme yapan kısım yani kullanıcı a sayfasına gitti kayıt alındı sonra b sayfasına gitii kayıt yine alındı sonra kullanıcı tekrar a sayfasına döndü kayıt tekrar alınmasın anlamında. empty() fonksiyonunun içinde bulunnan değişkenlerin orada olma sebebi ise eğer kullanıcının sehrini veya tel markasını veya ulke ismini alamazsam da kayıt etme anlamında siz isterseniz o kısımları silerek de işlem yapabilirsiniz.


Yazımız bun kadar arkadaşlar Aşağıda kodların çalışır halini paylaştım beğenip yorum yapmanızı isterim sorularınız olursa yorumdan yazabilirsiniz.

DOSYALAR = [İNDİR]