Girdi Doğrulama
Input Validation
- İngilizcesi
- Input Validation
- Okunuşu
- input velideyşın
Günlük kullanımda iki ad da yaygın.
Kısaca
Girdi doğrulama, programa giren verinin kullanılmadan önce beklenen türde, biçimde ve aralıkta olup olmadığını kontrol etme ve gerisini reddetme pratiğidir.
Girdi doğrulama nedir?
Girdi doğrulama, form alanları, URL parametreleri, JSON gövdeleri, başlıklar, yüklenen dosyalar ve diğer servislerden gelen mesajlar gibi bir programın dışından gelen her veriyi, ona güvenmeden önce kontrol etmek demektir. Program verinin doğru türde, uzunlukta, biçimde ve aralıkta olduğunu doğrular; örneğin yaşın 0 ile 150 arasında bir tam sayı olduğunu ya da bir ülke kodunun bilinen bir listede yer aldığını. Başarısız olan her şey sistemin derinlerine aktarılmak yerine açık bir hatayla reddedilir.
En güçlü yaklaşım izin listesiyle (allowlist) doğrulamadır: izin verilenleri tam olarak tanımlar ve geri kalan her şeyi reddedersiniz; saldırganların genellikle aşabildiği, bilinen kötü değerlerden oluşan bir yasak listesini (denylist) engellemeye çalışmak yerine. Doğrulama sunucuda, verinin girdiği sınırda yapılmalıdır; çünkü tarayıcıdaki kontroller yalnızca kullanıcılar için bir kolaylıktır ve basit bir betikle atlanabilir. Birçok ekip, verilerinin beklenen biçimini bir doğrulama kütüphanesi veya JSON Schema gibi bir standart kullanarak bir şemayla tanımlar; böylece aynı kurallar her yerde uygulanır.
Doğrulama hem doğruluğu hem güvenliği korur: kötü verinin veritabanını bozmasını engeller ve saldırganların çalışabileceği alanı daralttır. Kapıda kimlik kontrolü yapan bir güvenlik görevlisi gibidir: kurallara uymayanlar hiç içeri giremez, bu da içerideki her şeyi yönetmeyi kolaylaştırır. Kurallar iş mantığını da kapsamalıdır; negatif bir miktarı ya da süresi çoktan dolmuş bir indirim kodunu reddetmek gibi.
Girdi doğrulama sıklıkla çıktı kodlaması ve sanitization ile karıştırılır ve bazen enjeksiyona karşı eksiksiz bir savunma sayılır. Doğrulama verinin kabul edilebilir olup olmadığına karar verir; çıktı kodlaması ise verinin kullanıldığı anda belirli bir bağlam için güvenli hâle getirilmesidir; XSS'i önlemek için HTML'i escape etmek ya da SQL injection'ı önlemek için parametreli sorgular kullanmak gibi. O'Brien gibi tamamen geçerli bir ad bile kötü kurulmuş bir SQL metnini bozabilir; bu yüzden doğrulama bir savunma katmanıdır, asla tek katman değildir.
Önemli noktalar
- Tüm dış girdiyi kullanmadan önce tür, uzunluk, biçim ve aralık açısından doğrulayın.
- Yasak listeleri yerine izin verilenlerin izin listelerini tercih edin.
- Her zaman sunucuda doğrulayın; istemci tarafı kontroller atlanabilir.
- Şemalar doğrulama kurallarını tutarlı ve incelemesi kolay tutar.
- Doğrulama, çıktı kodlamasını ve parametreli sorguları tamamlar ama onların yerini tutmaz.
Örnek
type Order = { productId: string; quantity: number; country: string };
const COUNTRIES = new Set(["US", "DE", "JP", "BR"]); // allowlist
function parseOrder(input: any): Order {
const { productId, quantity, country } = input ?? {};
if (typeof productId !== "string" || !/^[a-z0-9-]{1,40}$/.test(productId))
throw new Error("productId must be 1-40 lowercase letters, digits, or dashes");
if (!Number.isInteger(quantity) || quantity < 1 || quantity > 100)
throw new Error("quantity must be a whole number from 1 to 100");
if (!COUNTRIES.has(country)) throw new Error("unsupported country");
return { productId, quantity, country }; // only known, checked fields
}Sık sorulan sorular
İstemci tarafı doğrulama yeterli midir?
Hayır. Tarayıcı kontrolleri hataları erken yakalayarak kullanıcı deneyimini iyileştirir, ancak herkes istekleri doğrudan göndererek onları atlayabilir. Sunucu girdiyi her zaman yeniden doğrulamalıdır.
Girdi doğrulama ile sanitization arasındaki fark nedir?
Doğrulama girdinin kurallara uyup uymadığını kontrol eder ve uymuyorsa reddeder. Sanitization ise girdiyi güvenli kılmak için değiştirir; örneğin izin verilmeyen HTML etiketlerini kaldırır ve yalnızca zengin metin gibi içeriği kabul etmeniz gerektiğinde kullanılmalıdır.
Girdi doğrulama SQL injection'ı önler mi?
Beklenmeyen değerleri reddederek yardımcı olur, ancak tek başına güvenilir bir savunma değildir; çünkü bazı geçerli girdiler tırnak gibi karakterler içerir. SQL injection'a karşı birincil savunma parametreli sorgulardır.
İlgili sayfalar
- SQL InjectionGüvenlik, s. 39SQL injection, kullanıcı girdisinin veritabanı sorgusunun parçası sayıldığı ve saldırganın erişmemesi gereken verileri okuyup değiştirebildiği saldırıdır.
- XSSGüvenlik, s. 47XSS, saldırganın güvenilir bir siteye kötü amaçlı JavaScript enjekte edip bu kodu diğer kullanıcıların tarayıcısında çalıştırmasına yol açan zafiyettir.
- Düzenli ifadeProgramlamanın Temelleri, s. 17Düzenli ifade (regex), dizeler içinde aranacak, doğrulanacak, çıkarılacak veya değiştirilecek metni tarif eden, kompakt sözdizimli bir desendir.
- Fuzz TestiTest ve Kalite, s. 9Fuzz testi, çökmeleri, takılmaları ve güvenlik açıklarını bulmak için bir programa çok sayıda beklenmedik ya da bozuk girdi veren otomatik bir tekniktir.
- APIBackend ve API'ler, s. 2API, bir yazılımın başka bir yazılımdan veri ya da işlem talep etmesini sağlayan, belgelenmiş ve öngörülebilir kurallar bütünüdür.
- OWASP Top 10Güvenlik, s. 25OWASP Top 10, kâr amacı gütmeyen OWASP'nin yayımlayıp düzenli güncellediği, web uygulamalarındaki en kritik on güvenlik riskini sıralayan yaygın bir listedir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin