PHP

PHP’de Oturum (session) Yönetimi

PHP'de Oturum (session) Yönetimi

Web uygulamalarında kullanıcı deneyimini kişiselleştirmek ve kullanıcı durumunu takip etmek en temel gereksinimlerden biridir. Ancak web iletişiminin temelini oluşturan HTTP protokolü durum bilgisi tutmayan (stateless) bir yapıya sahiptir. Bu durum, bir istemcinin sunucuya yaptığı her isteğin birbirinden bağımsız değerlendirilmesi anlamına gelir. Kullanıcının giriş yapıp yapmadığını, sepetine eklediği ürünleri veya tercihlerini takip edebilmek için oturum yönetim mekanizmalarına ihtiyaç duyulur. PHP dilinde bu ihtiyacı karşılayan en yaygın ve yerleşik çözüm session yapısıdır.

Session Nedir ve Nasıl Çalışır?

PHP oturum mekanizması, kullanıcıya ait verileri istemci tarafında değil, doğrudan sunucu tarafında geçici dosyalar halinde saklar. Bu süreç şu temel adımlarla işler:

  • Kullanıcı sunucuya bir istek gönderdiğinde oturum başlatılır.
  • Sunucu, her kullanıcı için rastgele ve benzersiz bir oturum kimliği (Session ID) üretir.
  • Bu benzersiz kimlik, kullanıcının tarayıcısına genellikle PHPSESSID adında bir çerez (cookie) olarak iletilir.
  • Kullanıcı sonraki her istekte bu çerezi sunucuya geri gönderir.
  • Sunucu, gelen kimliği eşleştirerek ilgili kullanıcıya ait verilere sunucu belleğinden veya diskinden erişir.

Verilerin sunucuda tutulması, çerezlere kıyasla daha yüksek bir veri güvenliği sağlar; çünkü istemci verilerin içeriğini doğrudan değiştiremez, yalnızca kimlik değerini taşır.

Oturum Başlatma ve Veri Tanımlama

PHP’de oturum işlemlerini başlatmak için session_start fonksiyonu kullanılır. Bu fonksiyon, mevcut bir oturum varsa onu devam ettirir, yoksa yeni bir oturum başlatır. Bu fonksiyonun sayfa çıktısı (HTML etiketleri veya herhangi bir boşluk karakteri) gönderilmeden önce, yani PHP dosyasının en başında çağrılması zorunludur.

<?php
session_start();

$_SESSION["kullanici_id"] = 101;
$_SESSION["kullanici_adi"] = "yunus";
$_SESSION["yetki"] = "admin";

echo "Oturum verileri basariyla kaydedildi.";
?>

Yukarıdaki örnekte session_start fonksiyonu ile oturum başlatılmış ve $_SESSION süper küresel dizisi kullanılarak üç farklı anahtara değer atanmıştır. Bu değerler artık sunucuda saklanmakta ve bu oturum sonlanana kadar aynı tarayıcı oturumundaki diğer sayfalardan erişilebilir durumdadır.

Oturum Verilerini Okuma ve Kontrol Etme

Farklı bir sayfada kayıtlı oturum verilerini okumak için de yine ilk olarak session_start çağrılmalıdır. Bir verinin varlığını kontrol etmeden doğrudan ekrana yazdırmaya çalışmak hatalara yol açabileceği için isset fonksiyonu ile kontrol yapılması önerilir.

<?php
session_start();

if (isset($_SESSION["kullanici_adi"])) {
    echo "Hos geldiniz, " . htmlspecialchars($_SESSION["kullanici_adi"], ENT_QUOTES, 'UTF-8');
    echo "<br>Yetkiniz: " . htmlspecialchars($_SESSION["yetki"], ENT_QUOTES, 'UTF-8');
} else {
    echo "Lutfen once giris yapiniz.";
}
?>

Bu örnekte isset kontrolü ile kullanici_adi anahtarının mevcut olup olmadığı denetlenmiştir. Varsa değerler güvenli bir şekilde ekrana yazdırılmakta, yoksa kullanıcının giriş yapmadığı anlaşılmaktadır. htmlspecialchars fonksiyonu, oturum verisinin ekrana basılırken olası XSS açıklarına yol açmasını önlemek amacıyla kullanılmıştır.

Oturumu Güncelleme ve Sonlandırma

Kullanıcı profilini güncellediğinde oturum verilerini değiştirmek veya kullanıcı sistemden çıkış yaptığında oturumu tamamen kapatmak gerekebilir.

