Kategoriler
Geliştirici Günlükleri PHP Programlama

PHPCookies ile Cookie-Session ve Güvenlik

Normal şartlarda PHP’nin kendi çerez yönetimi bir çok web uygulaması için yeterli gelmektedir. Peki ya güvenlik? Evet, PHP kullanıcı verilerinin güvenliği söz konusu olduğunda oturum çerezleri ya da daha yaygın bir ifade ile Sessionların kullanımını ön görüyor. Ki bu temelde gerçekten yeterli güvenlik önlemini sağlıyor. Ancak bu seferde oturum sayısının çok artmasıyla performans sorunları ve daha da önemlisi çoklu sunucu kullanan uygulamalarda oturumların senkronizesi gibi halledilmesi güç sorunlar ortaya çıkıyor.

Aslına bakarsanız PHP’nin sunduğu en temel Cookie ve Session mantığı küçük ve orta-alt çaptaki projeler için gayet uygun ve yeterli olduğunu söyleyebilirim. Sorun proje büyüdüğünde yani; anlık aktif oturum sayıları yüzbinlere geldiğinde ya da web uygulamanıza birden fazla sunucu hizmet vermeye başladığında ortaya çıkıyor.

İlk sorun ile başlayalım; PHP, her oturum için işletim siteminizin geçici dizininde “sess_” ibaresi ile başlayan dosyalara serialize() işlevinin uyguladığına benzer bir format da verileri depolar. Ve kullanıcının tarayıcısına bu dosya ile eşleşmenin sağlanacağı bir çerez verilir. Kullanıcı uygulamanıza eriştiğinde kullanıcının tarayıcısındaki çerezin benzersiz değerini “sess_” ifadesinin sonuna ekleyerek o kullanıcı için geçerli oturum dosyasının tam adını bulur ve dosyayı çağırarak derler. Bu dosyalar zamanla siliniyor olsa da anlık kullanıcı sayısı yüksek bir uygulamanız varsa bu örneğin milyonlarca dosya arasında kullanıcının dosyasının aranacağı anlamına gelir. Bu PHP’den bağımsız olarak işletim sisteminin ve sunucu donanımı ile alakalı olarak ciddi performans sorununa neden olur. Bu noktada bir geliştirici olarak yapabileceğiniz neredeyse hiçbir şey yoktur.

İkinci olarak belirttiğim sorun birden fazla sunucunun tek bir uygulamaya hizmet verdiği durumlar olabilir. Ya da bir üst projenin hesabı ile alt projelerde oturuma devam etmeniz gereken projeler geliştirmeniz gerekebilir. Bu durumda yapmanız gerekense oturumların tüm sunucular/uygulamalar arasında senkron çalışmasını sağlamaktır ki bu ciddi bir zaman ve sermaye kaybına neden olur. Anlık oturum sayısı arttıkça bu iş daha da zorlaşmaya başlayacaktır.

PHPCookies Kütüphanesi

PHPCookies kütüphanesi oturum çerezlerini de kullanıcının tarayıcısında bir çerez olarak tutmayı güvenli ve mümkün hale getirmeyi amaçlar. Çerezlerin kullanımını değiştirmeden korurken, oturum verilerini şifrelenmiş ve değiştirilemez şekilde kullanıcının tarayıcısında tutar.

Neden ve nasıl değiştirilemez?

Kullanıcının tarayıcısında tutulan çerezler hiçbir ek araca gerek duymadan tarayıcıdan rahatlıkla değiştirilebilir. Bu hala geçerlidir. Kullanıcı çerezlerini dilediği gibi değiştirebilir. 🙂 Ancak oturum verilerini tutmak için kullanılan çerez hariç.

Elbette bunu yapabilmesi için gerçekten sadece siz ve uygulamanız tarafından bilenen çok gizli bir anahtar belirlemeniz gerekiyor. 🙂 Veriler belirleyeceğiniz anahtar ile şifrelenir ve imzalanır. Herhangi biri bu verinin içeriğini değiştirmeyi başarsa bile bu sefer imza geçersiz kalacağından kullanıcının oturum çerezi geçersiz sayılacaktır. 🙂

Buradaki kritik nokta; uygulamanıza ait çok gizli anahtardır. Verilerin değiştirilemeyeceğinin, değiştirilse bile oturumun geçersiz sayılmasını sağlayan belirlediğiniz anahtardır.

Hız ve Performans

Bu yüzbinlerce aktif kullanıcısı olan uygulamalar için dosya sitemini devreden çıkarmanızı sağlayacak ve dolayısı ile daha performanslı çalışacaktır.

Bu kütüphane sadece yükleme ve bitiş sırasında şifreleme ve şifre çözme işlemi yaptığından diskten ziyade bellek ve işlemci performansı önemlidir ki hem bellek hem işlemci her zaman diskten hızlı olacaktır. 🙂

Uygulamalar Arasında Senkronizasyon

Uygulamalar ya da sunucular arasında bir senkronizasyon yapmanıza gerek yoktur. Sadece ortak bir anahtar kullanmanız yeterlidir.

Güvenilir mi?

Belirlediğiniz anahtar gizli kaldığı (ve tahmin edilmediği) sürece güvenlidir. Google, facebook gibi internetin dev isimleri buna benzer ama daha gelişmiş özel yapılar kullanıyor.

Nasıl kurulur?

Kütüphane tek bir dosyadan oluşuyor. Haliyle github.com/muhametsafak/phpcookies adresinden indirip src/Cookies.php dosyasını projenizin bir yerinde dahil etmeniz yeterli olacaktır.

Ya da Composer kullanıyorsanız aşağıdaki kodu yürüterek kurulumu tamamlayabilirsiniz.

composer require muhametsafak/phpcookies

Nasıl kullanılır?

Bu kitaplığın 2.0 sürümüyle birlikte kullanımı ve metot isimleri değiştirildi. Daha detaylı bilgi için PHPCookies 2.0 – Geliştirici Günlüğü #2

Öncelikle \PHPCookies\Cookies sınıfından bir nesne oluşturun ve hemen ardından setKey() yöntemi ile uygulamanıza ait gizli anahtarı belirleyin.

$cookies = new \PHPCookies\Cookies();
$cookies->setKey("Çok gizli anahtarım");

En temelde kullanabileceğiniz 10 method vardır.

setCookie()

Bir çerez tanımlar ya da var olan bir çerezin değerini değiştirir.

$cookies->setCookie("cerez_adi", "Çerez Değeri");

Çereze ait bir yaşam süresi vermek isterseniz üçüncü parametre olarak verebilirsiniz.

$cookies->setCookie("cerez_adi", "Çerez Değeri", 3600);

Yukarıdaki gibi tanımlanan çerez 3600 saniye (1 saat) sonra tarayıcı tarafından silinir.

$options = ['secure' => true];

$cookies->setCookie("cerez_adi", "ÇerezDeğeri", null, $options);

Diğer seçenekleri belirlemek istiyorsanız, yukarıdaki örnek gibi 4 parametrede bir dizi olarak verebilirsiniz.

setSession()

Bir oturum verisini tanımlar ya da değerini değiştirir.

$cookies->setSession("user_id", 15);

Eğer bir oturum verisi için yaşam süresi belirlemek isterseniz 3 parametrede saniye cinsinden belirtebilirsiniz.

$cookies->setSession("username", "muhametsafak" 3600);

getCookie()

Bir çerezin değerine ulaşmak için kullanılır.

$cookies->getCookie("cerez_adi");

Çerezin bulunmaması durumunda varsayılan olarak false döndürür. Varsayılan değerini değiştirmek için 2 parametrede belirtebilirsiniz.

$cookies->getCookie("cookieName", null);

Yukarıdaki örnekte istenilen çerez bulunamazsa NULL döndürür.

Bu yöntemde çerez adı Büyük/küçük harf duyarsızdır.

getSession()

Bir oturum verisinin değerini ya da ikinci parametrede bildirilen değeri (varsayulan false) döndürür.

$cookies->getSession("username", NULL);

Bu yöntemde oturum adı Büyük/küçük harf duyarsızdır.

delCookie()

Belirtilen çerezi siler.

$cookies->delCookie("cerezAdi");

Bu yöntemde çerez adı Büyük/küçük harf duyarsızdır.

delSession()

Bir oturum değerini siler.

$cookies->delSession("userName");

Bu yöntemde oturum adı Büyük/küçük harf duyarsızdır.

hasCookie()

Bir çerezin varlığını (büyük-küçük harf duyarsız) kontrol eder.

if($cookies->hasCookie("productId")){
    // Çerez var.
}else{
    // Çerez yok ya da henüz oluşturulmamış.
}

hasSession()

Bir oturum verisinin varlığını (büyük-küçük harf duyarsız) kontrol eder.

if($cookies->hasSession("userId")){
    // Var.
}else{
    // Yok ya da henüz oluşturulmamış.
}

destroyCookie()

Oturum çerezi haricindeki tüm çerezleri yok eder.

$cookies->destroyCookie();

destroySession()

Tüm oturum verilerini yok eder.

$cookies->destroySession();

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s