MENÜ

Güvenilir Cookie Kullanım Örneği

1345 defa okundu 2 defa yorumlandı kategorisinde, tarihinde yayınlandı
Güvenilir Cookie Kullanım Örneği

Bilindiği üzere çerezler üzerinde oynama yapılarak kullanıcı bilgilerine erişim yapılması söz konusu, öncelikle tavsiye edeceğim en önemli şey çerezlerin içerisine kesinlikle kullanıcıya ait bir veri girmeyin (özellikle şifre) ancak çerez üzerindeki veri ile hangi kullanıcı olduğunu bulmamız gerekiyor bunun için kullanıcının kendisinin göremeyeceği ve her kullanıcıda farklı olan bir değer kullanabilirsiniz, ben örnek uygulamada bu değeri kullanıcının id değeri olarak gösterdim eğer kullanıcılar sistem üzerinde id değerine göre kullanıcıları tespit edemeyecekse ve bu bilgi kullanıcının adres satırı dahil hiçbir bölümünde gösterilmiyorsa kullanılabilir.

Örnek uygulamamızda ikili çerez kullanılmış ve bunlardan bir tanesi her kullanıcıda benzersiz olan bir id değerini tutmakta diğeri ise her kullanıcı için kullanacağımız oturum değerini tutmakta olacaktır ve oturum değeri her defasında rastgele oluşacak bir değer olmalıdır, yani tahmin edilememeli ve herhangi bir düzene bağlı olmamalıdır.

Her üye giriş kontrolünde çerezlerin geçerliliği sorgusu doğru ise her iki çerezi birbiri ile sql tablomuzdaki veri üzerinden karşılaştırmamız yeterli olacaktır. Yani çerezlerimiz üzerinde oynayacak olan kişi üyenin idsine erişip o id ye ait bir çerez oluştursa bile o üyenin oturumverisini sakladığımız diğer çerez üzerindeki veriyi bulamayacaktır. Ancak çerez süresi geçmemiş bir çerezin kullanılması durumunda bu güvenlik önlemi aşılabilir buda çıkış yapılmamış bir bilgisayarı çerez süresi içerisinde bir başkasının kullanması yada truva atları ile mümkün olabilir ve işin bu kısmı kullanıcının kendi güvenliğini sağlama zorunluluğu ile alakalıdır. Bizim amacımız sisteme direk olarak sızmak isteyenlere karşı önemlem almaktır.