Belirli Bir Veriyi Silme

Tüm oturumu kapatmadan yalnızca tek bir oturum değişkenini silmek için unset fonksiyonu tercih edilir.

<?php
session_start();

if (isset($_SESSION["yetki"])) {
    unset($_SESSION["yetki"]);
}
?>

Oturumu Tamamen Kapatma (Logout)

Kullanıcı çıkış yaptığında sunucuda depolanan verilerin, bellekteki değişkenlerin ve tarayıcıdaki oturum çerezinin tamamen temizlenmesi gerekir. Güvenli bir çıkış işlemi şu şekilde uygulanır:

<?php
session_start();

$_SESSION = array();

if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(
        session_name(),
        '',
        time() - 42000,
        $params["path"],
        $params["domain"],
        $params["secure"],
        $params["httponly"]
    );
}

session_destroy();
?>

Bu kod bloğunda:

  • $_SESSION dizisi boş bir diziye eşitlenerek bellekteki veriler sıfırlanır.
  • setcookie fonksiyonu ile tarayıcıdaki oturum çerezinin süresi geçmiş bir zamana ayarlanarak çerez tarayıcıdan silinir.
  • session_destroy fonksiyonu çağrılarak sunucudaki oturum dosyası fiziksel olarak kaldırılır.

Oturum Yönetiminde Güvenlik Önlemleri

Siber güvenlik perspektifinden bakıldığında, PHP session mekanizması doğru yapılandırılmadığında oturum çalma (Session Hijacking) ve oturum sabitleme (Session Fixation) gibi saldırılara açık hale gelir. Bu riskleri en aza indirmek için belirli güvenlik önlemleri alınmalıdır.

Session Fixation Koruması

Kullanıcı yetki seviyesi değiştiğinde (örneğin kullanıcı giriş yaptığında), sunucunun eski oturum kimliğini terk edip yeni bir kimlik üretmesi gerekir. Bu işlem session_regenerate_id fonksiyonu ile sağlanır.

<?php
session_start();

// Kullanici dogrulamasi basarili oldugunda:
session_regenerate_id(true);

$_SESSION["giris_yapti"] = true;
$_SESSION["kullanici_id"] = 42;
?>

Parametre olarak verilen true değeri, eski oturum kimliğine ait verilerin sunucudan silinmesini sağlar. Bu yöntem, saldırganın kurbana önceden tanımladığı bir oturum kimliğini dayatmasını engeller.

Güvenli Çerez (Cookie) Parametreleri

Oturum kimliğini taşıyan çerezin güvenliği, php.ini ayarları veya session_set_cookie_params fonksiyonu üzerinden sıkılaştırılmalıdır.

<?php
$cookieParams = [
    'lifetime' => 0,
    'path' => '/',
    'domain' => '',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Strict'
];

session_set_cookie_params($cookieParams);
session_start();
?>

Bu parametrelerin görevleri şunlardır:

  • secure: Çerezin yalnızca HTTPS bağlantıları üzerinden iletilmesini sağlar, dinleme saldırılarını engeller.
  • httponly: Çereze JavaScript üzerinden (document.cookie) erişimi yasaklar, XSS saldırılarında oturum kimliğinin çalınmasını zorlaştırır.
  • samesite: CSRF saldırılarına karşı koruma sağlar; Strict değeri çerezin üçüncü taraf isteklerle gönderilmesini engeller.

Özet ve Sonraki Adımlar

PHP’de oturum yönetimi, durum bilgisi tutmayan HTTP yapısında kullanıcı durumunu takip etmenin temel yoludur. session_start ile başlayan bu döngü, $_SESSION süper küreseli üzerinden veri okuma ve yazma işlemleriyle devam eder, oturum sonlandırma adımlarıyla güvenli biçimde tamamlanır. Oturum yönetiminde güvenliği sağlamak için oturum kimliği yenileme ve HttpOnly, Secure, SameSite gibi çerez parametrelerini doğru kullanmak kritik öneme sahiptir.

Bir sonraki adımda, oturum verilerini dosya sistemi yerine Redis veya MySQL gibi merkezi veri tabanlarında saklamayı sağlayan özel oturum işleyicileri (custom session handlers) konusunu inceleyebilirsiniz.

#backend geliştirme#php#php oturum yonetimi#php session#web guvenligi

Comments

No comments yet. Be the first to comment.

Leave a comment

Comments are published after the admin approves them.