İçeriğe geç

Form Verileriyle Çalışma: $_GET, $_POST ve Input Validation

Web geliştirmenin temel taşlarından biri, kullanıcı ile etkileşim kurmaktır. Bu etkileşimin en yaygın yolu ise HTML formlarıdır. Kullanıcıların bilgi girdiği, dosya yüklediği veya seçenekler belirlediği bu formlar, web sitelerini statik sayfalardan dinamik uygulamalara dönüştürür. Ancak bu formlardan gelen verileri toplamak, işlemek ve güvenli bir şekilde kullanmak için sunucu taraflı bir dil gereklidir ve PHP bu konuda en popüler ve güçlü seçeneklerden biridir. Bu yazıda, PHP kullanarak HTML formlarından nasıl veri alınacağını temelden başlayarak ele alacağız. Veri aktarım yöntemleri olan $_GET ve $_POST süper globallerini, aralarındaki kritik farkları ve hangi durumlarda hangisinin tercih edilmesi gerektiğini inceleyeceğiz. Ayrıca, gelen verinin güvenliğini sağlamak için isset(), empty() ve filter_input() gibi hayati fonksiyonların kullanımını pratik örneklerle açıklayacağız.

HTML formları ve PHP ilişkisi

PHP’nin form verilerini işleyebilmesi için öncelikle doğru yapılandırılmış bir HTML formuna ihtiyacımız vardır. Bir HTML formu, <form> etiketi ile başlar ve biter. Bu etiket, iki temel nitelik alır: action ve method.

  • action: Form gönderildiğinde, içindeki verilerin hangi dosyaya veya URL’ye gönderileceğini belirtir. Genellikle bu, verileri işleyecek olan PHP betiğinin adıdır (örneğin, “islem.php”).
  • method: Verilerin sunucuya nasıl gönderileceğini belirten HTTP yöntemidir. En yaygın kullanılan iki yöntem “get” ve “post”tur. Bu seçim, verilerin nasıl taşınacağını ve PHP tarafından nasıl yakalanacağını doğrudan etkiler.

Aşağıda basit bir kullanıcı kayıt formu örneği bulunmaktadır:

<form action=”kayit.php” method=”post”>
    İsim: <input type=”text” name=”kullanici_adi”><br>
    E-posta: <input type=”email” name=”eposta”><br>
    <input type=”submit” name=”gonder” value=”Kaydet”>
</form>

Bu formda, “kullanici_adi” ve “eposta” adında iki giriş alanı (input) bulunmaktadır. Kullanıcı “Kaydet” düğmesine tıkladığında, bu alanlara girilen veriler “post” yöntemiyle “kayit.php” dosyasına gönderilir. PHP tarafında bu verileri yakalamak için name niteliği kritik öneme sahiptir; çünkü PHP, verilere bu isimler üzerinden erişecektir.

$_GET ve $_POST superglobal’leri ile veri alma

PHP, formlardan ve URL’lerden gelen verilere erişmek için süper global olarak adlandırılan özel, önceden tanımlanmış diziler sunar. Form verileri için en sık kullanılanlar $_GET ve $_POST‘tur. Bu ikisi, formun method niteliğine göre verileri tutar.

$_GET kullanımı

Eğer bir formun metodu “get” olarak ayarlanmışsa, form verileri URL’nin sonuna bir sorgu dizesi (query string) olarak eklenir. Veriler, anahtar=değer çiftleri şeklinde ve birbirlerinden “&” işareti ile ayrılarak gönderilir. Örneğin: http://site.com/arama.php?sorgu=php&kategori=web. Bu yöntem genellikle arama formları veya sayfalama gibi verilerin URL’de görünmesinin sorun olmadığı durumlar için uygundur. Avantajı, sonucun yer imlerine eklenebilmesi veya paylaşılabilmesidir. Ancak hassas veriler (şifre, kimlik bilgileri) için kesinlikle kullanılmamalıdır çünkü tüm veriler URL’de açıkça görünür.

PHP tarafında $_GET verisine erişim:

$gelenSorgu = $_GET[‘sorgu’];
$gelenKategori = $_GET[‘kategori’];
echo “Aranan kelime: ” . $gelenSorgu;

$_POST kullanımı

Form metodu “post” olarak ayarlandığında, veriler HTTP isteğinin gövdesinde (body) gönderilir ve URL’de görünmez. Bu, onu şifreler, e-posta adresleri ve diğer kişisel bilgiler gibi hassas verileri göndermek için güvenli ve standart bir yöntem yapar. Ayrıca, $_GET’in aksine, gönderilebilecek veri miktarında bir sınırlama yoktur. Kullanıcı kayıt formları, giriş panelleri ve içerik gönderme formları gibi uygulamalarda tercih edilir.

PHP tarafında $_POST verisine erişim (yukarıdaki HTML form örneğine göre):

$kullaniciAdi = $_POST[‘kullanici_adi’];
$eposta = $_POST[‘eposta’];
echo “Hoş geldiniz, ” . $kullaniciAdi;

Aşağıdaki tablo, iki yöntem arasındaki temel farkları özetlemektedir:

