Yazan : Şadi Evren ŞEKER

İçerik
Çerezlerin internet gezgininde ayarlanması
Çerezlerin HTTP protokolü üzerinden çalışması
PHP dilinde çerez kullanımı
JSP dilinde çerez kullanımı
ASP dilinde çerez kullanımı
Çerezler ve güvenlik

İneternet üzerinde, özellikle de web sayfaları üzerinde gezinirken kullanılan ufak kayıt dosyalarına verilen isimdir. Basitçe bir web sitesi internet üzerinden yayın yaparken bazan bağlanan kullanıcılar hakkında bilgi tutma ihtiyacı duyar. Genelde bu bilgiyi tutmanın iki yolu vardır. Birincisi sunucu üzerindeki bir veri tabanı veya farklı bir veri saklama yapısı içinde tutulması. Diğeri ise istemci (client) üzerinde saklamak.

Bu yazının konusu istemci (client) üzerinde veri saklama teknolojilerinden çerez ismi verilen (cookie) dosyaları anlatmaktır.

Literatürde, çerezler HTTP protokolü üzerinden taşındıkları için HTTP çerezleri (http cookie) olarak da geçmektedirler.

Çerezlerin internet gezgininde ayarlanması

Çerezlerin detayına ve programlamasına geçmeden önce çerezleri kullanıcıların kendi bilgisayarlarında nasıl ayarlayabileceklerini açıklayalım (ekran görüntüleri ve menü yerleri Firefox 3 sürümünden alınmıştır) . Örneğin firefox internet gezginindeki çerez ayarları aşağıdaki şekilde yapılabilir :

cerez1

Öncelikle ayarların yapılacağı ekrana Araçlar > Seçenekler tıklanarak girilebilir:

cerez2

Yukarıda görüldüğü şekilde açılan seçenekler diyaloğunda Gizlilik sekmesi altında Çerezler bölümü bulunmaktadır. Bu bölümde istenirse sitelerin çerez bırakmasına izin verilebilir veya bu izin kaldırılabilir.

Temel olarak kullanıcıların böyle bir izni verme veya kaldırma hakkı bulunmaktadır çünkü sonuçta site tarafından kullanıcının bilgisayarına bir dosya kaydedilecektir. Yazının ilerleyen kısımlarında da anlatılacağı üzere bu izin kötü amaçla kullanılabilmekte ve kullanıcılar için tehdit oluşturabilmektedir. Dolayısıyla kullanıcı dilerse bu seçeneği kapatabilir.

Bu temel özellik bütün internet gezginlerinde ortak olmakla beraber yukarıdaki resimde de görüldüğü üzere Firefox internet gezgininde ilave bazı özellikler bulunmaktadır. Bunlardan birincisi ayrıaclık tanıma özelliğidir. Kullanıcılar isterlerse site bazlı olarak özel ayar yapabilirler ve kuralı sadece belirli sitelere uygulayabilirler.

cerez3

Örneğin yukarıdaki resimde ayrıcalık diyaloğu açıldığında çıkan ekran bulunmaktadır. Burada www.bilgisayarkavramlari.com sitesine izin verilmiştir. Benzer şekilde www.sadievrenseker.com sitesi eklenmek üzere yazılmıştır. Dilenirse Engelle düğmesi ile engellenebilir veya izin ver düğmesi ile izin verilebilir. Ortada bulunan Oturum boyunca izin ver düğmesi ise siteye bir girişlik izin vermek ve siteden çıkıldıktan sonra çerezin temizlenmesi anlamına gelir.

Eklenen siteler istenirse alt tarafta bulunan siteyi sil veya tüm siteleri sil düğmeleri ile silinebilir.

Ayarlar ekranından çerezleri göster düğmesi ile de aşağıdaki ekrana geçilebilir:

cerez4

Bu ekranda site bazlı olarak çerezlere ve bilgilerine erişmek mümkündür. Bilgisayarımıza bir sitenin bıraktığı çerezi ve detaylarını buradan görebiliriz. Elbette çoğu site çerez içeriği olarak şifreli bilgi tutmaktadır. Bunun sebebini güvenlik kısmında anlayacağız.

Çerezlerin yukarıdaki ekranda da görüldüğü üzere bitiş tarihleri bulunmaktadır. Yani bir çerez istenirse belirli bir süreliğine yollanabilir. Örneğin sitemize giren kişinin alışveriş sırasında sepetine eklediği eşyaların sadece 1 saat boyunca geçerli olmasını bundan sonra tekrar sitemize girerse sepetinin boşalmasını istiyor olalım. Bu durumda çerezi oluştururken bitiş tarihi olarak 1 saat ileri tarihi eklememiz yeterli olacaktır.

Internet gezginleri süresi dolan çerezleri saklamaz (veya saklamayabilir) yani bu tip süresi dolmuş çerezlerin silinip silinmemesi internet gezgininin insiyatifindedir ancak yine de süres dolan çerezlerin kullanılamayacağını bilmemiz yeterlidir.

Çerezlerin çalışması

Bir çerez, normal bir HTTP paketi ile kullanıcı tarafından talep edilir ve sunucu tarafından oluşturularak kullanıcıya yollanır.

HTTP protokolü üzerinden yapılan veri transferi request / response (talep / arz  (istek cevap) ) şeklinde olmaktadır. Yani istemci (müşteri , client) bilgisayarı sunucu (server) bilgisayarından bir bilgiyi talep eder (request) ve sunucu bilgisayar bu bilgiye cevap olarak bir sonuç arz eder.

Bu iletişim şeklinde arz edilen (sunucudan döenen) bilgi içerisinde bir çerez bilgisi bulunabilir. Bu bilgiyi HTTP protokolü desteklemektedir:

cerez6

Örneğin yukarıdaki şekilde adım adım bir HTTP protokolü üzerinden iletişim temsil edilmiştir. Önce istemci tarafı internet üzerinden bir HTTP paketi ile www.bilgisayarkavramlari.com sitesinde bulunan index.html dosyasını talep etmektedir.

Ardından sunucu bu talebe yine bir HTTP paketi ile cevap vermektedir. Bu paketin içeriğine dikkat edilecek olursa cevap HTTP 1.1 sürümü ile yapıldığını göstermektedir. Ayrıca 200 OK mesajı dönülmüştür. Yani istenen sayfanın bulunduğu ve başarılı bir talep olduğu anlamında bir HTTP kodu ile talep cevaplanmıştır.

Burada HTTP paketinde bizim için önemli olan Set-Cookie bökümüdür. Bu bölümde bir çerez’in istemciye yollandığı ifade edilmektedir ve isim=değer ibaresiyle herhangi bir bilgi istemciye çerez olarak yüklenmi olur.

Buradaki isim=değer bizim belirlediğimiz bir ismin değeridir. Örneğin : “Giriştarihi = 28102009 ” şeklinde bir bilgi olabilir.

Bu şekilde istemci tarafı bilgiyi talep ettikten ve içeriğinde çerez bulunan bir bilgi geldikten sonra bir önceki bölümde açıkladığımız üzere bu bilgi bilgisayarımızda bir dosya olarak saklanır.

Bundan sonraki talepler (farklı sayfa veya aynı sayfanın tekrar talep edilmesi gibi), bu çerez bilgisi de HTTP paketine ilave edilir.

PHP dilinde çerez programlama

Sunucu tarafı betik dili (server side scripting language) php ile çerez programlamak mümkündür. Bir php sayfasında çerez belirlemek için aşağıdaki satırlar kullanılır:

<?php
setcookie("kullanici", "Şadi Evren ŞEKER", time()+3600);
?>

Yukarıdaki örnek kodda php sayfasında setcookie fonksiyonu marifetiyle “kullanici” adında bir değişken tanımlanmış ve içeriğine Şadi Evren ŞEKER bilgisi eklenmiştir. Fonksiyonun son parametresi ise çerezin yaşam süresidir. Burada yine php içerisinde tanımlı olan time() fonksiyonu kullanılarak mevcut zaman bilgisi sistemden (sunucunun saatinden) okunmuş ve bu süreye 3600 saniye (tam olarak 60 dakika veya 1 saat) ilave edilerek çerezin geçerli olacağı son an belirlenmiştir.

Yukarıdaki kodda belki dikkat çekmeyebilir ancak setcookie fonksiyonu her zaman için sayfanın en başında bulunmalıdır. Bunun sebebi daha önce de açıkladığımız HTTP paketinin başlık kısmında yer alan bir bilgi olmasıdır. Şayet sayfanın içeriğinde bir yerlerde bu bilgi gönderilirse HTTP protokolünün bu bilgiyi ayırma şansı kalmaz.

Sitemizde yukarıdaki sayfa ile bir çerez üretilerek bu çerezin içerisinde kullanici=Şadi Evren ŞEKER bilgisi konulmuştur. Bu bilgiye erişilmek istendiğinde (yine bu sayfadan veya aynı sitedeki herhangi başka bir sayfadan) aşağıdaki şekilde ulaşılabilir:

