- Konu sahibi
- #1
PHP’de oturum kullanmak için ilgili sayfanın en başında, tarayıcıya herhangi bir çıktı gönderilmeden önce
Örneğin aynı klasörde
Burada
Bu örnekte ekrana yazılacak kullanıcı adı
Oturumdaki tek bir değeri kaldırmak için
Sadece
Kullanıcı adı ve parola doğrulaması başarılı olduktan sonra, eski oturum kimliğinin sabitlenerek kötüye kullanılmasını azaltmak için kimliği yenileyin:
Buradaki
Oturum kimliği yalnızca HTTPS üzerinden taşınan bir çerezle korunmalıdır. Üretim ortamında PHP oturum ayarlarında aşağıdaki seçenekleri kullanmayı değerlendirin:
Bu ayarlar oturum hırsızlığını veya CSRF saldırılarını tek başına tamamen çözmez. Formlarda ayrıca CSRF belirteci, kullanıcı yetkilerinde sunucu tarafı denetim ve giriş bilgilerinde güvenli parola doğrulaması uygulanmalıdır. Oturum kimliğini URL içinde taşımayın; URL’ler geçmişte, günlüklerde veya paylaşılan bağlantılarda kalabilir.
PHP’nin dosya tabanlı varsayılan oturum saklama yönteminde
Oturumun çalışmadığını düşünüyorsanız şu sırayı kontrol edin:
session_start() çağrılır. Ardından kullanıcıya ait geçici bilgiler $_SESSION dizisine yazılır; sonraki PHP sayfalarında yine session_start() çağrılarak okunur. Kullanıcı çıkış yaptığında oturum verileri silinir ve oturum kimliği yenilenir. Böylece giriş durumu, alışveriş sepeti veya form adımları gibi bilgiler sayfalar arasında korunur.Oturumu başlatma ve veri kaydetme
session_start() çağrısı, mevcut oturum kimliği çerezden geldiyse o oturumu yeniden açar; kimlik yoksa yeni bir oturum oluşturur. PHP, oturum verilerini sunucuda saklar ve tarayıcıya genellikle yalnızca oturum kimliğini taşıyan bir çerez gönderir. Bu nedenle parola gibi hassas bilgileri $_SESSION içine koymak yerine, parolayı hiç saklamamak veya yalnızca gerekli kullanıcı kimliğini tutmak daha doğru yaklaşımdır.Örneğin aynı klasörde
giris.php ve profil.php dosyaları bulunduğunu varsayalım. Giriş işlemi başarılı olduğunda kullanıcı kimliğini oturuma kaydedebilirsiniz:
PHP:
<?php
// Bu çağrı, herhangi bir HTML veya echo işleminden önce yapılmalıdır.
session_start();
$kullaniciAdi = 'ayse'; // Veritabanından doğrulanmış kullanıcı adı olduğunu varsayalım.
$_SESSION['kullanici_adi'] = $kullaniciAdi;
$_SESSION['giris_yapildi'] = true;
header('Location: profil.php');
exit;
Burada
header() yönlendirmesinin çalışabilmesi için ondan önce boşluk, HTML veya echo çıktısı olmamalıdır. exit ise yönlendirmeden sonra aynı dosyanın çalışmaya devam etmesini önler. Kullanıcı profil.php sayfasına geldiğinde aynı oturum çerezi gönderilir ve kaydedilen bilgiler okunabilir.Oturum bilgisini okuma
PHP:
<?php
session_start();
if (!empty($_SESSION['giris_yapildi'])) {
echo 'Hoş geldiniz, ' . htmlspecialchars(
$_SESSION['kullanici_adi'],
ENT_QUOTES,
'UTF-8'
);
} else {
echo 'Bu sayfayı görmek için giriş yapmalısınız.';
}
Bu örnekte ekrana yazılacak kullanıcı adı
htmlspecialchars() ile HTML bağlamına uygun biçimde kaçışlanır. $_SESSION['giris_yapildi'] değerinin bulunması, bu istekte oturum verisinin okunduğunu gösterir; tek başına kullanıcının hâlâ yetkili olduğunu kanıtlamaz. Yetki gerektiren işlemlerde kullanıcı kimliği veritabanından tekrar alınmalı ve kullanıcının ilgili kaynağa erişim hakkı ayrıca denetlenmelidir.Oturumu güncelleme, silme ve kapatma
Oturumdaki tek bir değeri kaldırmak için
unset() kullanılır. Tüm oturum verilerini silmek için oturum başlatıldıktan sonra $_SESSION = []; atanabilir. Oturum kimliğini de geçersiz kılmak istiyorsanız çerezi silip session_destroy() çağırın.
PHP:
<?php
session_start();
// Oturumdaki tüm verileri temizle.
$_SESSION = [];
// Tarayıcıdaki oturum kimliği çerezini 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']
);
}
// Sunucudaki oturum kaydını yok et.
session_destroy();
header('Location: giris.php');
exit;
Sadece
session_destroy() çağırmak tarayıcıdaki eski oturum kimliği çerezini her durumda silmez. Bu nedenle çıkış işleminde hem $_SESSION içeriğini hem çerezi hem de sunucudaki oturum kaydını ele almak gerekir.Güvenli oturum açma akışı
Kullanıcı adı ve parola doğrulaması başarılı olduktan sonra, eski oturum kimliğinin sabitlenerek kötüye kullanılmasını azaltmak için kimliği yenileyin:
PHP:
<?php
session_start();
// Kullanıcı adı ve parola veritabanına karşı doğrulandıktan sonra:
session_regenerate_id(true);
$_SESSION['kullanici_id'] = 42;
$_SESSION['giris_yapildi'] = true;
header('Location: profil.php');
exit;
Buradaki
42 yalnızca varsayımsal kullanıcı kimliğidir; gerçek uygulamada doğrulanan kaydın kimliği kullanılmalıdır. session_regenerate_id(true) eski oturum kaydını da silerek yeni bir oturum kimliği üretir. Kimlik yenileme, parola doğrulamasının yerine geçmez; yalnızca başarılı doğrulamadan sonra uygulanması gereken ek bir güvenlik adımıdır.Oturum kimliği yalnızca HTTPS üzerinden taşınan bir çerezle korunmalıdır. Üretim ortamında PHP oturum ayarlarında aşağıdaki seçenekleri kullanmayı değerlendirin:
| Ayar | Amaç |
|---|---|
| _only_cookies | Oturum kimliğinin URL veya form verisi yerine çerezle taşınmasını sağlar. |
| _strict_mode | PHP tarafından oluşturulmamış geçersiz oturum kimliklerinin kabul edilmesini engeller. |
| _httponly | Oturum çerezinin JavaScript tarafından okunmasını engeller. |
| _secure | Çerezin yalnızca HTTPS bağlantılarında gönderilmesini sağlar. |
| _samesite | Siteler arası isteklerde çerezin gönderilmesini sınırlar; uygulamanın giriş ve yönlendirme akışına göre Lax veya Strict seçilir. |
Oturum kilidi ve sık karşılaşılan hatalar
PHP’nin dosya tabanlı varsayılan oturum saklama yönteminde
session_start() sonrasında oturum dosyası kilitlenebilir. Uzun süren bir işlem boyunca oturum verisine artık ihtiyaç yoksa değişiklikleri yaptıktan sonra session_write_close() çağırın:
PHP:
<?php
session_start();
$kullaniciId = $_SESSION['kullanici_id'] ?? null;
session_write_close();
// Uzun süren işlem burada yapılabilir.
// Oturum verisi artık değiştirilmiyorsa diğer istekler gereksiz yere beklemez.
Oturumun çalışmadığını düşünüyorsanız şu sırayı kontrol edin:
session_start()çağrısının dosyada ilk çıktının öncesinde bulunduğunu doğrulayın.- Tarayıcının çerezleri engellemediğini ve uygulamanın her sayfada aynı alan adı ve yol üzerinden çalıştığını kontrol edin.
- Oturum verisini yazdığınız sayfada anahtar adının, okuduğunuz sayfadaki anahtar adıyla aynı olduğundan emin olun.
- Yönlendirme sonrasında
exitkullanıldığını ve PHP hata günlüklerinde başlatma ya da başlık gönderme hatası bulunmadığını inceleyin.