İlk olarak örneğimizi çalıştıracak basit bir sql tablosu oluşturalım

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE IF NOT EXISTS `kullanici` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `kullanici` VARCHAR(100) NOT NULL,
  `parola` VARCHAR(100) NOT NULL,
  `oturumverisi` VARCHAR(225) NOT NULL,
  `oturumsonlanma` INT(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
 
INSERT INTO `kullanici` (`id`, `kullanici`, `parola`, `oturumverisi`, `oturumsonlanma`) VALUES
(1, 'admin', '8cb2237d0679ca88db6464eac60da96345513964', '0', 0);

Basit bir şekilde kullanıcı adı ve şifremizi tutan ve uygulamamız için gerekli oturum verisi ve sonlanma süresi ekleyeceğimiz birer alan barındırın tablomuzu bu şekilde oluşturalım. Sql bağlantısı yapacağımız bir dosyaya ihtiyacımız olacak (her sayfa başında bu işlemi tekrar tekrar yapmamak için bir tane dosyayı include etmemiz daha kolay olacaktır.)

1
2
3
4
5
6
7
8
9
<?php
	$dbhost = "localhost";
	$dbveritabani = "demo";	//veritabanı adımız
	$dbkullanici = "demo"; //veritabanı kullanıcı adı
	$dbsifre = "123456"; //veritabanı kullanıcı şifresi
	$baglan = mysql_connect($dbhost,$dbkullanici,$dbsifre);
	if(!$baglan) die ("Mysql Sunucu Bağlantısı Kurulamıyor");
	mysql_select_db($dbveritabani,$baglan) or die ("Veritabanına Bağlanamadı");
?>

Bir adet giriş dosyası yapalım

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
<?php
$kullanici = $_POST['kullanici']; //post ile gönderilen üye adı
$parola = $_POST['parola']; //post ile gönderilen parola
if($kullanici && $parola) //kullanıcı adı ve parola girilmiş ise
{
	include("baglan.php"); //mysql bağlantı dosyamızı çağıralım
	$parola = sha1($parola); //üyenin giriş yaptığı parolayı veritabanında kaydedildiği şekilde şifreliyoruz bunun amacı karşılaştırma yapılacak olmasıdır
	$oku = mysql_query("SELECT * FROM kullanici WHERE kullanici='$kullanici' and parola='$parola'"); //gelen kullanıcı adı ve parola ile üyenin varolup olmadığını kontrol edelim
	$uyevarmi = mysql_num_rows($oku); // verilen bilgiler ile üye olup olmadığını sorgunun kaç satır kapsadığını sorgulayarak bir değişkene atayalım
	if($uyevarmi == 0) {
		$hata = "Giriş Bilgileri ile Uyuşan Üye Bulunmamaktadır."; //üye yok ise hata gösterelim
	}
	else
	{	
		$uye = mysql_fetch_array($oku); // okunan satırdaki verileri bir dizi(array) ye aktarıyoruz
		$id = $uye['id']; //üyemizin id sini alıyoruz
		$oturumverisi = sha1(time() * rand(1,100)); //rastgele ve karışık bir veriyi oturum kontrolü için kullanacağız bunu şifrelememizdeki asıl amaç karışık görünmesini sağlamaktır çözülmesi hiçbişey ifade etmeyecektir.
		$oturumsonlanma = time()+36000; //oturum sonlanma zamanı çift taraflı kontrol edilecek
		mysql_query("UPDATE kullanici SET oturumverisi='$oturumverisi', oturumsonlanma='$oturumsonlanma' WHERE id='$id'"); //kullanıcının oturum bilgilerini veritabanına kaydediyoruz		
		setcookie("uyeoturumu", $oturumverisi, time()+36000); //çerezimizi oluşturup kullanıcıya gönderiyoruz
		setcookie("uye", $id, time()+36000); //üyemizin id bilgisini tuttuğumuz çerezimizide oluşturalım
		echo "<script>location.href='index.php';</script>"; //artık giriş yaptığımıza göre kullanıcıyı yönlendiriyoruz
	}
 
}elseif($kullanici) //sadece kullanıcı adı girilmiş ise
{
	$hata = "Parola Girmediniz";
}
?>
<?php
if($hata) echo $hata . '<br />';
?>
<form action="" method="post">
	Kullanıcı Adı : <input type="text" name="kullanici"><br />
	Parola : <input type="text" name="parola"><br />
	<input type="submit" value="Giriş">
</form>

Giriş dosyamız ile kullanıcının kullanıcı adı ve şifresini girmesinin ardından o kullanıcıya bir oturum verisi oluşturduk (rastgele bir veri) ve oturum sonlanma süresini belirledik bu verileri hem çerezine hemde sql tablosuna ekledik bu verileri her iki yere yazmamızın nedenini kontrol dosyamızda daha iyi anlayacaksınız.

Giriş yaptığımızda yönleneceğimiz basit bir index sayfası yapalım

1
2
3
4
5
<?php
include("baglan.php");
include("kontrol.php");
echo 'Giriş Yaptınız<br /><a href="cikis.php">Çıkış Yap</a>';
?>

İndex sayfamıza her ne şekilde erişilirse erişilsin ilk olarak üyenin giriş yapıp yapmadığını kontrol etmemiz amacıyla kodların en başında kontrol yaptıracağımız dosyamızı include etmeliyiz.

Kontrol dosyamızı oluşturalım.

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
39
40
41
42
43
<?php
if (isset($_COOKIE["uyeoturumu"])) //oturum verisini tutan çerez mevcutmu
{
	 $uyeoturumu = $_COOKIE["uyeoturumu"]; //oturum verisini bir değişkene atayalım
	 $id = $_COOKIE["uye"]; //id verisini bir değişkene atayalım
	 include("baglan.php"); //mysql bağlantı dosyamızı çağıralım
	 $oku = mysql_query("SELECT * FROM kullanici WHERE id='$id' and oturumverisi='$uyeoturumu'"); //çerez bilgileri ile uyuşan üyeyi seçiyoruz
	 $uyevarmi = mysql_num_rows($oku); //böyle bir üye varmı
	 if($uyevarmi == 0) { //çerezlerde bulunan üye yok ise
		setcookie ("uyeoturumu", $uyeoturumu, time()-99999); //hatalı çerezlerden kurtulalım
	    setcookie ("uye", $id, time()-99999); //hatalı çerezlerden kurtulalım
		echo "<script>location.href='giris.php';</script>";
		die();
	 }
	 else //çerezlerde bulunan üye mevcut ise
	 {
		$uye = mysql_fetch_array($oku); //üye bilgilerini bir array içine atayalım
		$oturumsonlanma = $uye['oturumsonlanma']; //sql tablosunda oturumun sonlanacağı zamanı bululaım
		if($oturumsonlanma < time()) //eğer tablomuzda oturumun sonlanacağı zamanı geçmiş isek
		{
			setcookie ("uyeoturumu", $id, time()-99999); //eski çerezlerden kurtulalım
			setcookie ("uye", $id, time()-99999); //eski çerezlerden kurtulalım
			echo "<script>location.href='giris.php';</script>";
			die();
		}
		else //eğer çerezlerimiz halen güncel ise
		{
			setcookie("uyeoturumu", $uyeoturumu, time()+36000); //çerezlerimizin süresini bir çerez süresi kadar daha uzatalım
			setcookie("uye", $id, time()+36000); //çerezlerimizin süresini bir çerez süresi kadar daha uzatalım
			$sonlanma = time()+36000; //çerez süremiz
			mysql_query("UPDATE kullanici SET oturumsonlanma='$sonlanma' WHERE id='$id'"); //çerez sonlanma süremizi sql tablomuzdan uzatalım
			/* Burada oturum sonlanma süresinin uzatılmasındaki amaç
			eğer kullanıcı bu alana girebiliyor ise oturumu devam ettiriyor demektir
			siz eğer çerez süresini 3 günlük tanımlamışsanız ve kullanıcı hergün giriş yapıyor ise
			3 günde bir şifre girmesine gerek yoktur. Bu şahsi bir düşünce tabiki siz bu işlemi yaptırmayabilirsiniz */
		}
	 }
}
else //oturum verisini tutan çerez yok ise
{
	echo "<script>location.href='giris.php';</script>"; //çerez yok ise giriş sayfasına yönlendiriyoruz
}
?>

İlk bakışta biraz karışık gelebilir ancak temelde çok basit bir şekilde çerezlerimizin varlığını kontrol eden var ise çerez üzerinden kullanı id sini ve oturum verisini okuyan kontrol dosyamız bu oturum verisinin kullanıcı oturum verisi olup olmadığını sql üzerinden sorguluyor ve eğer bu veriler uyuşuyorsa bile sürenin aşıp aşmadığını yine sql den sorgulayarak kontrol ediyor sonuçta mevcut çerezin süresi uzatılabilir ve bu uzatma sitemiz tarafından yapılmamış ise buraya kadar gelen tüm engelleri aşacaktır ancak sonlanma süresi sql dosyasında sistemin son uzattığı tarih olacağı için bu tarih geçmiş ise yine giriş yapılmamış veya oturum sonlandırılmış sayılacaktır.

Ve bir adette olmazsa olmaz oturum kapatma dosyası oluşturup örneğimizi tamamlayalım

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
if (isset($_COOKIE["uyeoturumu"])) //çerez mevcut ise
{
	 include("baglan.php"); //mysql bağlantı dosyamızı çağıralım
	 $uyeoturumu = $_COOKIE["uyeoturumu"];
	 $id = $_COOKIE["uye"];
     setcookie ("uyeoturumu", $uyeoturumu, time()-99999); //çerezlerimizin geçerlilik süresini kaldırıyoruz
	 setcookie ("uye", $id, time()-99999); //çerezlerimizin geçerlilik süresini kaldırıyoruz
	 mysql_query("UPDATE kullanici SET oturumverisi=0, oturumsonlanma=0 WHERE id='$id'"); //kullanıcının oturum bilgilerini veritabanından siliyoruz
     echo "<script>location.href='giris.php';</script>"; //giriş sayfasına geri yönlendirelim
}
else //çerez zaten yok ise
{
	echo "<script>location.href='giris.php';</script>";
}
?>

Örneğimiz tek başına basit bir yazılım için güvenli oturum uygulaması olarak gösterilebilir ancak uygulamamız karıştıkça ve büyüdükçe kontrol yaptıramayacağımız alanlarda oluşacaktır. Çerezler hiçbir zaman %100 güvenilir olarak adlandırılamaz, en büyük güvenlik önlemi kullanıcının bilinçli hareket etmesidir.

Şimdilik bu örneğimizi sonlandırıyoruz farklı örnek uygulamalarda tekrar görüşeceğiz.
Ahmet YEŞERTENER

Yorum Yaz
2 Yorum
  • aykoCevapla

    Bilgileriniz Cok Isime Yaradi Tskr ederim
    bi de sifreyi soylerseniz tam olucak 🙂
    md5 çözemedm

    Oca 12, 2013 04:20
    • AhmetCevapla

      Aradan zaman geçti bende hatırlayamıyorum ama büyük ihtimalle 12345 ‘tir.

      Mar 18, 2013 01:40