Formları Zod ve şemalarla doğrulamak: girdileri güvenle denetlemek
Kısaca: Kullanıcı girdisine asla güvenilmez; Zod gibi şema kütüphaneleriyle biçimi, türü ve sınırları bir kez merkezî olarak denetlersin: kolaylık için tarayıcıda, güvenlik için sunucuda.
Biraz daha ayrıntılı: Dışarıdan gelen her şey (formlar, URL parametreleri, API istekleri, çerezler) yanlış veya kötü niyetli olabilir. Doğrulama, verilerin program tarafından kullanılmadan önce beklentiyle uyuştuğundan emin olur. TypeScript yalnızca geliştirme zamanında denetler; çalışma zamanında denetim koduna ihtiyaç vardır.
Ayrıntılı
Kısaca Zod
import { z } from "zod";
const Signup = z.object({
email: z.string().email("Invalid email")
age: z.coerce.number().int().min(13).max(120)
password: z.string().min(12)
terms: z.literal("on", { message: "Please agree" })
});
const r = Signup.safeParse(Object.fromEntries(formData));
if (!r.success) return { errors: r.error.flatten().fieldErrors };
const data = r.data; // temiz biçimde tiplenmişŞema gerçeğin kaynağıdır: type Signup = z.infer<typeof Signup> TypeScript türünü üretir. Benzerleri: Valibot, Yup, ArkType, Joi, JSON Schema.
Nerede denetlemeli?
- Tarayıcıda: hızlı geri bildirim (HTML nitelikleri
required,type=email,pattern, artı şema). Yalnızca kolaylık, kolayca atlatılabilir. - Her zaman sunucuda da (API rotası, sunucu eylemi): güvenlik buradadır. Tarayıcının denetlediğine asla güvenme.
- Veri tabanı: son savunma olarak kısıtlamalar (
NOT NULL,UNIQUE,CHECK, yabancı anahtarlar). - Çıktı: gösterirken kaçışla (XSS), “temizle ve umut et” değil.
İyi kurallar
- Yasaklı liste yerine izin listesi: kötüyü aramak yerine bilinen iyi değerlere izin ver (enum, desen).
- Sınırlar koy (uzunluk, boyut, sayı, değer aralığı), dosya yüklemeleri için de (tür, boyut, içerik kontrolü).
- Türleri bilerek dönüştür (
coerce), boşlukları kırp. - Hata mesajları yararlı ama iç ayrıntı içermeden.
- Bilinmeyen alanları reddet/kaldır (toplu atamayı önle: kullanıcı
isAdmin: truegönderememeli). - Karakter kodlaması ve normalleştirme (küçük harfli e-posta).
- Spam’e karşı hız sınırlama ve CAPTCHA/honeypot.
Etkileşim
react-hook-form (+ zodResolver) veya sunucu eylemleri (useActionState) ile alan başına hata gösterimli formlar elde edersin. Erişilebilirlik: hataları alana bağla (aria-describedby, aria-invalid), etiketler, odak ilk hatalı alanda. Gizlilik: yalnızca gerekli alanları topla. Doğrulamayı birim testleriyle sına (geçerli ve geçersiz örnekler, uç durumlar).
Ayrıca bak: SQL enjeksiyonu, XSS, Hız sınırlama, CAPTCHA, TypeScript