Kullanıcı içerikli siteler yapmak istiyorsak bu kullanıcılara doğru bir şekilde işlemlerini yapabilmeleri için oturum izinleri vermemiz, bu oturumu yönetmemiz ve bunu güvenli bir şekilde yapmamız gerekmektedir.
Kullanıcının çevrimiçi olup olmadığını ve bu durumuna göre sayfalara erişip erişemeyeceğinin kontrolü için gerekli olan oturum yönetimini yapabilmek için çeşitli yollar bulunmaktadır.
Bu yazıda bahsedeceğim yollar “”PHP”” için düşünülmüş olup diğer internet programlama dilleri için de kullanılabilir. Benzer yaklaşımlarla, server olarak kullanılan bilgisayarlarda da hizmet alan kullanıcılar için sunucumuz bir oturum yönetimi yapmalıdır.Oturum ile ilgili esaslı olarak önemli olan üç nokta vardır.1) Kimin oturum açtığının bilinmesi.
2) Oturumun işlem yapılmayan belirli bir süre sonra sonlanması (time out).
3) Oturumda güvenliğin sağlanması (security).
Oturum bilgisini çeşitli yollarla tutabiliriz. Bunlardan bazıları şunlardır:1) Veri tabanına kayıt ile:
Bu yöntemde, oturum açanların bilgilerinin tutulduğu “”veritabanı””nda bir oturum tablosu (session table) bulunur. Kişi kullanıcı girişi yaptıktan sonra kullanıcı numarası veya kullanıcı adı, “”IP adresi”” ve oturum açma zamanı oturum tablosuna kaydedilir. Bu tablo içinde oturum süresini aşanlar var ise tablodan silinir.Her sayfada IP adresi alınarak oturum tablosunda oturum açılmış mı sorgulaması yapılır ve buna göre oturum yürütülür. Buradaki sorun, aynı IP adresi üzerinde başka kullanıcılar var ise karışıma olacaktır. Çünkü bunları ayırt edici başka bir özellik yoktur.2) Web tarayıcıcısı üzerinde Session ile:
Web browser’da oturum bilgilerini tutabiliriz. Eğer kullanıcı doğru girişi yapmış ise,$_SESSION[‘is_online’] = TRUE;şeklinde oturum açtığı bilgisini tutarız. Tarayıcıya göre belirli bir süre SESSION değerleri tutulmaktadır. Bu değerler istenirse değiştirilebilmektedir.
Bazı web tarayıcılarında bu yöntem çalışmayabilmektedir.3) Çerez (Cookie) ile:
Bir diğer yöntem de oturum bilgisinin çerezler (cookies) üzerinde tutulmasıdır. Kullanıcı bilgisayarına kullanıcı adı, parolası çerez olarak bırakılır. Çerezlerde çerezin ne kadar yaşayacağı kolay bir şekilde ayarlanmaktadır.$SESSION_TIME = 3600; // 60 dk oturum$kullanici_adi = “admin”;$sifre = “4444”; // kullanıcı şifresi$ayirac = “–“;$kod = “490?_se3E”; // rasgele ve zor birşeyler$sifrelenmis_bolge = md5($kullanici_adi.$kod);$sifrelenmis_bolge = md5($sifrelenmis_bolge.$sifre);setcookie(“SessionCookie”, $kullanici_adi.$ayirac.$sifrelenmis_bolge, time() + $SESSION_TIME); SessionCookie isimli bırakılan bu çerezin ömrü 60 dakika olacaktır. Çerez bırakılırken güvenlik açısından şifreleme de yapılmıştır.
Bırakılan çereze şuna benzemektedir:SessionCookieadmin–4aef4b8936ffcff66eeb4abcd87d655carsiv.pilli.com/153644988992029976605328209558429976596*Görüldüğü gibi kullanıcı adı görünmekte ama ayıraç (–) ile ayrılan bölgenin sağında kalan kısım şifrelenmiş bölgedir ve anlaşılmamaktadır. “”Sunucu”” tarafında kullanıcı adı okunup ilgili aşamalardan geçirilerek bir şifrelenmiş alan bulunur ve çerezde yer alan şifrelenmiş alan ile karşılaştırılır. Normal şartlarda ve çerez ölmemiş ise eşit çıkar, eğer eşit çıkmaz ise biri burayı değiştirerek saldırı yapıyor demektir ve bu kişinin IP adresi kaydedilmelidir.
Çerez süresi 60 dakika da olsa bu değer üzerinde oynanabilir. Bunu önlemek istersek bir başka yol da hem 1. yolun kullanılması hem 3. yolun kullanılmasıdır. Böylece iki taraflı oturum açılmış olur. Bir tarafta oturum süresi değiştirilse de diğer tarafta oturum sonlanacaktır. Bu yolu her şey daha elimizde, bizim kontrolümüzde olduğu için tavsiye ederim. Olumsuz olan bir nokta ise kullanıcı tarafından çerezlerin açık olması gerektiğidiri (cookies enabled).Sonuçta oturum mantığını yerleştirip oturumu sağladıktan sonra kullanıcıların oturup açıp açmadığını bir sayfada kontrol edip $is_online değişkenine atarız ve bu değişkeni global olarak kullanırız veya is_online() gibi bir fonksiyon yazar ve bu fonksiyonu çağırırız. Tabii çevrimiçi olup olunmadığının kontrolünü yapacağımız her sayfada fonksiyonun ve değişkenin olduğu sayfa @include edilmelidir.
Güvenlik açısından eklemek istediğim diğer noktalar ise şunlardır:* Üye kayıt sırasında veritabanına kullanıcı bilgileri yazılırken şifrenin de şifrelenerek veritabanına yazılmasıdır. Böylece biri veritabanına ulaşsa da kullanıcıların gerçek şifrelerini göremeyecektir.* Üye giriş noktalarında da güvenlik kodlu resimler kullanılmalıdır. Unutulmamalıdır ki görüntü işleme ile bu rakam ve harfler algılanabilmektedir. Bu nedenle insan olarak da zor okunacak resimler kullanılmalıdır.* “Şifremi unuttum yeni şifre gönder” veya “aktivasyon kodu gönderme” bölümünüz var ise buradan göndereceğiniz bilgilere dikkat etmelisiniz. Şifre olarak yeni bir şifre vermenin daha uygun olduğu düşüncesindeyim. Aktivasyonda da kullanıcı numarasının 3 katının 5 fazlası aktivasyon kodu olsun şeklinde bir yaklaşım kötü bir yaklaşımdır. En azından $sifrelenmis_bolge ürettiğimiz şekilde bir aktivasyon kodu üretilebilir ve kullanılabilir.