Php İle Güvenli Kullanıcı Oturumu Zaman Aşımı Yönetimi Nasıl Yapılır?

Php İle Güvenli Kullanıcı Oturumu Zaman Aşımı Yönetimi Nasıl Yapılır?
Php İle Güvenli Kullanıcı Oturumu Zaman Aşımı Yönetimi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Uygulamaya başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. PHP 8.2 veya üzeri bir sürüm, modern güvenlik özellikleri ve performans iyileştirmeleri nedeniyle önerilmektedir. Ayrıca, oturum verilerinin sunucu tarafında güvenli bir şekilde saklanması için php.ini ayarlarınızın doğru yapılandırılması gerekmektedir.

  • PHP 8.2+ sürümü yüklü bir sunucu.
  • session.cookie_httponly ayarının 1 olması (XSS saldırılarını engeller).
  • session.use_strict_mode ayarının 1 olması (Oturum kimliği manipülasyonunu engeller).
  • SSL/TLS sertifikası (HTTPS zorunludur).

Adım 1: Oturum Başlatma ve Güvenlik Yapılandırması

Oturum yönetimi, session_start() fonksiyonu ile başlar. Ancak, varsayılan ayarlar çoğu zaman güvenlik gereksinimlerini karşılamaz. İlk adımda, oturum çerezlerini güvenli hale getiren bir yapılandırma dosyası oluşturmalıyız.


// session_config.php
ini_set('session.cookie_httponly', 1);
ini_set('session.use_strict_mode', 1);
ini_set('session.cookie_secure', 1); // Sadece HTTPS üzerinden çalışır
session_start();

Bu kod bloğu, oturum tanımlayıcısının JavaScript üzerinden okunmasını ve güvensiz bağlantılar üzerinden iletilmesini engeller. Bu yapılandırma, tüm sayfalarınızın en üstünde yer almalıdır.

Adım 2: Zaman Aşımı Mantığını Kurma

Zaman aşımı yönetimi, kullanıcının son işlem yaptığı zamanı bir oturum değişkeninde saklayarak çalışır. Eğer mevcut zaman ile son işlem zamanı arasındaki fark, belirlediğiniz süreyi (örneğin 15 dakika) aşarsa oturum imha edilir.


// timeout_check.php
$timeout_duration = 900; // 15 dakika (saniye cinsinden)

if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity']) > $timeout_duration) {
    session_unset();
    session_destroy();
    header("Location: login.php?timeout=1");
    exit();
}

$_SESSION['last_activity'] = time(); // Her başarılı istekte zamanı güncelle

Yukarıdaki kod, kullanıcının her sayfa yenilemesinde veya isteğinde last_activity değerini günceller. Eğer kullanıcı 15 dakika boyunca hiçbir işlem yapmazsa, sistem otomatik olarak oturumu sonlandırır.

Adım 3: Oturum Kimliği Yenileme

Oturum çalınmasını önlemek için, kullanıcı giriş yaptıktan sonra veya belirli aralıklarla oturum kimliğini (session ID) değiştirmek en iyi güvenlik uygulamasıdır. Bu, saldırganın ele geçirdiği bir oturum ID'sinin geçersiz kalmasını sağlar.


// login_process.php
session_start();
// Kullanıcı adı ve şifre doğrulama başarılı olduktan sonra:
session_regenerate_id(true); // Eski oturum dosyasını sil ve yeni ID oluştur
$_SESSION['user_id'] = $user_id;
$_SESSION['last_activity'] = time();

session_regenerate_id(true) fonksiyonu, oturumun çalınma riskine karşı en etkili savunma mekanizmalarından biridir. Giriş anında mutlaka çağrılmalıdır.

Adım 4: Güvenli Oturum Sonlandırma ve Temizlik

Kullanıcı "Çıkış Yap" butonuna tıkladığında veya zaman aşımı gerçekleştiğinde, oturum verilerini sadece session_destroy() ile silmek yeterli değildir. Çerezi de tarayıcıdan temizlemelisiniz.


// logout.php
session_start();
$_SESSION = array(); // Oturum değişkenlerini temizle

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();
header("Location: index.php");
exit();

Bu yöntem, oturum verilerinin sunucudan silinmesini ve tarayıcıdaki oturum çerezinin geçersiz kılınmasını garanti eder.

Oturum Yönetimi Yöntemleri Karşılaştırması

Yöntem Avantajı Dezavantajı
Sunucu Tarafı (PHP Session) Yüksek güvenlik, kontrol kolaylığı. Sunucu belleğini kullanır.
İstemci Tarafı (JWT) Sunucu yükü yok, ölçeklenebilir. İptal etmesi zordur, karmaşıktır.
Kritik Güvenlik Uyarısı: Oturum verilerini asla istemci tarafında (localStorage gibi) düz metin olarak saklamayın. Ayrıca, veritabanı sorgularınızda mutlaka PDO veya MySQLi 'prepared statements' kullanarak SQL Injection saldırılarına karşı önlem alın. Bu rehberdeki kodlar, üretim ortamında (production) kullanılmadan önce kapsamlı testlerden geçirilmelidir.

Sıkça Sorulan Sorular

Oturum süresini nasıl daha uzun tutabilirim?

$timeout_duration değişkenindeki saniye değerini artırarak süreyi uzatabilirsiniz. Ancak, güvenlik gereği bu süreyi çok uzun tutmanız (örneğin 24 saat) önerilmez.

