Yazılım & Kodlama

Form Doğrulama: İstemci ve Sunucu Tarafını Birlikte Kurmak

Form doğrulama sadece kullanıcıya kolaylık değil, bir güvenlik meselesidir. İstemci tarafı deneyim için, sunucu tarafı ise güvenlik için gereklidir; ikisini birlikte doğru kurmayı anlatıyoruz.

Form Doğrulama: İstemci ve Sunucu Tarafını Birlikte Kurmak

Formlar, bir web uygulamasının dış dünyaya açılan kapılarıdır. Kullanıcı adı, e-posta, adres, ödeme bilgisi... Her form, kullanıcıdan veri alır ve o veri sisteminizin derinliklerine akar. İşte tam bu yüzden form doğrulama (form validation) hem bir kullanıcı deneyimi hem de bir güvenlik meselesidir. Yaygın bir yanılgı, doğrulamayı yalnızca tarayıcıda yapıp işi bitmiş saymaktır. Bu yazıda, neden iki katmanlı doğrulamanın şart olduğunu ve her katmanın hangi işi üstlendiğini net biçimde ele alacağız.

Form Doğrulama: İstemci ve Sunucu Tarafını Birlikte Kurmak
Veritabanı tasarımı

İki Katman, İki Farklı Amaç

Form doğrulama iki yerde yapılabilir: istemci tarafında (client-side, yani tarayıcıda) ve sunucu tarafında (server-side, yani backend'de). Yeni başlayanların en büyük hatası, bu ikisini birbirinin alternatifi sanmaktır. Oysa ikisi tamamen farklı amaçlara hizmet eder ve ikisi de gereklidir.

  • İstemci tarafı doğrulama: Amacı hız ve kolaylıktır. Kullanıcı formu göndermeden önce hataları anında görür; sunucuya gidip gelme beklemez.
  • Sunucu tarafı doğrulama: Amacı güvenliktir. Kullanıcının tarayıcısında olan biten her şey manipüle edilebilir; son söz daima sunucundur.
İstemci doğrulama nezakettir; sunucu doğrulama güvenliktir. Birini kibardan, diğerini bekçiden say. İkisi de olmadan kapı ya kaba ya da savunmasız kalır.

İstemci Tarafı: Anında Geri Bildirim

Kullanıcı bir formu doldururken, hatayı öğrenmek için "gönder" düğmesine basıp saniyeler beklememesi gerekir. Modern tarayıcılar HTML'in yerleşik doğrulama özellikleriyle bunu büyük ölçüde ücretsiz sunar.

<form>
  <input type="email" required placeholder="E-posta">
  <input type="text" minlength="3" required placeholder="Ad">
  <button type="submit">Gönder</button>
</form>

Burada required, type="email" ve minlength gibi öznitelikler, tarayıcının otomatik kontrol yapmasını sağlar. Daha zengin geri bildirim için JavaScript ekleyebilirsiniz:

const form = document.querySelector('form');
form.addEventListener('submit', (e) => {
  const email = form.querySelector('[type=email]');
  if (!email.value.includes('@')) {
    e.preventDefault();
    email.classList.add('hata');
  }
});

Bu katman deneyimi akıcı kılar; ama unutulmaması gereken şudur: kullanıcı JavaScript'i kapatabilir, isteği doğrudan gönderebilir veya tarayıcı araçlarıyla kuralları atlayabilir. Bu yüzden istemci doğrulaması asla tek başına yeterli değildir.

Sunucu Tarafı: Gerçek Bekçi

Sunucu, kullanıcının kontrolünde olmayan tek yerdir. Bu yüzden kritik tüm doğrulama burada tekrar yapılmalıdır. Kural nettir: gelen hiçbir veriye güvenme. Formdan gelen her alan, sunucuda yeniden denetlenmeli, temizlenmeli ve gerekiyorsa reddedilmelidir.

<?php
declare(strict_types=1);

$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$ad = trim($_POST['ad'] ?? '');

$hatalar = [];
if ($email === false || $email === null) {
    $hatalar[] = 'Geçerli bir e-posta girin.';
}
if (mb_strlen($ad) < 3) {
    $hatalar[] = 'Ad en az 3 karakter olmalı.';
}

if (empty($hatalar)) {
    // Veri güvenli, işleme devam
}

Sunucu tarafında doğrulama sadece "doğru mu" sorusuyla sınırlı değildir. Aynı zamanda güvenlik temizliğini de burada yaparsınız.

Doğrulamanın Ötesi: Güvenlik Temizliği

Veri doğrulandıktan sonra, nereye gideceğine göre uygun şekilde işlenmelidir:

  1. Veritabanına yazarken: Hazır ifadeler (prepared statements) kullanarak SQL enjeksiyonunu önleyin.
  2. Ekrana basarken: htmlspecialchars ile kaçış yaparak XSS'i engelleyin.
  3. Form isteğini karşılarken: CSRF jetonu doğrulayarak sahte istekleri reddedin.
Form Doğrulama: İstemci ve Sunucu Tarafını Birlikte Kurmak
DevOps ve otomasyon

CSRF: Görünmeyen Tehdit

Form güvenliğinin sık atlanan bir boyutu CSRF'tir (Cross-Site Request Forgery). Kötü niyetli bir site, kullanıcının oturumunu kullanarak sizin formunuza gizlice istek gönderebilir. Bunu önlemenin yolu, her forma benzersiz ve gizli bir jeton (token) yerleştirmek ve sunucuda doğrulamaktır.

<?php
// Form üretilirken jeton oluştur
$_SESSION['csrf'] = bin2hex(random_bytes(32));
// Gizli alan olarak forma göm:
// <input type="hidden" name="csrf" value="...">

// Form gelince doğrula
if (!hash_equals($_SESSION['csrf'], $_POST['csrf'] ?? '')) {
    http_response_code(403);
    exit('Geçersiz istek.');
}

Bu adım, ödeme veya hesap değişikliği gibi hassas formlarda özellikle kritiktir.

İki Katmanı Birlikte Tasarlamak

İdeal bir kurulumda iki katman uyum içinde çalışır: istemci tarafı kullanıcıya anında ve nazik geri bildirim verir, sunucu tarafı ise arka planda hiç taviz vermeden güvenliği sağlar. Berasoft'ta geliştirdiğimiz e-ticaret projelerinde bu ilkeyi her formda uyguluyoruz; çünkü bir ödeme veya kayıt formundaki tek bir doğrulama açığı, tüm sistemi riske atabilir. Kullanıcının gördüğü kolaylık ile arka plandaki katı denetim, birbiriyle çelişmez; tam tersine birbirini tamamlar.

Sonuç

Form doğrulama, "kullanıcı doğru mu yazdı" sorusundan çok daha derindir. İstemci tarafı deneyimi akıcı kılar, sunucu tarafı ise sistemi korur. İkisini birbirinin alternatifi değil, birlikte çalışan iki katman olarak kurmak, hem kullanıcıyı memnun eder hem de uygulamanızı güvende tutar. Kural her zaman aynıdır: kolaylığı tarayıcıda sun, ama gerçek denetimi asla sunucudan başka bir yere bırakma. Bu iki katmanı disiplinle kuran her uygulama, hem daha kullanışlı hem de çok daha güvenli olur.

Bu yazıyı paylaş:

Bir sonraki projeniz için hazır mısınız?

Okuduklarınızı işinize uygulamak veya dijital dönüşümünüzü konuşmak isterseniz, ekibimiz bir mesaj uzağınızda.

Görüşler

0 Yorum

İlk yorumu siz yazın.

Yorum Yap

Yorumlar moderatör onayından sonra yayınlanır.