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_httponlyayarının1olması (XSS saldırılarını engeller).session.use_strict_modeayarının1olması (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=Strictkullanıyorsanız, dış kaynaklı bağlantılardan gelen kullanıcılarda oturum verisi boş görünebilir.Laxmoduna geçmeyi deneyin. - Sunucu Saati Uyumsuzluğu: Eğer sunucunuzun saati ile istemci saati arasında büyük farklar varsa,
session.gc_maxlifetimeayarı 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.


Yorumlar (0)
Yorum Yaz