Kullanıcı tarayıcıyı kapattığında oturum biter mi?

Varsayılan olarak evet, ancak session.cookie_lifetime ayarını değiştirerek oturumun tarayıcı kapansa bile belirli bir süre daha kalıcı olmasını sağlayabilirsiniz.

Birden fazla sekmede oturum çalışır mı?

Evet, PHP oturumları tarayıcı bazlıdır. Aynı tarayıcıdaki tüm sekmeler aynı oturum ID'sini paylaşır, bu nedenle bir sekmedeki aktivite diğerini de canlı tutar.

Zaman aşımı süresini veritabanında tutmalı mıyım?

Eğer çok yüksek trafikli bir sisteminiz varsa ve oturumları veritabanında saklıyorsanız, evet. Ancak standart uygulamalarda PHP'nin varsayılan dosya tabanlı oturum yönetimi yeterlidir.

Mobil cihazlarda oturum yönetimi farklı mı?

Temel mantık aynıdır, ancak mobil uygulamalarda genellikle "Refresh Token" yapısı ile JWT kullanımı daha yaygındır. PHP tabanlı web sitelerinde yukarıdaki yöntem geçerliliğini korur.

Oturum Yönetiminde Performans Optimizasyonu: Redis Kullanımı

PHP'nin varsayılan oturum işleyicisi (files), oturum verilerini sunucu diskine yazar. Yüksek trafikli uygulamalarda, disk I/O (giriş/çıkış) işlemleri bir darboğaz haline gelebilir. Oturum verilerini RAM üzerinde tutan Redis kullanımı, hem hız hem de ölçeklenebilirlik açısından kritik bir iyileştirmedir.

Redis'i oturum sürücüsü olarak yapılandırmak için php.ini dosyanızda şu değişiklikleri yapmanız yeterlidir:

session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=sifreniz"

Bu yapılandırma ile oturum verileri disk yerine doğrudan bellekte tutulur. Özellikle session_regenerate_id() fonksiyonunu sık kullandığınız senaryolarda, Redis'in sunduğu düşük gecikme süresi kullanıcı deneyimini doğrudan olumlu etkiler.

Oturum Hata Ayıklama ve İzleme Stratejileri

Oturum zaman aşımı sorunları genellikle "sessiz hata" olarak adlandırılır; kullanıcı aniden sistemden atılır ancak hatanın kaynağı (çerez süresi mi, sunucu tarafındaki TTL mi?) belirsizdir. Uygulamanızda oturum hatalarını ayıklamak için özel bir loglama mekanizması kurmalısınız.

Oturum İzleme İçin Örnek Loglama Fonksiyonu

Oturumun ne zaman yenilendiğini ve ne zaman sonlandığını takip etmek için aşağıdaki yardımcı fonksiyonu kullanabilirsiniz:

function logSessionEvent($message) {
    $logFile = __DIR__ . '/logs/session_debug.log';
    $timestamp = date('Y-m-d H:i:s');
    $logEntry = "[$timestamp] [User: " . ($_SESSION['user_id'] ?? 'Guest') . "] $message" . PHP_EOL;
    error_log($logEntry, 3, $logFile);
}

// Oturum yenileme sırasında çağırın
if ($sessionExpired) {
    logSessionEvent("Oturum zaman aşımına uğradı. Kullanıcı yönlendiriliyor.");
    session_destroy();
}

Yaygın Hata Senaryoları ve Çözümleri

  • Çerezlerin Gönderilmemesi: Eğer SameSite=Strict kullanıyorsanız, dış kaynaklı bağlantılardan gelen kullanıcılarda oturum verisi boş görünebilir. Lax moduna geçmeyi deneyin.
  • Sunucu Saati Uyumsuzluğu: Eğer sunucunuzun saati ile istemci saati arasında büyük farklar varsa, session.gc_maxlifetime ayarı beklediğinizden farklı çalışabilir. NTP senkronizasyonunu kontrol edin.
  • Disk Doluluğu: Dosya tabanlı oturumlarda disk alanı dolduğunda, PHP yeni oturum dosyaları oluşturamaz ve kullanıcılar sürekli giriş ekranına düşer.
İpucu: Geliştirme ortamında session_status() fonksiyonunu kullanarak oturumun aktif olup olmadığını her istekte kontrol eden bir "Middleware" yazmak, hata ayıklama sürecini %80 oranında hızlandırır.

Sonuç

PHP ile güvenli bir oturum yönetimi sistemi kurmak, sadece bir zamanlayıcı eklemekten ibaret değildir; çerez güvenliği, oturum kimliği yenileme ve doğru temizlik prosedürlerini bir bütün olarak uygulamayı gerektirir. Bu rehberde öğrendiğiniz adımlar, uygulamanızı 2026 güvenlik standartlarına bir adım daha yaklaştıracaktır.

Bir sonraki adım olarak, oturum verilerinizi dosya sistemi yerine Redis gibi bellek içi (in-memory) bir veri deposunda saklamayı araştırarak uygulamanızın performansını ve ölçeklenebilirliğini artırabilirsiniz.

Bu yazıya tepkinizi paylaşın:
Burak Yılmaz

Mutfak teknikleri ve pratik gastronomi ipuçları üzerine beş yıllık deneyime sahibim. Okuyucuların mutfak süreçlerini hızlandıracak ve kolaylaştıracak rehberler hazırlıyorum.

Yorumlar (0)

Yorum Yaz