Web uygulamalarının en temel işlevi, kullanıcı ile sunucu arasında karşılıklı veri iletimini sağlamaktır. Kullanıcının bir arama kutusuna yazdığı kelime, üyelik formuna girdiği bilgiler veya bir dosyayı yükleme isteği HTTP protokolü aracılığıyla sunucuya iletilir. PHP, bu verileri yakalamak ve işlemek için yerleşik olarak süper küresel (superglobal) diziler sunar. Bu dizilerin başında ise $_GET ve $_POST gelir.
Bir web geliştiricisi veya siber güvenlik uzmanı adayı için bu iki yöntemin nasıl çalıştığını, aralarındaki farkları ve güvenlik risklerini anlamak temel bir gerekliliktir. Yanlış metot seçimi ya da filtrelenmemiş veri işleme süreçleri, uygulamaları doğrudan siber saldırılara açık hale getirebilir.
HTTP İstekleri ve PHP Süper Küreselleri
Kullanıcı bir web sayfasına bağlandığında tarayıcı, sunucuya bir HTTP isteği gönderir. Bu istek belirli metotlar (GET, POST, PUT, DELETE vb.) kullanılarak yapılır. PHP, gelen bu istekleri otomatik olarak ayrıştırır ve betiğin her yerinden erişilebilen süper küresel dizilere dönüştürür.
- Süper küreseller tanımlama gerektirmeyen, doğrudan erişilebilen önceden tanımlı dizilerdir.
- Fonksiyonların veya sınıfların içerisinden global anahtar kelimesine ihtiyaç duyulmadan çağrılabilirler.
- Kullanıcıdan gelen tüm girdiler her zaman güvensiz kabul edilmeli ve bu dizilerden alınan değerler doğrudan işleme sokulmamalıdır.
$_GET Süper Küreseli ile Veri Alma
GET metodu, verilerin URL üzerinden anahtar-değer çiftleri şeklinde taşındığı yöntemdir. Tarayıcı adres çubuğunda görülen parametreler bu yöntemle iletilir. Genellikle sunucudan veri sorgulamak, filtreleme yapmak veya belirli bir içeriği görüntülemek amacıyla kullanılır.
GET Yöntemini Kullanan Bir HTML Formu
Aşağıdaki örnekte, kullanıcının bir arama terimi girmesini sağlayan basit bir HTML formu yer almaktadır. Form etiketi içerisindeki method="get" ifadesi, verilerin GET yöntemiyle iletileceğini belirtir.
<form action="arama.php" method="get">
<label for="kelime">Aranacak Kelime:</label>
<input type="text" id="kelime" name="sorgu">
<button type="submit">Ara</button>
</form>
Kullanıcı bu formda “php dersleri” yazıp butona bastığında, tarayıcı adresi şu biçimi alır: arama.php?sorgu=php+dersleri
Burada ? işaretinden sonra gelen kısım sorgu dizgisidir (query string). sorgu anahtarı formdaki name değerinden gelir, eşittir işaretinden sonrası ise kullanıcının girdiği veridir.
GET Verisinin PHP Tarafında Karşılanması
URL üzerinden gelen veriyi PHP betiğimizde karşılamak için $_GET dizisi kullanılır.
if (isset($_GET['sorgu'])) {
$aranan = $_GET['sorgu'];
echo "Aranan kelime: " . htmlspecialchars($aranan);
} else {
echo "Lütfen bir arama terimi girin.";
}
Yukarıdaki kod bloğunda öncelikle isset() fonksiyonu ile sorgu adında bir GET parametresinin gelip gelmediği kontrol edilir. Eğer parametre mevcutsa, değişken atanır ve htmlspecialchars() fonksiyonundan geçirilerek ekrana yazdırılır. Bu fonksiyon, kullanıcının kötü niyetli HTML/JavaScript etiketleri göndermesini engelleyen temel bir güvenlik önlemidir.
GET metodunun öne çıkan nitelikleri şunlardır:
- Veriler URL üzerinden iletildiği için kullanıcı tarafından açıkça görülebilir.
- Tarayıcı geçmişinde saklanabilir ve yer imlerine eklenebilir.
- URL uzunluk sınırları nedeniyle çok büyük boyutlu verilerin iletimi için uygun değildir.
- Şifre, kredi kartı numarası gibi hassas veriler asla GET ile iletilmemelidir.
$_POST Süper Küreseli ile Veri Alma
POST metodu, verilerin URL yerine HTTP istek gövdesi (HTTP request body) içerisinde sunucuya iletildiği yöntemdir. Sunucu üzerinde bir değişiklik oluşturacak, yeni bir kayıt ekleyecek veya hassas veriler taşıyacak işlemler için tercih edilir.
POST Yöntemini Kullanan Bir HTML Formu
Aşağıdaki form, kullanıcının e-posta adresi ve şifre ile giriş yapmasını sağlayan tipik bir senaryodur.
<form action="giris.php" method="post">
<label for="eposta">E-posta:</label>
<input type="email" id="eposta" name="email">
<label for="parola">Şifre:</label>
<input type="password" id="parola" name="sifre">
<button type="submit">Giriş Yap</button>
</form>
Bu form gönderildiğinde URL adresinde hiçbir değişiklik görünmez. Veriler arka planda, HTTP isteğinin gövdesinde şifrelenmemiş (HTTPS kullanılmıyorsa) olarak iletilir.
POST Verisinin PHP Tarafında Karşılanması
Gönderilen form verileri PHP betiğinde $_POST dizisiyle yakalanır.
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = isset($_POST['email']) ? trim($_POST['email']) : '';
$sifre = isset($_POST['sifre']) ? $_POST['sifre'] : '';
if (!empty($email) && !empty($sifre)) {
echo "Giriş isteği alındı: " . htmlspecialchars($email);
} else {
echo "Lütfen tüm alanları doldurun.";
}
}
Bu örnekte ilk olarak $_SERVER['REQUEST_METHOD'] kontrolü yapılarak isteğin gerçekten POST metoduyla gelip gelmediği doğrulanır. Ardından alanların boş olup olmadığı kontrol edilir. trim() fonksiyonu ile e-posta girdisinin başındaki ve sonundaki boşluklar temizlenir.
POST metodunun temel avantajları şunlardır:
- URL adresinde veri görünmediği için kullanıcı arayüzü temiz kalır.
- Tarayıcı geçmişinde parametreler depolanmaz.
- Dosya yükleme gibi büyük boyutlu veri transferlerine olanak tanır.
- Veri tabanında kayıt oluşturma, güncelleme veya silme işlemleri için doğru standarttır.
Güvenlik: Kullanıcı Girdilerinin Doğrulanması ve Temizlenmesi
Bir web uygulamasında form verisi alırken temel kural şudur: Kullanıcıdan gelen hiçbir girdiye güvenilmez. Geliştiriciler yalnızca veriyi almakla kalmamalı, veriyi doğrulamalı (validation) ve temizlemelidir (sanitization).
1. XSS (Cross-Site Scripting) Koruması
Kullanıcının form alanlarına <script>alert('xss')</script> gibi kötü amaçlı betikler girmesi yaygın bir saldırı yöntemidir. Bu girdiyi doğrudan ekrana basarsanız, saldırganın kodu kurbanın tarayıcısında çalışır.
Bunu önlemek için PHP’nin htmlspecialchars() fonksiyonu kullanılır:
$ad = htmlspecialchars($_POST['ad'], ENT_QUOTES, 'UTF-8');
Bu işlem < ve > gibi özel HTML karakterlerini zararsız HTML varlıklarına (< ve >) dönüştürür.
2. Modern Doğrulama: filter_input Kullanımı
Doğrudan $_GET veya $_POST dizilerine erişmek yerine, PHP’nin yerleşik filtreleme kütüphanesini kullanmak çok daha güvenli ve modern bir yaklaşımdır. filter_input() fonksiyonu, değişkenin varlığını ve türünü tek bir adımda denetler.
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false || $email === null) {
echo "Geçersiz e-posta formatı girdiniz.";
} else {
echo "Doğrulanmış e-posta: " . htmlspecialchars($email);
}
Bu yaklaşım, e-postanın geçerli bir formatta olup olmadığını otomatik kontrol eder ve tanımsız indeks hatalarını önler. Aynı mantık tamsayı doğrulaması için FILTER_VALIDATE_INT veya URL doğrulaması için FILTER_VALIDATE_URL ile de uygulanabilir.
Özet ve Sonraki Adım
$_GET ve $_POST, PHP ile web uygulaması geliştirmenin temel taşlarıdır. Veri sadece okunacak veya listelenecekse GET metodu, veride değişiklik yapılacaksa veya hassas veriler taşınacaksa POST metodu tercih edilmelidir. Her iki durumda da gelen veriler filtreleme ve doğrulama süreçlerinden geçirilmeden asla kullanılmamalıdır.
Bir sonraki adımda, alınan bu form verilerini veri tabanına güvenli bir şekilde kaydetmek için PDO (PHP Data Objects) yapısını ve SQL Injection saldırılarını engelleyen Prepared Statements (Hazırlıklı İfadeler) kullanımını inceleyebilirsiniz.


Comentarios
Aún no hay comentarios. Sé el primero en comentar.