Yazılım

PHP Süper Globaller: $_GET, $_POST, $_SESSION, $_COOKIE ve Diğerleri

15 Mart 2026 10 dk okuma 11 görüntülenme

Ormandaki İşaret Fişekleri: PHP Süper Globallerine Yakından Bakış

Merhaba, ben Buğrahan. Eğer bu yazı dizisini başından beri takip ediyorsanız, değişkenlerin o dar alanlarından çıkıp döngülerin tekrarlayan ritmine nasıl ayak uydurduğumuzu hatırlarsınız. Kod yazarken, tıpkı ormanda kamp kurarken olduğu gibi, her şeyin bir yeri ve bir kuralı vardır. Ancak bazen öyle araçlara ihtiyaç duyarsınız ki, kampın neresinde olursanız olun elinizi attığınızda orada olmasını istersiniz. İşte PHP serimizin bu 7. yazısında, tam olarak bu işe yarayan o sihirli araçları, yani PHP süper globaller dünyasını konuşacağız.

Yazılıma ilk başladığım 2005 yıllarında, değişkenlerin "kapsam" (scope) mantığını anlamak beni epey zorlamıştı. Bir fonksiyonun içinde tanımladığım değişkene, fonksiyonun dışından ulaşamamak bana çok anlamsız geliyordu. "Nasıl yani, az önce yazdım ya seni!" diye ekrana bakakaldığım çok gece olmuştur. Zamanla öğrendim ki, bu kısıtlama aslında kodun güvenliği ve temizliği için şart. Her değişken her yerden erişilebilir olsaydı, devasa bir projede kimin eli kimin cebinde belli olmazdı.

Fakat bazı istisnalar vardır. İşte Süper Global dediğimiz yapılar, PHP'nin bize sunduğu, projenin neresinde olursanız olun (bir fonksiyonun, bir sınıfın veya başka bir dosyanın içinde) anında erişebildiğiniz önceden tanımlanmış dizilerdir. Neden "süper" derseniz; çünkü hiçbir ekstra izin veya tanımlama gerektirmeden emrinize amadedirler. Hadi gelin, Pixel Lab® mutfağında her gün kullandığımız bu arkadaşları tek tek masaya yatıralım.

Görünen Köy Kılavuz İstemez: $_GET ve $_POST

Web programlamanın temeli, kullanıcıyla etkileşime girmektir. Kullanıcıdan veri almadan yapacağınız bir site, duvara asılmış bir tablodan farksızdır. Kullanıcıdan veri almanın en temel iki yolu ise $_GET ve $_POST süper globalleridir.

$_GET kullanımı, ormanda yürürken ağaçlara bıraktığınız izler gibidir. Herkes görebilir. Veriler, URL'nin sonuna eklenerek gönderilir (örneğin: site.com/urun.php?id=5&renk=kirmizi). Bu yöntemi genellikle arama formlarında, filtrelemelerde veya sayfalama işlemlerinde tercih ediyorum. Neden mi? Çünkü kullanıcı o anki arama sonucunun linkini kopyalayıp bir arkadaşına göndermek isteyebilir. URL'de taşınan veri, paylaşılabilir bir veridir.

Ancak işin içine şifreler, kredi kartı bilgileri veya uzun metinler girdiğinde $_GET kullanmak, kamp ateşine benzin dökmek gibidir. İşte burada $_POST devreye girer. $_POST ile gönderilen veriler URL'de görünmez, HTTP isteğinin gövdesinde (body) gizlice taşınır. Sanki sırt çantanızın gizli bölmesinde taşıdığınız özel bir not gibidir.

Aman dikkat: İster $_GET ister $_POST kullanın, kullanıcıdan gelen veriye asla ama asla güvenmeyin. Formdan gelen bir veriyi doğrudan veritabanına yazmak veya ekrana basmak, sisteminize XSS veya CSRF gibi saldırılar için açık kapı bırakmaktır. Gelen veriyi her zaman filtreleyin ve temizleyin.

Sunucunun Kimliği: $_SERVER

Bazen ziyaretçinin kim olduğunu, nereden geldiğini veya hangi tarayıcıyı kullandığını bilmek istersiniz. İşte $_SERVER dizisi, sunucunuzun ve o anki isteğin tüm haritasını barındırır.

Bu dizinin içinde onlarca anahtar var ama benim en çok kullandıklarım şunlar:

  • $_SERVER['REMOTE_ADDR']: Kullanıcının IP adresini verir. Güvenlik logları tutarken veya aynı IP'den gelen spam istekleri engellerken hayat kurtarır.
  • $_SERVER['HTTP_USER_AGENT']: Kullanıcının hangi cihazdan, hangi tarayıcıdan girdiğini söyler. (Gerçi günümüzde bunu manipüle etmek çok kolay ama yine de istatistik için işe yarar).
  • $_SERVER['REQUEST_METHOD']: Sayfaya GET ile mi yoksa POST ile mi gelindiğini söyler. Form işlemlerinde en güvendiğim kontroldür.
  • $_SERVER['PHP_SELF']: Üzerinde çalıştığınız dosyanın yolunu verir. Formların action kısmında kendi kendine veri göndermesi için sıkça kullanılır.

Kullanıcıyı Hatırlama Sanatı: $_SESSION ve $_COOKIE

HTTP protokolü "durumsuz" (stateless) bir protokoldür. Yani siz bir sayfadan diğerine geçtiğinizde, sunucu sizin az önceki kişi olduğunuzu unutur. Peki o zaman e-ticaret sitelerinde sepetimiz nasıl dolu kalıyor? Veya giriş yaptıktan sonra sayfalar arası gezerken nasıl "Hoş geldin Buğrahan" yazısını görmeye devam ediyoruz?

İşte bu mucizeyi PHP session yönetimi ve çerezlere (cookies) borçluyuz.

$_COOKIE, kullanıcının kendi bilgisayarında (tarayıcısında) saklanan küçük metin dosyalarıdır. "Beni Hatırla" butonunun arkasındaki güçtür. Ancak veriler kullanıcının elinde olduğu için içine asla şifre veya kritik bir bilgi koymamalısınız.

$_SESSION ise çok daha güvenlidir çünkü veriler sunucuda saklanır. Kullanıcıya sadece bir "Session ID" (oturum kimliği) verilir. Kullanıcı her sayfa değişiminde bu kimliği gösterir, sunucu da arkada o kimliğe ait verileri $_SESSION dizisinden çeker.

Küçük bir anı: Yıllar önce bir müşteri projesinde, admin panelinde çıkış yapma fonksiyonunu yazarken ufak bir dalgınlık yapmıştım. Sadece o anki kullanıcının session'ını silmek yerine, sunucudaki tüm oturumları uçuran bir komut yazmışım. Sisteme giriş yapmış yüzlerce kullanıcı aynı anda dışarı atıldı. O gün telefonlarım susmamıştı. O zamandan beri session_destroy() yazarken iki kere düşünürüm!

Dosyaların Yolculuğu: $_FILES

Bir kullanıcıdan profil fotoğrafı veya bir PDF belgesi almanız gerektiğinde, $_POST tek başına yetersiz kalır. Çünkü dosyalar metin değil, ikili (binary) verilerdir. Bir formda enctype="multipart/form-data" özelliğini kullandığınız an, sahneye $_FILES süper globali çıkar.

Bu dizi, yüklenen dosya hakkında bilmeniz gereken her şeyi size bir alt dizi olarak sunar:

  • name: Dosyanın orijinal adı.
  • type: Dosyanın MIME türü (örn: image/jpeg).
  • size: Dosyanın bayt cinsinden boyutu.
  • tmp_name: Dosyanın sunucuda geçici olarak tutulduğu yer.
  • error: Yükleme sırasında bir hata olup olmadığını belirten kod.

Dosya yüklemek, web güvenliğinin en hassas noktalarından biridir. Sadece type kontrolü yapmak veya uzantıya bakmak yetmez. Kötü niyetli biri, içine PHP kodu gizlenmiş bir dosyaya .jpg uzantısı verip sunucunuza sızabilir. Dosya yükleme işlemleri, kesinlikle üzerine titrenmesi gereken bir konudur.

Her Şeyi Kapsayan Çuval: $_REQUEST

$_REQUEST, aslında $_GET, $_POST ve $_COOKIE verilerinin hepsini içinde barındıran devasa bir çuvaldır. Verinin nereden geldiğini umursamıyorsanız pratik görünebilir.

Ancak işin aslı şu ki; ben $_REQUEST kullanmayı pek sevmiyorum. Temiz kod (Clean Code) felsefesine inanan biri olarak, sistemin öngörülebilir olmasını isterim. Bir verinin URL'den mi yoksa gizli bir formdan mı geldiğini bilmek, o veriyi nasıl işleyeceğimi belirler. $_REQUEST kullanmak, sırt çantanıza elinizi bakmadan daldırıp ne gelirse onu kullanmak gibidir; elinize bir elma da gelebilir, açık unutulmuş bir çakı da. Bu yüzden her zaman kaynağı belli olan süper globalleri tercih ederim.

Modern Dünyanın Sessiz Kahramanları: $_ENV ve $GLOBALS

Gelelim daha az göz önünde olan ama mimari açıdan kritik olanlara.

$_ENV, sunucunun ortam değişkenlerini (environment variables) tutar. Günümüzde, özellikle Laravel veya Symfony gibi framework'lerde veya saf PHP ile modern bir yapı kurarken veritabanı şifreleri, API anahtarları gibi kritik bilgileri kodun içine yazmayız. Bunları .env isimli bir dosyada tutarız ve uygulama çalışırken bu bilgiler $_ENV üzerinden okunur. Bu, kodunuzu GitHub gibi platformlara yüklerken şifrelerinizin ifşa olmasını engeller.

$GLOBALS ise, adından da anlaşılacağı üzere, PHP'deki tüm global değişkenleri içinde barındıran bir dizidir. Kendi tanımladığınız bir değişkene her yerden ulaşmak için kullanılır. Ancak modern yazılım mimarisinde (Özellikle Nesne Yönelimli Programlamada) $GLOBALS kullanmak pek hoş karşılanmaz. Çünkü her yerden erişilebilen ve değiştirilebilen değişkenler, projeniz büyüdükçe "bu değeri kim, nerede değiştirdi?" kabusuna dönüşür.

Hadi Kodlayalım: Temiz Bir Form İşleme Örneği

Bu kadar teorik bilgiden sonra, bilgisayarı kapatıp ormana kaçmadan önce size küçük, temiz ve güvenli bir form işleme şablonu bırakmak istiyorum. Bu yapıyı kendi projelerinizde rahatlıkla kullanabilirsiniz.


<?php
// Her şeyden önce, eğer session kullanacaksak en üstte başlatmalıyız.
session_start();

// Hata ve başarı mesajlarını tutacağımız değişkenler
$mesaj = "";
$hata = false;

// Formun POST edilip edilmediğini kontrol ediyoruz.
// İşte $_SERVER['REQUEST_METHOD'] burada hayat kurtarıyor!
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    
    // Gelen veriyi alıp, olası zararlı kodlardan arındırıyoruz.
    // trim() ile boşlukları siliyor, htmlspecialchars() ile HTML etiketlerini zararsız hale getiriyoruz.
    $kullanici_adi = trim(htmlspecialchars($_POST['kullanici_adi'] ?? ''));
    
    // Veri boş mu diye kontrol ediyoruz
    if (empty($kullanici_adi)) {
        $mesaj = "Lütfen kullanıcı adınızı girin!";
        $hata = true;
    } else {
        // Her şey yolundaysa veriyi session'a kaydediyoruz
        $_SESSION['aktif_kullanici'] = $kullanici_adi;
        $mesaj = "Hoş geldin, " . $kullanici_adi . "! Giriş başarılı.";
    }
}
?>

<!-- HTML Kısmı -->
<div class="form-alani">
    <?php if(!empty($mesaj)): ?>
        <p style="color: <?php echo $hata ? 'red' : 'green'; ?>">
            <?php echo $mesaj; ?>
        </p>
    <?php endif; ?>

    <!-- PHP_SELF kullanarak formun aynı sayfaya post edilmesini sağlıyoruz -->
    <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST">
        <label for="kullanici_adi">Kullanıcı Adınız:</label>
        <input type="text" id="kullanici_adi" name="kullanici_adi">
        <button type="submit">Giriş Yap</button>
    </form>
</div>

Yukarıdaki kod bloğunda dikkat ederseniz, $_POST ile veriyi alırken ona körü körüne güvenmedim. htmlspecialchars() fonksiyonundan geçirerek olası bir XSS saldırısının dişlerini söktüm. Ardından $_SERVER['PHP_SELF'] ile formu aynı sayfaya güvenli bir şekilde yönlendirdim ve başarılı bir işlemi $_SESSION ile kayıt altına aldım. İşte PHP süper globallerinin uyum içinde dans etmesi tam olarak budur.

Buğrahan'ın mutfağından şimdilik bu kadar. PHP süper globallerini anlamak, webin arka planında dönen trafiği okuyabilmek demektir. Bu değişkenlerin ne işe yaradığını ve sınırlarını bildiğinizde, kurduğunuz sistemler çok daha sade, güvenli ve temiz olacaktır.

Bir sonraki yazımızda, bu aldığımız verileri artık kalıcı hale getirmek için veritabanı kapılarını aralayacağız ve PDO (PHP Data Objects) ile güvenli bağlantılar kurmanın yollarını konuşacağız. O zamana kadar kodu temiz tutmayı, bilgisayar başında fazla kambur durmamayı ve fırsat buldukça dışarı çıkıp doğanın o muazzam sessizliğini dinlemeyi unutmayın.

Siz kendi projelerinizde en çok hangi süper global ile sorun yaşadınız veya hangisini kullanırken "vay canına" dediniz? Aşağıdaki yorumlarda deneyimlerinizi paylaşırsanız, kamp ateşinin etrafında toplanmış gibi hep beraber üzerine konuşabiliriz. Görüşmek üzere!

Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yazın!

Yorum Yaz

E-posta adresiniz yayınlanmayacaktır.
0 / 2000