Arif

WFN Üye
Konular
714
Mesajlar
714
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
Bilecik
Web Sitesi
Var
Alanı
SEO Uzmanı
1/1
Konu sahibi
PHP’de oturum kullanmak için ilgili sayfanın en başında, tarayıcıya herhangi bir çıktı gönderilmeden önce 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:
AyarAmaç
_only_cookiesOturum kimliğinin URL veya form verisi yerine çerezle taşınmasını sağlar.
_strict_modePHP tarafından oluşturulmamış geçersiz oturum kimliklerinin kabul edilmesini engeller.
_httponlyOturum çerezinin JavaScript tarafından okunmasını engeller.
_secureÇerezin yalnızca HTTPS bağlantılarında gönderilmesini sağlar.
_samesiteSiteler arası isteklerde çerezin gönderilmesini sınırlar; uygulamanın giriş ve yönlendirme akışına göre Lax veya Strict seçilir.
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.

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:
  1. session_start() çağrısının dosyada ilk çıktının öncesinde bulunduğunu doğrulayın.
  2. Tarayıcının çerezleri engellemediğini ve uygulamanın her sayfada aynı alan adı ve yol üzerinden çalıştığını kontrol edin.
  3. Oturum verisini yazdığınız sayfada anahtar adının, okuduğunuz sayfadaki anahtar adıyla aynı olduğundan emin olun.
  4. Yönlendirme sonrasında exit kullanıldığını ve PHP hata günlüklerinde başlatma ya da başlık gönderme hatası bulunmadığını inceleyin.
Oturum değişkeninin bulunmaması, oturumun mutlaka silindiği anlamına gelmez; farklı alan adı, çerez ayarı, oturum süresi, yanlış anahtar adı veya oturum başlatılmadan okuma da aynı belirtiyi oluşturabilir. Geçici hata ayıklama sırasında yalnızca anahtarların varlığını kontrol edin; oturum kimliğini, parolaları veya kişisel verileri ekrana yazdırmayın. Sorun çözüldüğünde tanılama çıktısını kaldırın.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic