İnternette gezinirken web tarayıcınız ve ziyaret ettiğiniz web siteleri arasında HTTP (Hypertext Transfer Protocol) adı verilen standart bir protokol kullanılır. Ancak HTTP, doğası gereği “durumsuz” (stateless) bir protokoldür. Yani, bir web sitesinde bir sayfadan diğerine geçtiğinizde, sunucu sizin bir önceki sayfada ne yaptığınızı, kim olduğunuzu veya sepetinize hangi ürünleri eklediğinizi hatırlamaz; her bir sayfa isteği birbirinden tamamen bağımsız ve eşsiz yeni bir işlem olarak kabul edilir.
Bu sorunu aşmak ve web sitelerine bir “hafıza” kazandırmak (kullanıcının durumunu korumak) için geliştiriciler çeşitli yöntemler kullanırlar. Alışveriş sepetinizin sayfalar arasında kaybolmaması veya hesabınıza giriş yaptıktan sonra diğer sayfalarda da oturumunuzun açık kalması bu hafıza sayesinde mümkündür. PHP, bu işlemi gerçekleştirebilmeniz için “Çerezler” (Cookies) ve “Oturumlar” (Sessions) olmak üzere iki güçlü ve yerleşik araca sahiptir. Bu rehberimizde, web güvenliğinin ve modern kullanıcı deneyiminin kalbi olan PHP Oturum Yönetimi (Session) kavramını örneklerle ve adım adım inceleyeceğiz.
Çerezler (Cookies) ve Oturumlar (Sessions) Arasındaki Fark Nedir?
Oturum yönetimini anlamak için öncelikle çerezlerle olan temel farkını bilmek son derece önemlidir:
- Çerezler (Cookies): Web sitelerinin doğrudan kullanıcının bilgisayarında (tarayıcısında) sakladığı küçük metin dosyalarıdır. Ancak çerezler güvenlik açısından zayıftır; doğrudan istemci (client) tarafında tutuldukları için, biraz bilgili bir kullanıcı veya kötü niyetli bir kişi bu dosyaları kolayca açabilir, okuyabilir veya içindeki bilgileri kendi çıkarları doğrultusunda değiştirebilir.
- Oturumlar (Sessions): Çerezlere çok benzer bir amaçla çalışır ancak çok daha güvenli bir yaklaşım benimserler: Bilgiler kullanıcının bilgisayarında değil, doğrudan sunucuda (server) metin dosyalarında veya bir SQL veritabanında güvenle saklanır. Kullanıcının bilgisayarına ise, sadece o sunucudaki bilgileri bulmaya yarayan, “Oturum Kimliği” (Session Identifier) adı verilen benzersiz ve rastgele bir numara gönderilir. Varsayılan olarak PHP, bu benzersiz numarayı kullanıcının bilgisayarına
PHPSESSIDadında bir çerez olarak yerleştirir.
Vestiyer Örneği ile Oturum Mantığı: Bunu şık bir restorana gittiğinizde paltonuzu vestiyere bırakmanıza benzetebilirsiniz. Vestiyer görevlisi (Sunucu) paltonuzu güvenli bir odaya asar ve size üzerinde sadece bir numara yazan küçük bir plastik fiş (Session ID – Oturum Kimliği) verir. İçerideki odada hangi paltoda ne olduğu sadece görevlinin kontrolündedir. Siz restoranda dolaşırken sırtınızda paltoyu taşımazsınız, sadece fişi taşırsınız. Çıkarken fişinizi gösterirsiniz ve görevli o numarayla eşleşen paltonuzu (bilgilerinizi) size güvenle teslim eder.
PHP’de Oturum Başlatmak: session_start()
PHP’de yeni bir oturum başlatmak veya var olan bir oturumu devam ettirmek son derece kolaydır. Bunun için session_start() fonksiyonunu çağırmanız yeterlidir. Bu fonksiyon çağrıldığında, PHP arka planda yeni bir oturum oluşturur ve o anki ziyaretçi için benzersiz bir oturum kimliği üretir.
Çok Önemli Bir Kural: session_start() fonksiyonu, arka planda kullanıcıya bir çerez göndermek için HTTP başlıklarını (headers) kullanır. Bu nedenle, session_start() komutunun veya header() yönlendirmelerinin, PHP dosyanızın en üstünde, ekrana herhangi bir HTML etiketi, boşluk veya çıktı (echo) gönderilmeden önce yer alması zorunludur. Aksi takdirde PHP size ölümcül bir hata (fatal error) verecektir.
Oturum Değişkenleri Oluşturmak ve Kullanmak
Bir oturum başlatıldıktan sonra, o kullanıcıya özel bilgileri saklamak için oturum değişkenleri oluşturabilirsiniz. Bu değişkenler, kullanıcı sitenizde sayfa değiştirdikçe (örneğin ana sayfadan profil sayfasına geçerken) hafızada canlı kalmaya devam ederler. PHP’de oturum değişkenleri, $_SESSION adındaki özel bir süper global dizi (array) kullanılarak kaydedilir ve okunur.
Örnek 1: Bilgileri Oturuma Kaydetmek (giris.php)
<?php
// Sayfanın en başında oturumu başlatıyoruz
session_start();
// Kullanıcının adını ve rolünü oturum değişkenlerine kaydediyoruz
$_SESSION['isim'] = 'Ahmet';
$_SESSION['rol'] = 'Yönetici';
echo "Bilgileriniz başarıyla oturuma kaydedildi.";
?>
Örnek 2: Kaydedilen Bilgileri Başka Sayfada Okumak (profil.php)
<?php
// Başka bir sayfaya geçsek bile önce oturumu başlatmalıyız
session_start();
// Oturum değişkenlerini okuyarak ekrana yazdırıyoruz
echo 'Hoş geldin, ' . $_SESSION['isim'] . '. Senin rolün: ' . $_SESSION['rol'];
?>
Oturumları Sonlandırmak (Kullanıcı Çıkışı)
Kullanıcı web sitenizdeki işini bitirdiğinde (örneğin “Çıkış Yap” butonuna tıkladığında), o kullanıcıya ait oturum bilgilerini sunucudan silmeniz gerekir. Sadece belirli bir oturum değişkenini (örneğin kullanıcının sepetini) silmek istiyorsanız unset() fonksiyonunu kullanabilirsiniz. Ancak tüm oturumu ve içindeki bütün verileri tamamen yok etmek, kullanıcının sistemden tam anlamıyla çıkış yapmasını sağlamak için session_destroy() fonksiyonu kullanılır.
<?php
// Oturumu başlat
session_start();
// Tüm oturum verilerini sunucudan yok et
session_destroy();
// Kullanıcıyı tekrar giriş sayfasına yönlendir
header('Location: login.php');
?>
Pratik Örnek: Sayfa Ziyaret Sayacı (Visit Tracker)
Teoriyi pratiğe dökmek için, bir kullanıcının sayfanızı daha önce hangi tarih ve saatlerde ziyaret ettiğini aklında tutan harika bir uygulama yapalım.
<?php
// Oturumu başlat
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<title>Ziyaret Takipçisi</title>
</head>
<body>
<h2>Sayfayı Ziyaret Geçmişiniz</h2>
<?php
// Eğer 'ziyaretler' adında bir oturum değişkeni henüz yoksa
if (!isset($_SESSION['ziyaretler'])) {
echo 'Bu sizin sayfamıza ilk ziyaretiniz, hoş geldiniz!';
} else {
echo 'Bu sayfayı daha önce şu tarihlerde ziyaret ettiniz: <br/>';
// Döngü ile önceki tüm ziyaret tarihlerini yazdır
foreach ($_SESSION['ziyaretler'] as $ziyaret_Zamani) {
echo date('d M Y H:i:s', $ziyaret_Zamani) . '<br/>';
}
}
// Şu anki ziyaretin tarih ve saatini (timestamp) oturum dizisine ekle
$_SESSION['ziyaretler'][] = mktime();
?>
</body>
</html>
Nasıl Çalışır? Bu betik her çalıştığında önce oturumu başlatır. Daha sonra $_SESSION['ziyaretler'] dizisinin içine o anki zaman damgasını (timestamp) ekler. Sayfayı her yenilediğinizde (F5), daha önceki ziyaretleriniz foreach döngüsü ile okunur ve ekrana tarih formatında yazdırılır. Tarayıcınızı tamamen kapatana kadar bu bilgiler hafızada kalmaya devam edecektir.
Pratik Örnek 2: Sayfa Güvenliği Sağlamak (Login Mantığı)
Oturumların en yaygın kullanım amacı, belirli sayfaları (örneğin bir yönetim paneli) üye olmayan kişilerden korumaktır.
Kullanıcı giriş yaptığında oturum değişkenini oluştururuz:
// Başarılı giriş sonrası
$_SESSION['kullanici_adi'] = "admin";
Korunacak sayfalarda (örneğin admin.php) ise sayfanın en başında şu kontrolü yaparız:
<?php
session_start();
// Eğer oturumda bir kullanıcı adı yoksa, bu kişi giriş yapmamıştır
if (!isset($_SESSION['kullanici_adi'])) {
// Ölümcül hata fırlat veya giriş sayfasına yönlendir
die('HATA: Bu sayfayı görüntüleme yetkiniz yok. Lütfen giriş yapın.');
}
echo "Gizli yönetim paneline hoş geldiniz, " . $_SESSION['kullanici_adi'];
?>
PHP Oturum Yönetiminde İleri Seviye Güvenlik ve Ayarlar
Oturumlar çerezlerden çok daha güvenli olsa da yapısal olarak kusursuz değildirler. “Oturum Çalma” (Session Hijacking) adı verilen bir saldırı türünde, kötü niyetli bir kişi kullanıcının PHPSESSID değerini bir şekilde ele geçirerek, sunucuyu asıl kullanıcı kendisiymiş gibi kandırabilir.
Bu tür saldırıları zorlaştırmak için çeşitli yöntemler vardır. Örneğin, istemci (client) ilk bağlandığında onun tarayıcı bilgisini (User-Agent başlığı) oturuma kaydedip, sonraki her sayfa geçişinde bu bilginin değişip değişmediğini kontrol edebilirsiniz; tarayıcı bilgisinde anlık bir değişim yaşanması, oturumun bir başkası tarafından çalındığı anlamına gelebilir ve erişim derhal reddedilmelidir.
Buna ek olarak php.ini yapılandırma dosyasında güvenlik ve işlevsellik için değiştirebileceğiniz önemli oturum ayarları şunlardır:
- Oturum Dosyalarının Kayıt Yeri (
session.save_path): PHP, oturum verilerini varsayılan olarak sunucunun geçici klasörüne (genellikle/tmp) kaydeder. Windows işletim sistemine sahip bir sunucu kullanıyorsanız bu dizin bulunmadığı için oturumlarınız çalışmayabilir; bu değeri manuel olarak geçerli bir temp klasörüne yönlendirmeniz gerekir. - Oturumun Geçerlilik Süresi (
session.gc_maxlifetime): Bir kullanıcının sitede hiçbir farenin hareket etmemesi veya tıklama yapmaması durumunda ne kadar süre beklediğinde oturumunun otomatik olarak kapanacağını (zaman aşımı) saniye cinsinden belirler. Bankacılık uygulamalarında bu süre genellikle çok kısa tutulur. - Oturum Çerezinin Adı (
session.name): PHP’nin varsayılan değer olarak atadığıPHPSESSIDçerez adını değiştirmek, sisteminizin altyapısında PHP kullanıldığını gizleyerek potansiyel saldırganların işini zorlaştırır.
Özetle, PHP’de $_SESSION yönetimi, durumsuz çalışan web mimarisine kişiselleştirme ve güvenlik getiren en kritik araçtır. Güçlü bir web uygulaması veya e-ticaret platformu inşa ediyorsanız, oturumları başarılı ve güvenli bir şekilde yönetmek sizin en büyük yardımcınız olacaktır.





