PHP Süper Globaller: $_GET, $_POST, $_SESSION ve $_SERVER

PHP Süper Globaller: $_GET, $_POST, $_SESSION ve $_SERVER

4 dakika okuma

Süper globaller, betiğin her noktasından ek tanımlama yapmadan erişilebilen dizilerdir. Kapsam kuralları bunlara uygulanmaz; fonksiyon içinde de doğrudan okunabilirler. Pratikte en önemli ortak özellikleri şudur: büyük bölümü doğrudan kullanıcıdan gelir ve hiçbiri güvenilir veri kaynağı değildir.

$_GET ve $_POST

$_GET adres satırındaki sorgu parametrelerini, $_POST istek gövdesindeki form alanlarını taşır. Adres satırı tarayıcı geçmişinde ve sunucu kayıtlarında göründüğü için parola gibi veriler asla GET ile taşınmaz.

PHP6 satır
$sayfa = (int) ($_GET['sayfa'] ?? 1);
$arama = trim($_GET['q'] ?? '');

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $eposta = trim($_POST['eposta'] ?? '');
}

Var olmayan anahtara erişim uyarı ürettiği için null birleştirme operatörü ile varsayılan değer verilir. Sayısal beklenen alanlarda tip dönüşümü yapmak, sonraki adımlarda beklenmeyen değerlerin dolaşmasını engeller.

$_SERVER ve güvenilmeyecek alanlar

$_SERVER hem sunucudan hem istemciden gelen bilgileri bir arada tutar. Ayrımı bilmek önemlidir: HTTP ile başlayan alanların tamamı istemci tarafından gönderilir ve serbestçe değiştirilebilir.

  • HTTP_USER_AGENT, HTTP_REFERER, HTTP_HOST: istemci belirler, doğrulanmadan kullanılmaz.
  • REQUEST_METHOD, REQUEST_URI: yönlendirme kararları için kullanılabilir, ancak içeriği yine kullanıcıdan gelir.
  • REMOTE_ADDR: sunucunun gördüğü bağlantı adresi, güvenilirdir. Vekil sunucu arkasında ise doğru değer ancak vekil yapılandırmasına güvenildiğinde elde edilir.

Adres tabanlı yönlendirmede HTTP_HOST yerine yapılandırmada tanımlı sabit alan adı kullanılmalıdır. Aksi halde saldırgan gönderdiği başlıkla üretilen bağlantıları kendi alan adına yönlendirebilir.

$_SESSION ve oturum güvenliği

Oturum verisi sunucuda tutulur, tarayıcıda yalnızca oturum kimliği bulunur. Bu kimliğin ele geçirilmesi oturumun devralınması anlamına geldiği için giriş sonrasında kimliğin yenilenmesi zorunludur:

PHP9 satır
session_start();

// başarılı giriş sonrası
session_regenerate_id(true);
$_SESSION['kullanici_id'] = $kullanici['id'];

// çıkış
$_SESSION = [];
session_destroy();

Oturum çerezinin ayarları oturum başlatılmadan önce yapılandırılır. Bu ayarlar çerezin betiklerden okunmasını ve alan adı dışına gönderilmesini engeller:

PHP6 satır
session_set_cookie_params([
    'httponly' => true,
    'secure' => true,
    'samesite' => 'Lax',
]);
session_start();

$_COOKIE

Çerezler tamamen kullanıcı tarafında saklandığı için içeriklerine güvenilmez. Yetki bilgisi çerezde tutulmaz; çerez yalnızca sunucudaki kaydı işaret eden bir anahtar taşır. Çerez yazarken de aynı güvenlik bayrakları verilir:

PHP7 satır
setcookie('tema', 'koyu', [
    'expires' => time() + 86400 * 30,
    'path' => '/',
    'httponly' => true,
    'secure' => true,
    'samesite' => 'Lax',
]);

$_FILES ve filter_input

Yüklenen dosyalar $_FILES dizisinde gelir. Dizideki tür bilgisi tarayıcı tarafından gönderildiği için doğrulama amacıyla kullanılmaz; içerik sunucuda ayrıca incelenmelidir. Dosya yükleme ayrıntıları serinin son yazısında ele alınıyor.

Girdileri okurken filter_input kullanmak, okuma ve doğrulamayı tek adımda birleştirir. Beklenen biçime uymayan değer için false döner:

PHP7 satır
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
$eposta = filter_input(INPUT_POST, 'eposta', FILTER_VALIDATE_EMAIL);

if ($id === false || $id === null) {
    http_response_code(400);
    exit;
}

Oturum verisi nerede tutulur?

Oturum verisi varsayılan olarak sunucudaki geçici dizine dosya biçiminde yazılır. Bu dizin işletim sistemi tarafından düzenli aralıklarla temizlendiği için, oturumların beklenenden erken düşmesinin en yaygın nedeni budur. Ömür süresi yapılandırmadan ayarlanır.

Birden fazla sunucuya dağıtılan uygulamalarda dosya tabanlı saklama sorun çıkarır: kullanıcı ikinci sunucuya düştüğünde oturumu bulunamaz. Bu durumda oturum verisi ortak bir depoya, örneğin veritabanına ya da bellek içi bir önbelleğe taşınır.

Süper globalleri koda yaymamak

Süper globallere her noktadan erişilebilmesi pratik görünür, ancak kodun her yerine dağıldıklarında iki sorun çıkar. Birincisi, bir değerin nereden geldiği izlenemez hale gelir. İkincisi, test yazmak zorlaşır; çünkü fonksiyonun davranışı parametrelerine değil ortama bağlı olur.

Çözüm, girdileri tek bir noktada okuyup fonksiyonlara parametre olarak geçmektir. Küçük bir yardımcı bile bu dağılmayı büyük ölçüde engeller:

PHP9 satır
function istekDegeri(string $anahtar, ?string $varsayilan = null): ?string
{
    $deger = $_POST[$anahtar] ?? $_GET[$anahtar] ?? null;

    return is_string($deger) ? trim($deger) : $varsayilan;
}

// iş mantığı süper globali hiç görmez
kayitOlustur(istekDegeri('ad'), istekDegeri('eposta'));

Kontrol listesi

  • Süper globaller doğrudan kullanılmaz, önce doğrulanır.
  • Parola ve belirteç gibi veriler adres satırında taşınmaz.
  • Giriş sonrasında oturum kimliği yenilenir.
  • Oturum ve çerezlerde httponly, secure ve samesite ayarlanır.
  • HTTP ile başlayan $_SERVER alanları doğrulanmadan karara dahil edilmez.

PHP eğitim serisi

Bu yazı, temel sözdiziminden üretim ortamına kadar ilerleyen 25 bölümlük serinin bir parçası. Bölümler sırayla okunacak biçimde hazırlandı, ancak her biri tek başına da kullanılabilir.

Temeller

  1. Kurulum ve temel sözdizimi
  2. Döngüler ve akış kontrolü
  3. Diziler
  4. Fonksiyonlar
  5. String fonksiyonları
  6. Süper globaller (bu yazı)
  7. Form işleme
  8. Dosya işlemleri

Dilin ayrıntıları

  1. Tip sistemi ve strict_types
  2. Hata ve istisna yönetimi
  3. Düzenli ifadeler
  4. Tarih ve saat işlemleri

Nesne yönelimli PHP

  1. Sınıf ve nesne
  2. Kalıtım, arayüz ve trait
  3. Statik üyeler, sabitler ve enum
  4. Namespace, Composer ve autoload

Veri ve güvenlik

  1. PDO ile veritabanı işlemleri
  2. Oturum yönetimi ve kimlik doğrulama
  3. Güvenli çıktı ve XSS
  4. JSON ile veri değişimi

Dış dünya ve üretim

  1. cURL ile dış API çağırma
  2. Kendi REST API'ni yazmak
  3. PHPUnit ile birim test
  4. Hata ayıklama ve performans ölçümü
  5. Üretime alma ve güvenlik

Yorumlar

Bu form reCAPTCHA ile korunur; Google Gizlilik Politikası ve Hizmet Şartları geçerlidir.

İlk yorumu sen yap.

İlgili Yazılar