aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Web Geliştirme

PHP Session ve Cookie ile Güvenli Oturum Yönetimi

PHP session, HTTP'nin durumsuz (stateless) doğasına rağmen kullanıcıyı sayfalar arasında hatırlamanın en temel yoludur. Bir kullanıcı giriş yaptığında, sepetine ürün eklediğinde ya da dil tercihini değiştirdiğinde bu bilgiyi bir sonraki istekte de bilmen gerekir. Session ile cookie birlikte çalışarak bunu mümkün kılar. Bu yazıda ikisinin nasıl çalıştığını, güvenli ayarları ve oturum sabitleme gibi tipik saldırılara karşı nasıl korunacağını adım adım göreceksin.

Session ve cookie arasındaki fark

İkisi sık karıştırılır ama görevleri farklıdır. Cookie, tarayıcıda saklanan küçük bir veri parçasıdır ve her istekte sunucuya geri gönderilir. Session ise verinin sunucu tarafında tutulduğu bir mekanizmadır; tarayıcıda yalnızca oturumu işaret eden bir kimlik (session ID) bulunur. Bu ayrım önemlidir: kullanıcının e-posta adresi, yetki seviyesi gibi hassas veriler sunucuda kalır, tarayıcıya yalnızca tahmin edilemez bir ID gider.

  • Cookie: Tarayıcıda, açık metin olarak. Kullanıcı görebilir ve değiştirebilir. Dil tercihi, tema gibi hassas olmayan veriler için uygundur.
  • Session: Sunucuda. Kullanıcı yalnızca ID'ye sahiptir, içeriği göremez. Kimlik doğrulama ve hassas durum için doğru tercihtir.

Session'ı başlatmak

Bir session her zaman session_start() ile başlar. Bu çağrı, çıktı gönderilmeden önce, yani herhangi bir echo ya da HTML'den önce yapılmalıdır; aksi halde "headers already sent" hatası alırsın. Başlattıktan sonra $_SESSION süper global dizisiyle veri okur ve yazarsın.

<?php
session_start();

// Veri yazma
$_SESSION['user_id'] = 42;
$_SESSION['locale']  = 'tr';

// Veri okuma
$userId = $_SESSION['user_id'] ?? null;

Session verisi varsayılan olarak sunucuda bir dosyada saklanır ve session ID, PHPSESSID adlı bir cookie ile tarayıcıya gönderilir. Yani arka planda zaten bir cookie kullanılır; bu yüzden session ID'yi koruyan cookie ayarları doğrudan güvenliğini etkiler.

Güvenli cookie bayrakları

Session güvenliğinin büyük kısmı, session cookie'sine doğru bayrakları vermekten geçer. Bunu session_start() çağrısından önce session_set_cookie_params() ile ayarlarsın. Üç bayrak kritiktir:

<?php
session_set_cookie_params([
    'lifetime' => 0,          // tarayıcı kapanınca biter
    'path'     => '/',
    'secure'   => true,       // yalnızca HTTPS üzerinden
    'httponly' => true,       // JavaScript erişemez
    'samesite' => 'Lax',      // CSRF'e karşı koruma
]);

session_start();
  • Secure: Cookie yalnızca HTTPS bağlantısında gönderilir. Açık metin HTTP üzerinden session ID'nin çalınmasını engeller.
  • HttpOnly: Cookie'ye JavaScript'ten document.cookie ile erişilemez. Bir XSS açığı olsa bile saldırganın session ID'yi çalmasını zorlaştırır.
  • SameSite: Cookie'nin başka sitelerden gelen isteklerde gönderilip gönderilmeyeceğini belirler. Lax çoğu uygulama için iyi bir dengedir; Strict daha katıdır.

Oturum sabitleme saldırısına karşı korunmak

Oturum sabitleme (session fixation), saldırganın kurbana önceden bildiği bir session ID'yi kullandırmasıyla işler. Kurban bu ID ile giriş yapınca, saldırgan aynı ID ile oturuma sızar. Çözüm basit ama kritiktir: yetki seviyesi değiştiğinde session ID'yi yenile. Yani kullanıcı giriş yaptığı an session_regenerate_id() çağır.