Özellik $_GET $_POST
Görünürlük Veriler URL’de görünür. Veriler HTTP isteği gövdesinde gizlidir.
Güvenlik Hassas veriler için güvensizdir. Hassas veriler için tercih edilen yöntemdir.
Veri Limiti URL uzunluğu ile sınırlıdır (genellikle ~2000 karakter). Pratikte bir limiti yoktur (sunucu yapılandırmasına bağlıdır).
Yer İmleri Sonuçlar yer imlerine eklenebilir. Yer imlerine eklenemez.

Gelen veriyi doğrulamak ve temizlemek

Kullanıcıdan gelen hiçbir veriye güvenilmemelidir. Kötü niyetli kullanıcılar, uygulamanızda güvenlik açıkları oluşturmak için formlarınıza beklenmedik veriler gönderebilirler. Bu nedenle, gelen veriyi işlemeden önce hem varlığını kontrol etmek (doğrulama) hem de zararlı olabilecek kodlardan arındırmak (temizleme/sanitization) zorunludur. PHP bu amaçla çeşitli fonksiyonlar sunar.

  • isset(): Bu fonksiyon, bir değişkenin tanımlanıp tanımlanmadığını ve değerinin NULL olmadığını kontrol eder. Formun gönderilip gönderilmediğini veya belirli bir alanın formda mevcut olup olmadığını anlamak için kullanılır. Örneğin, if(isset($_POST[‘gonder’])) ifadesi, “gonder” isimli submit düğmesine basılıp basılmadığını kontrol eder.
  • empty(): Bir değişkenin “boş” olup olmadığını kontrol eder. Boş kabul edilen değerler: “” (boş string), 0 (tamsayı), “0” (string), NULL, FALSE ve boş bir dizi. Genellikle zorunlu alanların doldurulup doldurulmadığını kontrol etmek için kullanılır. Örneğin, if(empty($_POST[‘kullanici_adi’])) ifadesi, kullanıcı adı alanının boş bırakılıp bırakılmadığını denetler.

Bu iki fonksiyon genellikle birlikte kullanılır:

if (isset($_POST[‘kullanici_adi’]) && !empty($_POST[‘kullanici_adi’])) {
    // Kullanıcı adı hem gönderilmiş hem de boş değil.
} else {
    // Lütfen kullanıcı adınızı girin.
}

filter_input() ile modern ve güvenli veri alımı

Doğrudan $_POST veya $_GET dizilerine erişmek yerine, PHP’nin filtreleme eklentisini kullanmak çok daha güvenli ve modern bir yaklaşımdır. filter_input() fonksiyonu, harici bir kaynaktan (form gibi) veri alırken aynı anda hem doğrulama (validation) hem de temizleme (sanitization) yapmanızı sağlar. Bu, kodunuzu daha güvenli ve okunaklı hale getirir.

Kullanımı: filter_input(kaynak, degisken_adi, filtre_tipi);

  • Kaynak: Verinin nereden geldiği. Formlar için INPUT_POST veya INPUT_GET kullanılır.
  • Değişken Adı: Form elemanının name niteliği.
  • Filtre Tipi: Uygulanacak filtre. Örneğin, FILTER_SANITIZE_SPECIAL_CHARS HTML etiketlerini zararsız hale getirir, FILTER_VALIDATE_EMAIL ise geçerli bir e-posta formatını denetler.

Örnek:

$email = filter_input(INPUT_POST, ‘eposta’, FILTER_VALIDATE_EMAIL);
$username = filter_input(INPUT_POST, ‘kullanici_adi’, FILTER_SANITIZE_SPECIAL_CHARS);

if ($email === false) {
    echo “Geçersiz e-posta formatı!”;
} else {
    echo “Girilen e-posta: ” . $email;
}
echo “Temizlenmiş kullanıcı adı: ” . $username;

Bu yöntem, değişkenin var olup olmadığını kontrol etme ihtiyacını ortadan kaldırır ve veriyi tek bir adımda güvenli bir şekilde almanızı sağlar. Bu nedenle, modern PHP uygulamalarında standart olarak kabul edilir.

Sonuç olarak, PHP ile HTML formlarından veri almak, web uygulamalarının temelini oluşturan dinamik bir süreçtir. Bu süreçte, verinin nasıl gönderileceğini belirleyen $_GET ve $_POST metotlarının farklarını anlamak kritik öneme sahiptir. $_GET, URL üzerinden veri taşıyarak paylaşılabilir bağlantılar oluştururken, hassas veriler için güvensizdir. $_POST ise veriyi HTTP gövdesinde gizleyerek güvenlik ve daha yüksek veri kapasitesi sunar. Ancak en önemli ders, kullanıcıdan gelen hiçbir veriye varsayılan olarak güvenmemektir. Gelen verinin varlığını isset() ile, boş olup olmadığını empty() ile kontrol etmek temel bir adımdır. Güvenliği bir üst seviyeye taşımak ve XSS gibi saldırıları önlemek için ise filter_input() fonksiyonunu kullanarak verileri hem doğrulamak hem de temizlemek, modern ve sağlam PHP uygulamaları geliştirmenin vazgeçilmez bir pratiğidir. Bu temelleri sağlam bir şekilde öğrenmek, güvenli ve etkileşimli web siteleri oluşturmanın kapısını aralar.

Resim Sahibi: Google DeepMind
https://www.pexels.com/@googledeepmind

Etiketler:

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir