pillinetwork hesabınızla giriş yapın.

PHP ile ziyaretçi bilgilerini tespit etmek

PHP'yle sitenizi ziyaret eden kullanıcı hakkında envai çeşit bilgiye hasıl ulaşabileceğiniz ile ilgili bir yazı hazırladım. Envai çeşitten kastım, IP adresinden sunucu protokolüne kadar istemcinin sunucuya gönderdiği çeşitli bilgiler. Görelim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
echo "IP adresi: " . $REMOTE_ADDR . "<br />";
echo "Uzak host: " . gethostbyaddr($_SERVER['REMOTE_ADDR']) . "<br />";
echo "Web tarayıcısı: " . $HTTP_USER_AGENT . "<br />";
echo "Referans adresi: " . $HTTP_REFERER . "<br />";
echo "Kullanıcının dilleri: " . $_SERVER['HTTP_ACCEPT_LANGUAGE'] . "<br />";
echo "sıkıştırma isteği: " . $_SERVER['HTTP_ACCEPT_ENCODING'] . "<br />";
echo "Sunucu protokolü: " . $_SERVER['SERVER_PROTOCOL'] . "<br />";
echo "HTTP bağlantısı: " . $HTTP_CONNECTION . "<br />";
echo "Karakter seti: " . $_SERVER['HTTP_ACCEPT_CHARSET'] . "<br />";
echo "Kabul: " . $HTTP_ACCEPT . "<br />";
echo "İstek metodu: " . $_SERVER['REQUEST_METHOD'] . "<br />";
echo "Uzak port: " . $REMOTE_PORT . "<br />";
echo "HTTP_VIA (proxy sağlayıcısı): " . $HTTP_VIA . "<br />";
echo "Gerçek IP (proxy üzerinden isen): " . $HTTP_X_FORWARDED_FOR . "<br />";
echo "Çerezler: " . $HTTP_COOKIE . "<br />";
?>

Açıklama:
Uzak host; IP adresinin alan adını görebilirsiniz, örneğin 144.122.250.220 IP'sinin alan adı y22-27.pclabs.metu.edu.tr, böylece ziyaretçinin hangi bilgisayarı kullandığını ya da hangi domain'de olduğunu öğrenebiliyoruz. Ya da bir web sitesi, dolayısıylşla gerçek ziyaretçi mi yoksa bot mu olduğu fikrine de ulaşabiliriz.
Web tarayıcısı; web tarayıcısının tam çözümü. Örneğin Firefox 3.0.8'inkisi şöyle: Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8
Referans adresi; sayfaya hangi adresten geldiğiniz.
Kullanıcının dilleri; kullanıcının kendi tarayıcısında belirttiği diller.
Sıkıştırma isteği; tarayıcı web sayfasının sıkıştırılmış halini istiyorsa burada belirtir. Uzun yıllardır tüm tarayıcılar böyle bir istekte bulunurlar (gzip isteği), amaç ağ trafiğini düşürmek. Google haricindeki botlar böyle bir istekte bulunmazlar, bu bilgiden yola ziyaretçinin bot olup olmadığını anlayabilirsiniz. Ayrıntılı bilgi için Kodaman'daki gzip yazısını okuyabilirsiniz.
Sunucu protokolü, web tarayıcıları HTTP/1.1 sunucu protokolüyle iletişim kurmak istediklerini belirtirler, oysa Google haricindeki birçok bot (web proxy'ler dahil) HTTP/1.0 protokolünü kullanır. Bu da insan ziyaretçiler ile bot ziyaretçileri birbirinden ayırt etmek için kullanılabilir.
HTTP bağlantısı; bağlantı süresiyle ilgili bilgi, web tarayıcıları (en azından Firefox-Apache ikilisi) keep-alive'ı tercih ediyor. bir web proxy yazılımında denediğimde bu kısmın boş olduğunu farkettim.
İstek metodu ya da istek yöntemi; Genellikle GET (normal istek metodu), form'lardan bilgi gönderirken POST.
HTTP_VIA; eğer proxy üzerinden bağlanıyorsanız ve proxy de kendisini tanıtıyorsa burada proxy'yle ilgili bilgi bulunuyor, örneğin; 1.1 www.cc.metu.edu.tr:2003 (squid). Bunlar genellikle vekil sunucuların bulunduğu büyük kuruluşlarda olur ve yararlanmak için tarayıcıdan küçük bir ayar yapılması gerekir. Örneğin Firefox'ta bağlantı ayarlarından vekil sunucu ayarlarını otomatik tanı seçeneğinin işaretlenmesi gerekiyor.
Gerçek IP; proxy gerçek IP'nizi buradan bildiriyor.
Çerezler; sunucumuzdan tarayıcıya çerez bıraktıysak buradan görebiliriz.

Tabii, bu bilgileri veritabanında saklamak yerine mail olarak gmail'de de saklayabilirsiniz. En azından veri tabanınızı oluşturana kadar. Bunun için hazırladığım kod burada:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
$A = $REMOTE_ADDR;
$B = gethostbyaddr($_SERVER['REMOTE_ADDR']);
$C = $HTTP_USER_AGENT;
$D = $HTTP_REFERER;
$E = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$F = $_SERVER['HTTP_ACCEPT_ENCODING'];
$G = $SERVER_PROTOCOL;
$H = $HTTP_CONNECTION;
$I = $_SERVER['HTTP_ACCEPT_CHARSET'];
$J = $HTTP_ACCEPT;
$K = $_SERVER['REQUEST_METHOD'];
$L = $REMOTE_PORT;
$M = $HTTP_VIA;
$N = $HTTP_X_FORWARDED_FOR;
$O = $HTTP_COOKIE;
$body .= "$A\n";
$body .= "Uzak host: $B\n";
$body .= "Web tarayıcısı: $C\n";
$body .= "Referans adresi: $D\n";
$body .= "Kullanıcının dilleri: $E\n";
$body .= "Sıkıştırma isteği: $F\n";
$body .= "Sunucu protokolü: $G\n";
$body .= "HTTP bağlantısı: $HN\n";
$body .= "Karakter seti: $I\n";
$body .= "Kabul: $J\n";
$body .= "İstek metodu: $K\n";
$body .= "Uzak port: $L\n";
$body .= "HTTP_VIA (proxy sağlayıcısı): $M\n";
$body .= "Gerçek IP (proxy üzerinden isen): $N\n";
$body .= "Çerezler: $O\n";
$alici = "Alıcı Adı <alici@example.com>\n";
$konu = "Bişey ziyarette bulundu\n";
$headers = "From: Gönderen Adı <gonderen@example.com>\r\n";
mail ($alici, $konu, $body, $headers);
?>

Not: Bazıları sunucu ayarlarına ya da PHP sürümüne bağlı olarak çalışmayabilir.

Hazırladığım demoya buradan ulaşabilirsiniz.

/* darkhorn yazdı. 20 Nisan 2009 13:15. 9 yorum var */

Yorumlar

çok azmış php'de.. asp'de bir sürü metadata alabiliyoruz. sertifika_key den script adına kadar bir dolu metod var.. Hepsi bu kadar mı?

/* if life="" then call BatsinBuDunya() */

register_globals artık kalkıyor elinizi şu $HTTP_REFERER alışkanlıklarınızdan kurtarın yahu. $_SERVER['HTTP_REFERER'] olarak kullanın..

Verdiğiniz bu kod register_globals ayarı Off olan sunucularda hiç bir halt yapmaz.

@lazaronnie, ama asp öldü, bir de maalesef linux-freebsd gibi sistemlerde çalışmıyor, ki bunlar bildiğin gibi daha ucuz sistemler.
bu arada sertifika_key, scrip kodu adı bunlar noluyor? bunlarla ilgili bilgi alabileceğim kaynak var mı?

@darkhorn asp ölmedi bu birincisi.
ikinci olarak mağlesef değil "maalesef" demek gerekiyor.
son olarak w3school.com sitesinden faydalanabilirsin.

/* if life="" then call BatsinBuDunya() */

@lazaronnie, ölmedi diyorsun da monster.com.tr'de arattım monster.co.uk de de arttım, asp bilen aranmıyorlar. bir tane bile bulamadım ki bulsam anca yüzlerce iş ilanından anca bir-iki tane çıkardı.
burda dediğine göre de asp ölmüş ve kullanıcılardan alternatif dillere yönelmeleri isteniyor.
http://www.sun.com/software/chilisoft/

:)) tartıştığın şeye bak. onlar ölüm ölçüsü mü sence?

/* if life="" then call BatsinBuDunya() */

asp ölmez ölemez:D

ktunnel üzerinden demo adresine giriş yaptım. $HTTP_X_FORWARDED_FOR değişkeni işe yaramıyor. yanlış bir beklenti içerisinde miyim? çalışması gerekmez miydi? link

@nacres_, bildiğimiz web proxy'ler değil, squid benzeri proxy'ler...

üye olunpillinetwork sitelerine yorum ekleyebilmek ve daha fazlası için, üye olun ya da giriş yapın.

Bu yazıyı rapor et. Kural dışı içeriğe rastladığınızda editörlerimize rapor ederek müdahale edilmesini sağlayabilirsiniz. (Hangi durumlarda rapor edebilirim?)

Bu site

Nokta ve pilli ortak yapımı olan kodaman.org hep birlikte içerik üretip gelirini yazarları ile paylaştığımız kolektif bir kod yazarları blogudur. Siz de katılabilirsiniz.

pilliilan

son yorumlar

arama

pillinetwork