<?php
// Şifre doğrulandıktan SONRA
if (password_verify($password, $hash)) {
    // Eski oturumu geçersiz kıl, yeni bir ID üret
    session_regenerate_id(true);

    $_SESSION['user_id']    = $user['id'];
    $_SESSION['logged_in']  = true;
}

Buradaki true parametresi, eski session dosyasını da silmesini sağlar. Aynı prensip yetki yükseltme (örneğin normal kullanıcının admin paneline geçişi) gibi durumlarda da geçerlidir.

Oturumu güvenli biçimde kapatmak

Çıkış işlemi yalnızca $_SESSION'ı boşaltmakla bitmez. Hem sunucudaki veriyi hem de tarayıcıdaki cookie'yi temizlemelisin. Eksiksiz bir logout şöyle görünür:

<?php
session_start();

// 1. Session verisini boşalt
$_SESSION = [];

// 2. Session cookie'sini sil
if (ini_get('session.use_cookies')) {
    $params = session_get_cookie_params();
    setcookie(
        session_name(), '', time() - 42000,
        $params['path'], $params['domain'],
        $params['secure'], $params['httponly']
    );
}

// 3. Sunucudaki oturumu yok et
session_destroy();

Bu üç adımı atlamak yaygın bir hatadır: sadece session_destroy() çağırırsan tarayıcıda eski cookie kalabilir, sadece $_SESSION = [] yaparsan sunucudaki dosya silinmez.

Kendi cookie'lerini doğru kullanmak

Session dışında, dil veya tema tercihi gibi hassas olmayan veriler için doğrudan cookie de kullanabilirsin. PHP 7.3 ve sonrasında setcookie(), ayarları bir dizi olarak almayı destekler; bu da SameSite gibi modern bayrakları temiz biçimde tanımlamayı sağlar:

<?php
setcookie('theme', 'dark', [
    'expires'  => time() + 60 * 60 * 24 * 30, // 30 gün
    'path'     => '/',
    'secure'   => true,
    'httponly' => false,   // JS'in okuması gerekiyorsa
    'samesite' => 'Lax',
]);

Unutma: cookie'ye yazdığın veri kullanıcı tarafından değiştirilebilir. Bu yüzden bir cookie'deki değere asla "kullanıcı admin mi?" gibi bir güven kararı bağlama. Yetki kararları her zaman sunucu tarafındaki session'a dayanmalıdır.

Sık Sorulan Sorular

Session verisi nerede saklanır?

Varsayılan olarak sunucudaki geçici bir klasörde, dosya olarak. session.save_path ayarı bu konumu belirler. Ölçeklenen uygulamalarda, birden çok sunucunun aynı oturumu görebilmesi için Redis veya veritabanı tabanlı bir session sürücüsüne geçmek yaygındır.

Session ne kadar süre yaşar?

İki ayar etkiler: session.gc_maxlifetime sunucuda verinin ne kadar geçerli kalacağını, cookie'nin lifetime değeri ise tarayıcının session ID'yi ne kadar tutacağını belirler. Gerçek bir "çıkış yapma süresi" istiyorsan, son aktivite zamanını session'da tutup kendin kontrol etmen en güvenilir yoldur.

Hassas veriyi cookie'de tutabilir miyim?

Hayır. Cookie tarayıcıda açık metin durur ve kullanıcı tarafından okunup değiştirilebilir. Şifre, yetki seviyesi gibi her şey sunucudaki session'da kalmalı; cookie yalnızca tahmin edilemez session ID'yi veya hassas olmayan tercihleri taşımalıdır.

Oturum yönetimini baştan doğru kur. Mevcut bir PHP projende kimlik doğrulamayı güvenli hale getirmek ya da sıfırdan sağlam bir oturum katmanı kurmak istiyorsan, benimle iletişime geç ve birlikte güvenli bir temel atalım.

Bu kategorideki tüm yazılar →

Devamı için