<?php
echo $_COOKIE["kullanici"];
print_r($_COOKIE);
?>

Yukarıdaki kodun ilk satırı  ile $_COOKIE sistem değişkeni (ki bu değişken bir dizidir (array) ) içerisinde bulunan “kullanici” bilgisine erişilmiştir. Bu dizinin tamamının içeriğini görmek için ikinci satırda bulunan ve dizi içeriğini basmaya yarayan print_r fonksiyonundan yararlanılabilir.

JSP dilinde çerez programlama

JAVA’nın web tabanlı arayüzü kabul edebileceğimiz java server pages (jsp) ile de yukarıdaki php koduna benzer çerez tanımları yapmak mümkündür.

Örneğin aşağıdaki sayfa kodunu inceleyerek JSP üzerinden nasıl çerez kullanıldığını anlamaya çalışalım :

        <%@ page language="java" import="java.util.*"%>
        <%
        User username = new User();
        Date now = new Date();
	String timestamp = now.toString();
	Cookie cookie = new Cookie ("username",username);
	cookie.setMaxAge(365 * 24 * 60 * 60);
	response.addCookie(cookie);
        %>
        <html>
        <body>
        <p><a href="iki.jsp">ikinci sayfa icin buraya basiniz</a><p>
        </body>
        </html>

Yukarıdaki kodda basit bir web sayfası html dilinde kodlanmıştır. JSP dilinden hatırlanacağı üzere <% %> blokları arasındaki kod JSP’ye aittir. Bu alan kolay okunsun diye yukarıda kırmızı renkle belirlenmiştir.

Sayfamızda JSP alanı içerisinde amacımız Cookie sınıfından (class) bir nesne (object) üretmektir. Bu nesnenin özelliği bir dizgi (string) ve bir nesne (object) parametre almasıdır. Yukarıdaki kodda bulunan :

	Cookie cookie = new Cookie ("username",username);

Satırı aslında JSP için çerez kodlamanın yapıldığı satırdır. Bu satıra dikkat ederseniz Cookie yapıcısının (constructor) içerisine birinci parametre olarak bir dizgi (string) verilmiştir. Bu yazı yani “username” ilerde çerezimize erişmek için kullanacağımız bir etiket olarak düşünülebilir. Bu etiketle erişilecek olan bilgi ise Cookie yapıcısının (constructor) ikinci parametresi olan ve daha önceden bir nesne olarak tanımlanmış olan username değişkenidir.

Yukarıdaki örnekte username nesnesi, User ismindeki bir sınıftan türetilmiştir. Siz uygulamanızda cookie olarak saklamak istediğiniz bir nesneyi buraya yerleştirebilirsiniz.

Yukarıdaki şekilde HTTP paketine yerleştirilen bir çereze yine JSP kodunu kullanarak erişmek için aşağıdaki kodlama işnize yarayabilir:

<%@ page language="java"  %>
<%
   String cookieName = "username";
   Cookie cookies [] = request.getCookies ();
   Cookie myCookie = null;
   if (cookies != null)
   {
		for (int i = 0; i < cookies.length; i++)
		  {
				 if (cookies [i].getName().equals (cookieName))
				 {
						myCookie = cookies[i];
						break;
				 }
		  }
   }
%>
        <html>
        <body>
        <%
        if (myCookie == null) {
        %>
                <%=cookieName%> isminde bir çerez bulunamadı.
        <%
        } else {
        %>
                <p>Merhaba: <%=myCookie.getValue()%>.
        <%
        }
        %>
        </body>
        </html>

Yukarıdaki kodda request.getCookies() fonksiyonu ile, sitemizden erişilebilen bütün çerezler alınmıştır. Ardından bir döngü ile bu çerezler arasında ismi “username” olan çerez aranmıştır. Bulunan bu çerez myCookie ismindeki çerezin içerisine konularak HTML sayfasının içine myCookie.getValue() ile ekrana yazılmıştır.

ASP dilinde çerzlerin kullanımı

ASP Microsoft tarafından geliştirilen bir sunucu tarafı betik dilidir (server side scripting language). Bu anlamda JSP ve PHP’ye benzemektedir. Aşağıdaki örnek kod ile bir ASP sayfası üzerinden nasıl çerez üretildiğini anlayabiliriz:

<%
Response.Cookies("kullanici")="Şadi Evren ŞEKER"
Response.Cookies("kullanici").Expires=#May 10,201o#
%>

Yukarıdaki kodda daha önceki dillerde de gördüğümüz üzere çerezin ismi ve değeri atanmıştır. Çerezimize isim olarak kullanici ismi verilmiş ve değer olarak ilk satırda içeriğine “Şadi Evren ŞEKER” değeri konulmuştur. Çerezin yaşam süresi ise 10 mayıs 2010 olarak ikinci satırda atanmıştır.

Aşağıdaki kod ile, yukarıda atanan içeriğe farklı bir sayfadan erişebiliriz:

<%
abc=Request.Cookies("kullanici")
response.write("Çerez bilgisi=" & abc)
%>

Yukarıdaki kodda, abc ismindeki değişkene öncelikle HTTP paketinden kullanici isimli değişken içeriği okunmuştur. Kodun ikinci satırında bu bilgi response.write ile istemciye geri yollanmış ve ekranda görüntülenmiştir.

Çerezler ve güvenlik

Yukarıda da açıklandığı üzere, çerezlerin siteler tarafından serbestçe erişilebilir olması bazı güvenlik sorunlarını da beraberinde getirmektedir. Aşağıda bu sorunlardan bazıları açıklanmıştır:

İz takibi : Bu güvenlik zaafiyeti birden fazla siteye tek bir elde yerleştirilen çerezlerde olur. Örneğin reklam yayını yapan bir şirket, reklamını yayınladığı yerlerde aynı zamanda çerezini de yayınlayabilir.  Bu tip çerezlere, üçüncü parti çerezler (third party cookies) ismi verilir. Bunun sebebi sitenin esas yayıncısı ve siteyi o anda ziyaret etmekte olan istemci (client) dışında üçüncü bir kişinin çerezi olmasıdır.

İşte bu üçüncü parti çerezler siteyi ziyaret eden kişinin bilgisayarına kaydedilir. Şayet reklam veren şirket isterse ziyaretçinin girdiği bütün sitelerin izini sürebilir. Yani reklamının yayınlandığı hangi sitelerin kullanıcı tarafından ziyaret edildiğini takip etmesi mümkündür.

Çerez kaçırılması (cookie hijacking): Bilindiği üzere çerezlerin içerisinde site ve kullanıcı ile ilgili çeşitli bilgiler tutulmaktadır. Saldırgan bir taraf sunucu ve istemci arasında gidip gelen bu çerezleri takip ederek veya istemcinin bilgisayarında saklanan çerez dosyalarına erişerek çeşitli bilgileri ele geçirebilir. Bu noktada sunucu üzerinden çerez programlayan tarafın oldukça hassas davranması ve kişisel bilgileri, şifre kullanıcı detayı gibi bilgileri çerez üzerinde tutmaması gerekir. Elbette internet gibi bir ortamda bu hassasiyet herkesten beklenemez bu da çerezlerin güvenlik açısından oluşturduğu bir problemdir. Diğer bir çözüm ise çerezlerin içindeki bilgilerin şifreli (encrypted) tutulmasıdır. Elbette bütün şifreler bir gün kırılabilir ancak bu vakit alacaktır ve daha organize bir saldırı gerektirecektir.

Çerez zehirlemesi (cookie poisoning): Çerez zehirlemesindeki amaç, istemci taraftan sunucuya giden bilgilerin amaçlı olarak değiştirilmesidir. Örneğin bir alışveriş sitesinde, müşterilerin sepet bilgileri çerezde tutuluyor olsun. Ve büyük bir hata olarak müşterilerin sepetlerindeki eşyaların toplam fiyatı ve dolayısıyla müşterinin ödeyeceği fiyatın da çerezde tutulduğunu düşünelim. Kötü niyetli birisi bu değeri çerez üzerine elle müdahale ederek değiştirebilir ve aslında ödemesi gereken değerden çok daha ucuza sepetindeki eşyaları satın alabilir. Bu tip saldırılara çerez zehirlemesi ismi verilir.

Oturum saldırısı (session hijacking): Çerezlerin sıkça kullanıldığı yerlerden birisi de oturum bilgilerinin saklanmasıdır. Örneğin kullanıcının en son eriştiği sayfa, kullanıcının site üzerindeki ayarları veya kullanıcıya ait sitede tutulan bilgiler çerezlerde tutularak kullanıcının sonraki bağlantılarında sitede kaldığı yerden devam etmesi amaçlanır. Bu durum bir güvenlik zaafiyeti doğurur. Örneğin saldırgan bir kişi bu bilgileri kullanarak aslında hiç olmayan bir kullanıcı ile sitede erişme izni olmayan sayfalara sanki en son bu sayfada kalmış gibi erişebilir. Veya sahip olmadığı yetkiye çerez üzerinde değişiklikler yaparak erişmeye çalışabilir. Bu saldırının tek mantıklı çözümü ise daha dikkatli web siteleri programlamak ve programlcıların bu tip saldırılara karşı dikkatli olmasıdır.

Yorumlar

  1. Fatih

    Selam! Mümkünse, Frontpage sitede cookies ve ya cache yönetimi ile ilgili sorumu yanıtlarsanız sevinirim. Frontpage ile site tasarımı zamanı index.html dışındakı sayfalarda (mesela, konu.html gibi)güncellenme olduğu zaman aynı İP üzerinden sayfaya girmiş ziyaretciler önceki tarihde yapılmış kayıtları görüyor. Yeni güncellenmiş kayıtları ise sayfa refresh edildiği zaman görmek mümkün. Bu yalnız aynı ip üzeinden o sayfaya tekrar girildiğinde oluyor. Yani, her hangi bir diğer bilgisayar ve ya ip-den ilk defa o sayfaya girildiğinde normal güncellenmiş kayıtlar görseniyor.

    Sayfanın tarayıcıya cache atmaması için no-cache gibi meta taglar kullanmamıza rağmen sorun ortadan kalkmıyor.

    Sizce, bütün sayfalardakı güncellemelerin mevcud ziyaretcilerimize daha normal ve hemen görükmesi için (refresh-le uğraştırmadan) ne yapmamız gerekir? Frontpage sayfa tasarımı zamanı cookie (çerez) ve ya cache ayarlarını nasıl düzenleye ve ya oluştura biliriz ?

    Yardımınız için önceden teşekkürler!

  2. Şadi Evren ŞEKER Article Author

    Probleminiz bana web sunucu ile ilgili gibi geldi. Muhtemelen IIS kullanıyorsunuzdur.

    Şimdi web sunucu gelen sayfa talebini (request) şayet 204 ile cevaplarsa, bu durumda istemci (client) tarafından güncellemeye gerek yok demektir ve kullanıcılar kendi bilgisayarlarındaki eski kopyaları görürler. Sanırım IIS üzerinde bir ayarlama gerekiyor olabilir.

    Ayrıca yerinizde olsam kodlamaya response objesini eklerdim. Ortamınızı bilmiyorum ama ASP ile yazıyorsanız response.write , header ve flush fonksiyonlarını kullanmayı deneyebilirsiniz. Vakit bulabilirsem IIS ayarlarını kontrol edip buradan paylaşmaya çalışırım. Ayrıca problem ve yaptıklarınız hakkında daha fazla bilgi verirseniz belki birileri yardımcı olabilir.

    Başarılar

  3. Fatih

    Önce konuyla ilgilendiğiniz için teşekkürler, Şadi bey! Tasarım zamanı ASP değil,HTML kullanyoruz. Bir de söylediklerinizden anladığım kadarıyla İİS ayarları yalnız her hangi bir bilgisayara özel olarak tercih edilir ki bu da yalnız o bilgisayar için etkili ola bilir. Konuda bahs edilen sorunun ise cookies ve ya cache ayarları sebebli olması öne çıkıyor.

    İstediğimiz ise, sayfanı devamlı ziyaret edenlere refresh falan yapmaya gerek kalmadan güncellemeleri anında göstermek…

  4. Şadi Evren ŞEKER Article Author

    Ne yazık ki HTML üzerinden istediğiniz gibi (literatürde server side update olarak geçer) sunucu tarafından güncelleme yollama imkanınız olmuyor. Bilebildiğim kadarıyla sizin durumunuzda elinizdeki alternatifler şunlar:

    1. Sunucu tarafı betik (server side scirpinting languages) kullanırsınız (örneğin asp, jsp, php gibi)
    2. İstemci tarafında betik kullanırsınız (jquery ajax gibi)
    3. HTML 5.0 dilini kullanırsınız.

    Bunlardan sizin ortamınıza en uygunu html 5 ancak bütün istemciler henüz desteklemiyor.

    Özellikle server-sent event olarak geçen bu kodlamanın Internet Explorer dışındaki bütün browserlar tarafından desteklendiğini söyleyebilirim (tabi son sürümleri öncekilerde çalışmaz).

    Örneğin twitter, facebook veya borsa sitelerinin çoğunda bu özellik kullanılmaktadır ve güncellemeler (Sohbet mesajları güncellemeler vs.) bu sayede yollanmaktadır.

    Aşağıdaki sayfada örnek kodlar da bulunuyor:

    http://www.w3schools.com/html/html5_serversentevents.asp

    Başarılar

Fatih için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir