Giriş
Modern web uygulamaları, kullanıcıların durumunu yönetmek ve kişiselleştirilmiş bir deneyim sunmak için çeşitli mekanizmalar kullanır. Bu mekanizmaların başında PHP’deki oturum (session) ve çerez (cookie) yönetimi gelir. Bu iki güçlü araç, sunucu ile istemci arasındaki iletişimi anlamlı hale getirerek, kullanıcıların web siteleriyle etkileşimini sürdürmesine olanak tanır. Örneğin, bir kullanıcının oturum açtığını hatırlamak, sepetine eklediği ürünleri saklamak veya tercih ettiği dil ayarını kaydetmek gibi işlemler bu mekanizmalar sayesinde mümkün olur. Bu yazı, PHP’de session ve cookie mekanizmalarının temel prensiplerini, nasıl kullanılacaklarını ve bir kullanıcı giriş sistemi bağlamında nasıl bir araya getirildiklerini detaylı örneklerle açıklayacaktır. Ayrıca, bu mekanizmaların kullanımında dikkate alınması gereken kritik güvenlik en iyi uygulamalarına da değineceğiz.
Oturum (session) mekanizması
Oturumlar, bir kullanıcının web sitesindeki etkileşim süresince durumunu sunucu tarafında saklamak için kullanılan bir yöntemdir. HTTP’nin durumsuz (stateless) doğası gereği, her istek birbirinden bağımsızdır. Oturumlar, bu durumsuz yapıyı aşarak, kullanıcının belirli bir zaman dilimi içinde yaptığı farklı istekleri ilişkilendirir ve bu süre zarfında verileri korur. PHP’de bir oturum başlatmak için sayfanın en başına, herhangi bir HTML çıktısı göndermeden önce session_start() fonksiyonu çağrılmalıdır. Bu fonksiyon, eğer bir oturum ID’si (genellikle bir çerez aracılığıyla) zaten mevcutsa mevcut oturumu başlatır, aksi takdirde yeni bir oturum başlatır ve tarayıcıya yeni bir oturum ID’si gönderir.
Oturum verileri, sunucu tarafında geçici olarak saklanır ve PHP’de $_SESSION süper global dizisi aracılığıyla erişilebilir. Bu dizi, anahtar-değer çiftleri şeklinde veri depolamak için kullanılır. Oturum verileri, kullanıcının oturumu kapanana veya sunucu tarafından sona erene kadar kullanılabilir. Bir oturumu sonlandırmak için session_destroy() fonksiyonu kullanılır, bu fonksiyon sunucudaki tüm oturum verilerini siler. Belirli bir oturum değişkenini kaldırmak için ise unset($_SESSION['degisken_adi']) kullanılabilir.
<?php
session_start(); // Her zaman en başta çağrılmalı
// Oturuma veri kaydetme
$_SESSION['kullanici_adi'] = 'ahmet.yilmaz';
$_SESSION['sepet_toplami'] = 150.75;
echo "<p>Oturum başlatıldı ve veriler kaydedildi.</p>";
// Oturumdan veri okuma
if (isset($_SESSION['kullanici_adi'])) {
echo "<p>Hoş geldiniz, <b>" . htmlspecialchars($_SESSION['kullanici_adi']) . "</b></p>";
}
// Oturumu yok etme (örneğin çıkış yaparken)
// session_unset(); // Tüm oturum değişkenlerini temizler
// session_destroy(); // Oturum dosyasını siler ve oturumu sonlandırır
// echo "<p>Oturum sonlandırıldı.</p>";
?>
Çerez (cookie) mekanizması
Çerezler, web sitelerinin kullanıcıların bilgisayarlarında küçük veri parçacıkları depolamasına olanak tanıyan metin dosyalarıdır. Sunucu tarafından belirlenen ve tarayıcıya gönderilen çerezler, belirli bir süre boyunca tarayıcıda kalır ve kullanıcı aynı sunucuya bir sonraki isteği gönderdiğinde sunucuya geri gönderilir. Bu sayede web sitesi, kullanıcının tercihleri, oturum bilgileri veya diğer küçük veri parçacıklarını hatırlayabilir. PHP’de çerez oluşturmak için setcookie() fonksiyonu kullanılır ve bu fonksiyon da tıpkı session_start() gibi, herhangi bir HTML çıktısından önce çağrılmalıdır.
setcookie() fonksiyonu birden fazla parametre alır:
name: Çerezin adı (zorunlu).value: Çerezin değeri.expire: Çerezin geçerlilik süresi (Unix zaman damgası olarak). Belirtilmezse tarayıcı kapanana kadar geçerlidir.path: Çerezin geçerli olduğu sunucu yolu. Varsayılan olarak “/” (tüm site).domain: Çerezin geçerli olduğu etki alanı.secure: Yalnızca HTTPS üzerinden gönderilip gönderilmeyeceği (trueise sadece HTTPS).httponly: Çereze JavaScript aracılığıyla erişilip erişilemeyeceği (trueise erişilemez, XSS saldırılarına karşı koruma sağlar).
Çerezleri okumak için $_COOKIE süper global dizisi kullanılır. Bir çerezi silmek için, setcookie() fonksiyonunu aynı adla çağırıp geçerlilik süresini geçmiş bir tarih olarak ayarlamak yeterlidir.
<?php
// Herhangi bir çıktıdan önce çağrılmalı
// Çerez oluşturma (1 saat geçerli)
setcookie('kullanici_tercihi', 'koyu_tema', time() + 3600, '/', '', false, true);
echo "<p>Çerez oluşturuldu: 'kullanici_tercihi' = 'koyu_tema'</p>";
// Çerezden veri okuma
if (isset($_COOKIE['kullanici_tercihi'])) {
echo "<p>Kullanıcı tercihi: <b>" . htmlspecialchars($_COOKIE['kullanici_tercihi']) . "</b></p>";
}
// Çerezi silme (geçerlilik süresini geçmiş bir zamana ayarlayarak)
// setcookie('kullanici_tercihi', '', time() - 3600, '/', '', false, true);
// echo "<p>Çerez silindi.</p>";
?>
Kullanıcı giriş sistemi (login system) mantığı
Kullanıcı giriş sistemleri, oturum ve çerez mekanizmalarının entegre bir şekilde kullanıldığı en yaygın örneklerden biridir. Temel mantık şöyledir:
- Giriş Formu: Kullanıcı, kullanıcı adı ve parola bilgilerini bir giriş formuna girer ve gönderir.
- Kimlik Doğrulama: Sunucu tarafında (örneğin bir veritabanında) kullanıcının bilgileri doğrulanır. Eğer bilgiler doğruysa, kullanıcının oturumu başlatılır.
- Oturum Verisi Oluşturma:
session_start()çağrılır ve$_SESSION['loggedin'] = true;gibi bir değişken ile kullanıcının oturum açtığı işaretlenir. Ayrıca, kullanıcının ID’si veya kullanıcı adı gibi bilgiler de$_SESSIONdizisine kaydedilebilir (örn:$_SESSION['user_id'] = $user_id;). - Yönlendirme: Başarılı girişten sonra kullanıcı, ana sayfaya veya önceden gitmek istediği bir sayfaya yönlendirilir.
- Durum Kontrolü: Diğer sayfalarda, kullanıcının oturum açıp açmadığı
if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] === true)kontrol edilerek belirlenir. Oturum açmamış kullanıcılar giriş sayfasına geri yönlendirilebilir. - Çıkış İşlemi: Kullanıcı çıkış yaptığında,
session_unset()ile tüm oturum değişkenleri temizlenir vesession_destroy()ile oturum tamamen sonlandırılır. Ardından kullanıcı giriş sayfasına yönlendirilir.
Bu süreçte, PHP’nin otomatik olarak oturum ID’sini içeren bir çerez göndermesi, kullanıcının her istekte kimliğinin sunucu tarafından tanınmasını sağlar. “Beni hatırla” gibi özellikler için ise kalıcı çerezler kullanılabilir, ancak bu tür çerezlerde doğrudan hassas bilgi yerine, veritabanında tutulan ve güvenli bir şekilde karmaşıklaştırılmış (hashed) token’lar kullanılmalıdır.
<?php
session_start();
// Kullanıcı giriş işlemi (örnek)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['username']) && isset($_POST['password'])) {
$username = $_POST['username'];
$password = $_POST['password'];
// Gerçek bir uygulamada bu bilgiler veritabanından doğrulanır.
// Şifreler her zaman hash'lenerek saklanmalı ve kontrol edilmelidir.
if ($username === 'admin' && $password === 'password123') { // Örnek, ASLA gerçekte böyle yapmayın!
$_SESSION['loggedin'] = true;
$_SESSION['username'] = $username;
session_regenerate_id(true); // Güvenlik için önemli
header('Location: welcome.php');
exit;
} else {
$error = "Hatalı kullanıcı adı veya parola.";
}
}
// Çıkış işlemi
if (isset($_GET['logout'])) {
session_unset();
session_destroy();
session_regenerate_id(true);
header('Location: login.php');
exit;
}
?>
<!DOCTYPE html>
<html lang="tr">
<head>
<title>Giriş Sayfası</title>
</head>
<body>
<h4>Kullanıcı Girişi</h4>
<?php if (isset($error)) echo "<p style='color:red;'>$error</p>"; ?>
<form action="login.php" method="post">
<label for="username">Kullanıcı Adı:</label><br>
<input type="text" id="username" name="username"><br><br>
<label for="password">Parola:</label><br>
<input type="password" id="password" name="password"><br><br>
<input type="submit" value="Giriş Yap">
</form>
<br>
<p>
<a href="welcome.php">Ana Sayfaya Git (giriş yapmadıysanız erişim reddedilir)</a>
</p>
</body>
</html>
Güvenlik best practice’leri
Oturum ve çerezler, hassas verileri depolama ve kullanıcı kimliklerini doğrulama amacıyla kullanıldığından, güvenlikleri büyük önem taşır. Yanlış yapılandırma, çeşitli güvenlik zafiyetlerine yol açabilir.
- HTTPS Kullanımı: Tüm hassas iletişimlerde (özellikle giriş, kayıt ve kişisel bilgi alışverişi yapılan sayfalarda) HTTPS kullanılmalıdır. Bu, verilerin şifrelenmesini ve man-in-the-middle saldırılarından korunmasını sağlar.
- Oturum Çerezi Ayarları:
session.cookie_httponly = true: Bu ayar, oturum çerezine JavaScript aracılığıyla erişimi engeller. Bu sayede XSS (Cross-Site Scripting) saldırılarında saldırganın oturum çerezini çalması büyük ölçüde zorlaşır.session.cookie_secure = true: Bu ayar, oturum çerezinin yalnızca HTTPS bağlantıları üzerinden gönderilmesini sağlar. Hassas sitelerde kesinlikle kullanılmalıdır.session.use_strict_mode = true: Oturum fiksasyonu (session fixation) saldırılarını önlemeye yardımcı olur. Bu modda, sunucu tarafında oluşturulmayan bir oturum ID’si kabul edilmez.session_regenerate_id(true): Kullanıcı giriş yaptığında veya yetki seviyesi değiştiğinde (örneğin yönetici paneline eriştiğinde) oturum ID’sini yeniden oluşturmak, oturum fiksasyonu ve oturum çalınması saldırılarına karşı ek bir koruma sağlar.
- Çerez Ayarları:
HttpOnlyBayrağı:setcookie()fonksiyonundahttponlyparametresinitrueolarak ayarlamak, oturum çerezlerinde olduğu gibi XSS saldırılarına karşı koruma sağlar.SecureBayrağı: Hassas çerezler içinsecureparametresinitrueolarak ayarlayarak çerezlerin yalnızca HTTPS üzerinden gönderilmesini sağlayın.SameSiteNitelikleri: CSRF (Cross-Site Request Forgery) saldırılarına karşı korunmak içinSameSite=LaxveyaSameSite=Strictniteliklerini çerezlerinize ekleyin. PHP 7.3+ ilesetcookie()içinde veyasession.cookie_samesiteayarıyla yapılandırılabilir.- Hassas Veri Saklamama: Parola gibi hassas bilgileri doğrudan çerezlerde saklamayın. “Beni hatırla” özellikleri için güvenli, karmaşıklaştırılmış tokenlar kullanın ve bu tokenları veritabanında saklayın.
- Giriş Doğrulama ve Koruma:
- Parola Hash’leme: Asla parolaları düz metin olarak saklamayın. `password_hash()` ve `password_verify()` gibi güçlü hash algoritmaları kullanın.
- Giriş Denemesi Sınırı: Brute-force saldırılarını önlemek için belirli bir IP adresinden veya kullanıcı adından gelen başarısız giriş denemelerini sınırlayın.
- CSRF Koruması: Önemli form gönderimlerinde (giriş, parola değiştirme vb.) CSRF tokenları kullanın. Bu tokenlar, form ile birlikte gönderilir ve sunucu tarafında doğrulanır.
Sonuç
PHP’deki oturum (session) ve çerez (cookie) mekanizmaları, modern web uygulamalarının temelini oluşturan, kullanıcı deneyimini kişiselleştiren ve durumu koruyan kritik araçlardır. Oturumlar, sunucu tarafında güvenli ve geçici veri depolama sağlarken, çerezler istemci tarafında küçük, kalıcı veri parçacıklarının saklanmasına olanak tanır. Kullanıcı giriş sistemleri gibi karmaşık işlevler, bu iki mekanizmanın uyumlu bir şekilde çalışmasıyla hayata geçirilir. Ancak, bu mekanizmaların gücü, beraberinde önemli güvenlik sorumlulukları da getirir. Yanlış yapılandırılmış bir oturum veya çerez uygulaması, oturum çalma, oturum fiksasyonu, XSS ve CSRF gibi ciddi güvenlik zafiyetlerine davetiye çıkarabilir. Bu nedenle, HTTPS kullanımı, HttpOnly ve Secure bayraklarının etkinleştirilmesi, oturum ID’sinin düzenli olarak yenilenmesi ve SameSite niteliklerinin doğru kullanılması gibi güvenlik en iyi uygulamalarına sıkı sıkıya bağlı kalmak hayati önem taşır. Bu prensiplere dikkat ederek, hem işlevsel hem de güvenli web uygulamaları geliştirmek mümkündür.
Resim Sahibi: ThisIsEngineering
https://www.pexels.com/@thisisengineering