PHP

PHP’de Çerez (cookie) Kullanımı

PHP'de Çerez (cookie) Kullanımı

Modern web uygulamalarında durumsuz (stateless) bir protokol olan HTTP üzerinde kullanıcı tercihlerini, oturum bilgilerini veya alışveriş sepeti içeriklerini hatırlayabilmek için çerezler (cookies) yaygın olarak kullanılır. Bir web sunucusu, tarayıcıya çerez aracılığıyla küçük metin verileri gönderir ve tarayıcı bu verileri yerel depolama alanında saklayarak sonraki isteklerde tekrar sunucuya iletir. Bu yazıda, PHP ortamında çerezlerin nasıl tanımlandığını, okunduğunu, silindiğini ve siber güvenlik ilkeleri doğrultusunda nasıl korunması gerektiğini sıfırdan ele alıyoruz.

Çerez (Cookie) Nedir ve Nasıl Çalışır?

Çerez, bir istemcinin tarayıcısında saklanan, anahtar-değer çiftlerinden oluşan en fazla 4 kilobayt boyutundaki küçük bir metin dosyasıdır. Kullanıcı bir web sayfasını ziyaret ettiğinde, sunucu yanıt başlığına (HTTP Response Header) “Set-Cookie” direktifini ekleyerek tarayıcıya bu veriyi kaydetmesini söyler. Tarayıcı, aynı etki alanına (domain) yapacağı sonraki tüm isteklerin başlık kısmına (HTTP Request Header) bu veriyi ekleyerek sunucuya geri gönderir.

PHP’de bu mekanizma, hem kullanıcı deneyimini özelleştirmek hem de oturum kimliklerini taşımak için temel bir köprü görevi görür. Ancak çerezlerin istemci tarafında tutulması, onların doğrudan manipüle edilmesine veya ele geçirilmesine açık oldukları anlamına gelir. Bu nedenle çerezlerin doğru yapılandırılması yazılım güvenliği açısından son derece önemlidir.

PHP ile Çerez Oluşturma: setcookie() Fonksiyonu

PHP’de bir çerez oluşturmak için yerleşik setcookie() fonksiyonu kullanılır. Bu fonksiyon, HTTP yanıt başlıklarını düzenlediği için HTML etiketleri veya boşluklar dahil olmak üzere sayfaya herhangi bir çıktı gönderilmeden önce çağrılmalıdır. Aksi halde PHP, başlıkların zaten gönderildiğini belirten bir hata (Headers already sent) üretir.

Fonksiyonun temel prototipi şu parametreleri içerir:

  • name: Çerezin adı.
  • value: Çerezde saklanacak değer.
  • expires_or_options: Çerezin geçerlilik süresi (Unix zaman damgası cinsinden) veya ayar dizisi.
  • path: Çerezin sunucuda geçerli olacağı yol. Genellikle tüm sitede geçerli olması için eğik çizgi verilir.
  • domain: Çerezin hangi alan adında geçerli olacağı.
  • secure: Yalnızca güvenli HTTPS bağlantısı üzerinden iletilip iletilmeyeceği.
  • httponly: JavaScript üzerinden erişilip erişilemeyeceği.

Geleneksel sözdizimi ile basit bir çerez oluşturma örneği şu şekildedir:

$cerez_adi = "tema";
$cerez_degeri = "karanlik";
$gecerlilik = time() + (86400 * 30);

setcookie($cerez_adi, $cerez_degeri, $gecerlilik, "/", "", false, false);

Yukarıdaki örnekte time() fonksiyonu ile geçerli Unix zamanı alınmış ve üzerine 30 güne karşılık gelen saniye (86400 * 30) eklenmiştir. Çerez kök dizinde (“/”) geçerli olacak şekilde tanımlanmıştır.

Modern Dizi Sözdizimi ile Çerez Tanımlama

PHP 7.3 ve sonraki sürümlerde setcookie() fonksiyonu, seçeneklerin bir ilişkisel dizi (associative array) olarak iletilmesini desteklemektedir. Bu yöntem, kodun okunabilirliğini artırır ve SameSite gibi modern güvenlik niteliklerini doğrudan yönetmeyi sağlar.

$ayarlar = [
    'expires' => time() + 3600,
    'path' => '/',
    'domain' => 'ornek.com',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Strict'
];

setcookie('kullanici_kimligi', 'usr_89234', $ayarlar);

Bu örnekte, çerez bir saat (3600 saniye) boyunca geçerli olacak şekilde yapılandırılmış, sadece HTTPS bağlantılarında çalışacak ve JavaScript erişimine kapatılacak biçimde ayarlanmıştır.

Çerez Değerlerini Okuma: $_COOKIE Süper Globali

Oluşturulan ve tarayıcı tarafından sunucuya geri gönderilen çerezlere PHP’nin önceden tanımlanmış $_COOKIE süper global dizisi üzerinden erişilir. Bir çerez setcookie() ile tanımlandığı anda mevcut sayfa yüklemesinde $_COOKIE dizisinde görünmez; değer, tarayıcının sonraki isteğinde diziye dahil edilir.

Bir çerez değerini okumadan önce varlığını kontrol etmek, olası tanımsız indeks hatalarının önüne geçer.

if (isset($_COOKIE['tema'])) {
    $secilen_tema = htmlspecialchars($_COOKIE['tema'], ENT_QUOTES, 'UTF-8');
    echo "Aktif Tema: " . $secilen_tema;
} else {
    echo "Tema tercihi bulunamadı, varsayılan açık tema kullanılıyor.";
}

Bu kod bloğunda isset() fonksiyonu çerezin var olup olmadığını denetler. İstemciden gelen veriye hiçbir zaman güvenilmeyeceği için okunan değer htmlspecialchars() fonksiyonundan geçirilerek ekrana yazdırılır.

Çerez Güncelleme ve Silme İşlemleri

PHP’de bir çerezi doğrudan yok eden bağımsız bir deletecookie() fonksiyonu bulunmaz. Bunun yerine çerez aynı adla yeniden tanımlanır ve geçerlilik süresi geçmiş bir zamana ayarlanır.

Bir çerezin değerini güncellemek için aynı isim ve yolla yeni bir değer atamak yeterlidir:

setcookie('tema', 'aydinlik', time() + (86400 * 30), '/');

Bir çerezi tarayıcıdan tamamen kaldırmak için geçerlilik süresini geçmiş bir zamana ayarlamak ve değerini boşaltmak gerekir:

if (isset($_COOKIE['tema'])) {
    setcookie('tema', '', time() - 3600, '/');
    unset($_COOKIE['tema']);
}

Yukarıdaki kodda çerezin geçerlilik süresi time() – 3600 yapılarak bir saat öncesine çekilmiştir. Tarayıcı bu başlığı aldığında süresi dolmuş çerezi diskten siler. unset() kullanımı ise mevcut çalışma anında geçerli olan PHP dizisinden değeri anında kaldırır.

Siber Güvenlik Açısından Çerez Yapılandırması

Çerezler, özellikle oturum yönetiminde (Session Hijacking ve Session Fixation saldırılarında) birincil hedef konumundadır. Bu nedenle bir çerez tanımlanırken güvenlik bayraklarının eksiksiz ayarlanması şarttır.

Dikkat edilmesi gereken temel güvenlik kriterleri şunlardır:

  • HttpOnly Bayrağı: Bu parametre true yapıldığında, tarayıcı çerezin document.cookie gibi JavaScript arabirimleri üzerinden okunmasını engeller. Bu sayede olası bir XSS (Cross-Site Scripting) zafiyetinde saldırganın kullanıcı oturum çerezini çalması zorlaşır.
  • Secure Bayrağı: Çerezin yalnızca SSL/TLS sertifikasına sahip şifreli HTTPS bağlantıları üzerinden iletilmesini sağlar. Ağ dinleme (Man-in-the-Middle) saldırılarına karşı çerezin düz metin olarak ele geçirilmesini önler.
  • SameSite Nitelikleri: CSRF (Cross-Site Request Forgery) saldırılarını engellemek amacıyla geliştirilmiştir. ‘Strict’ değeri, çerezin yalnızca aynı siteden gelen isteklerde gönderilmesini sağlarken; ‘Lax’ değeri harici bağlantılardan gelen güvenli GET isteklerinde çerezin iletilmesine izin verir.
  • Hassas Veri Depolamama: Çerezler istemci tarafında tutulur ve kullanıcılar tarafından kolaylıkla görüntülenebilir veya değiştirilebilir. Bu nedenle parola, yetki seviyesi veya kredi kartı gibi hassas bilgiler asla doğrudan çerez içine yazılmamalıdır. Bunun yerine sunucuda tutulan bir oturum kimliği (session id) çerezde saklanmalıdır.

Özet ve Sonraki Adımlar

PHP’de çerez yönetimi, web uygulamalarının durum takibini sağlamak için setcookie() fonksiyonu ve $_COOKIE süper globali üzerinden yürütülür. Doğru bir çerez mimarisi; sürenin doğru belirlenmesini, yol ve etki alanı kısıtlamalarını ve en önemlisi HttpOnly, Secure ve SameSite parametrelerinin bilinçli olarak kullanılmasını gerektirir.

Bir sonraki adımda, çerezler ile doğrudan entegre çalışan PHP Session (oturum) mimarisini inceleyebilir, session_set_cookie_params() fonksiyonunu kullanarak sunucu taraflı oturum güvenliğini bir üst seviyeye taşıyabilirsiniz.

#backend#cerezler#cookie#php#web guvenligi

Kommentare

Noch keine Kommentare. Schreiben Sie den ersten.

Kommentar schreiben

Kommentare werden nach Freigabe durch den Admin veröffentlicht.