PHP cookie kullanımı ile site içerisinde kullanıcı deneyimini arttırmak ve site kullanımını kolaylaştırmak amaçlanır ve kullanıcının bilgisayarında gerekli bilgilerin dosya şeklinde saklanması, okunması ve silinmesi şeklinde gerçekleşir. Cookie oluşturma, okuma ve silme işlemleri bu sürecin genel tanımlamalarıdır.
Cookie (Çerezler) tarayıcı üzerinden ziyaretçilerin bilgisayarlarında bilgi saklamak için yüklenen ve daha sonra bu bilgileri kullanıcı siteyi ziyaret ettikçe kullanılan en fazla 4 KB yer kaplayan dosyalardır.
Kullanıcının siteyi tekrar ziyaret ettiğinde bazı işlemlerin tekrar uygulanmasına gerek duyulmamasını sağlayarak kullanıcı bilgilerinin hatırlanmasını sağlamak, kullanıcının siteyi kullanmasını kolaylaştırmak veya kullanıcıya kişiselleştirilmiş seçenekler sunmak için kullanılabilirler. Kullanıcı girişi, beni hatırla uygulaması, tema seçimi, çoklu dil desteği, e ticaret sepet uygulaması, uygun reklamların gösterimi gibi uygulamalar cookie kullanımına örnek verilebilir.
Ancak çerez kullanımı ile birlikte bazı güvenlik konularına da dikkat etmek gerekir. Mesela GET ve POST işlemleri yapılırken nasıl ki şifreleme ve filtreleme şeklinde güvenlik önlemlerinin alınması gerekiyorsa hem javascript tarafında hem sunucu tarafında cookie oluşturma ve okuma işlemlerinde güvenlik önlemlerinin alınması gerekir.
Bu arada javascript ve PHP cookie kullanımı konularını ayrı sayfalar halinde anlatmayı daha uygun gördüm. Javascript üzerinde cookie oluşturma işleminin nasıl yapılacağıyla ilgileniyorsanız ayrıntılı ve basit bir şekilde bahsettiğim javascript cookie kullanımı konulu içeriğime göz atabilirsiniz.
İlk olarak oluşturma, okuma ve silme gibi PHP çerez kullanımı konularının nasıl yapılacağını ve püf noktalarına bakalım.
PHP Cookie Oluşturma, Okuma ve Silme
PHP setcookie kullanımı ile cookie oluşturma işlemi gerçekleştirilir. Alacağı parametreler aşağıdaki gibidir. Bu parametreler arasında sadece isim ve value kullanarak cookie oluşturma işlemi yapılabilir.
setcookie($name, $value, $time, $path, $domain, $secure, $just_http)
- $name : Cookie’nin ismidir. Cookie bu isim üzerine çağırılır.
- $value : Cookie değeridir.
- $time : Tarayıcı üzerinde aktif olacağı saniye cinsinden tutulan cookie süresidir. Bir değer verilmez ise tarayıcı kapandığında cookie silinir, tarayıcı açık kaldığı süre içerisinde aktif olur. Zaman değeri, şu anki zaman + aktif olacağı süre şeklinde verilebilir. (örnek: time() + 60 //60 saniye)
- $path : Sitede hangi dizin içerisinde çalışması gerektiğini belirtir. Bütün sitede aktif olunması istenir ise ” / ” değeri girilir.
- $domain : Cookie’nin çalıştığı site içerisinde hangi alt domain üzerinde çalışacağını belirtir. Yazılmaz ise çalıştığı sitedeki ana domain baz alınır, tüm site üzerinde etkili olur.
- $secure : True olarak aktif edilir ise sadece HTTPS bağlantılarda PHP çerez kullanımı gerçekleşir. Cookie güvenliği arttırma işlemi için kullanılır. Çerez bilgisi sadece https bağlantısı ile alınacağı belirtilir.
- $just_http : True olarak kullanımı aktif edilir ise cookie sadece sunucu üzerinden erişilebilir olacaktır. Javascript ile tarayıcı üzerinde cookie düzenlenemeyecektir.
Yukarıdaki parametrelere göre PHP setcookie kullanımı ile çerez oluşturma yöntemleri aşağıdaki gibidir.
setcookie('Cookie_Adlandirma', 'cookie_deger, time() + (60*5) , '/', 'muhammedyaman.com', true, true);
// Cookie_Adlandirma isminde, cookie_deger içeriğine sahip 5 dakika (300 saniye) tarayıda aktif olacak, tüm yollarda, dizinlerde etkili, muhammedyaman.com alan adının tüm alt domainlerinde etkili, sadece https bağlantılar üzerinden okunabilen, sadece http protokolü üzerinden erişimi olan, sunucu üzerinden değiştirilebilen bir cookie oluşturmuş oluyoruz.
setcookie('Cookie_Isim', 'cookie_deger', time() + (60*5) , '/');
setcookie('Cookie_Isim', 'cookie_deger', time() + (60*5));
setcookie('Cookie_Isim', 'cookie_deger'); //tarayıcı kapandığında silinir
Cookie silme işlemi cookie oluşturma işlemi ile birebir aynı. Tek fark, setcookie fonksiyonuna şu an ki zamandan ileri bir tarih vermek yerine geçmiş bir zaman değeri girmemiz gerektiğidir. Aşağıdaki örnekte olduğu gibi şu anki zamandan 1 saniye öncesini ifade eden time() – 1 değerini girerek çerezi silebiliriz.
setcookie('Cookie_Isim', '_', time() - 1); //′Cookie_Isim′ isimli çerezi sil
PHP cookie okuma işlemi de aşağıdaki gibidir.
$_COOKIE['Cookie_Isim'] //’Cookie_Isim’ isimli çerezin değerini al
PHP cookie kullanımı genel itibarıyle bu şekilde. Şimdi çerezleri daha güvenilir bir şekilde nasıl kullanabileceğimize değinelim.
PHP Cookie Güvenliği
PHP cookie güvenliği yukarıda setcookie fonksiyonunun kullanımında görüldüğü gibi sondan 2 parametrelerini (sadece HTTPS bağlantılarda çalışması ve sadece sunucu üzerinden müdahale edilebilmesi) kullanmakla başlar. Diğer yandan, cookie ismi ve içeriği açıkça tarayıcıyı kullanan kişi tarafından görülüyor. Bu veriler eğer önemli ise PHP cookie kullanımı sırasında verilerin encrypt-decrypt yani şifreleme ve çözme yöntemi ile saklanması ve parametrelerdeki güvenlik önlemleriyle birlikte kullanılması tavsiye edilir.
PHP’de şifreleme ve çözme fonksiyonları, güvenlik yöntemleri bolca mevcut. Birçok fonksiyon kullanarak ve kendi mantığınızı da dahil ederek sağlam şifrelenmiş veriler elde edebilirsiniz. Aşağıda cookie verilerinin nasıl şifreleneceği ve şifrelenen verilerin nasıl kullanılacağı konusunu en basit haliyle görebilirsiniz.
- Çerez oluştururken cookie ismi ve cookie değerini şifreliyoruz.
- Çerezi çağırırken istenilen çerezin ismini şifreleyip şifrelenmiş haliyle çerezin değerini çekiyoruz.
- Çekilen çerezin içeriği şifreli olduğu için bu şifreyi çözüp eski haline getiriyoruz.
error_reporting(0); // hatalari gosterme
function encrypt_decrypt($action, $string) {
if($action == 'encrypt') {
return urlencode(base64_encode($string));
}
else if($action == 'decrypt'){
return base64_decode(urldecode($string));
}
}
function cookie($par){
$par = encrypt_decrypt('encrypt',urlencode($par));
if ($_COOKIE[$par]){
return encrypt_decrypt('decrypt',$_COOKIE[$par]);
}else {
return false;
}
}
function set_cookie($name,$value,$time){
$name = urlencode(encrypt_decrypt('encrypt',$name));
$value = encrypt_decrypt('encrypt',$value);
return setcookie($name, $value, $time);
}
if (!cookie('DenemeCookie')){ //cookie yoksa cookie olustur
set_cookie('DenemeCookie', 'Cookie Icerigi', time() + 60*5);
/*
'DenemeCookie' değerinin şifrelenmiş hali = RGVuZW1lQ29va2ll
'Cookie Icerigi' değerinin şifrelenmiş hali = Q29va2llIEljZXJpZ2k%253D
*/
}else{ //cookie varsa
echo cookie('DenemeCookie'); //oku
}
Bu mantıktan yola çıkarak gelişmiş şifreleme ve çözme uygulamaları oluşturabilirsiniz. Ancak sunucu tarafında değilde javascript ile tarayıcı tarafında cookie oluşturma ve okuma yapmak istiyorsak bu çerezlerin önemli veriler içermemesi güvenlik açısından daha faydalı olacaktır.