TB
← Tüm yazılar

Input validation

Kullanıcı girdilerinin güvenli ve tutarlı dogrulanmasi icin katmanli validasyon stratejileri, encoding kurallari ve OWASP odaklı uygulama kaliplari.

Input validation, güvenli yazılımın temel taslarindan biridir. Her HTTP istegi, form gonderimi, mesaj kuyrugu payload'i ve dosya yuklemesi potansiyel bir saldırı vektoru tasir. SQL injection, XSS, command injection, path traversal ve business logic bypass saldirilarinin büyük cogunlugu yetersiz veya yanlış katmanda uygulanan dogrulamadan kaynaklanir. Savunma derinligi ilkesi geregi validation istemci, API gateway, uygulama ve veritabanı katmanlarinda tutarlı ancak farklı sorumluluklarla uygulanmalidir.

Validation vs sanitization vs encoding

Uc kavram sik karistirilir:

  • Validation: Girdinin kabul edilebilir kurallara uyup uymadigini kontrol eder; uyumsuzsa reddeder.
  • Sanitization: Tehlikeli karakterleri temizler veya degistirir; tek basina yeterli degildir.
  • Encoding: Çıktı baglamina gore (HTML, URL, SQL) özel karakterleri güvenli temsil eder.

Whitelist validation tercih edilir: e-posta formati, pozitif tamsayi, enum degerleri. Blacklist (script kelimesini yasakla) bypass edilmesi kolaydir. Reddedilen girdide anlamli hata mesaji donulmeli; ancak ic sistem detaylari (stack trace, SQL) sizdirilmamali.

Katmanli validation mimarisi

Web uygulamalarinda tipik akis: Web => httpClient => Api => Mediator => Repository => database. Her katmanda validation rolu farklidir:

  1. Istemci (UX): Erken geri bildirim; güvenlik icin yeterli degil.
  2. API boundary: Request DTO uzerinde schema ve tip dogrulama zorunlu.
  3. Application (Mediator): Is kurallari, capraz alan kontrolleri, yetki.
  4. Domain: Invariant'lar; value object constructor'da dogrulama.
  5. Persistence: Parametreli sorgu; stored procedure giriş kontrolleri.

Ayni kuralin her katmanda tekrarlanmasi (duplicate validation) bakım yukunu artirir; paylasilan validator ve domain invariant ile denge kurulur.

ASP.NET Core ve FluentValidation

DataAnnotations basit senaryolar icin yeterlidir; karmaşık kurallarda FluentValidation okunabilirlik sağlar:

public class CreateOrderCommandValidator : AbstractValidator<CreateOrderCommand>
{
    public CreateOrderCommandValidator()
    {
        RuleFor(x => x.CustomerId).GreaterThan(0);
        RuleFor(x => x.Lines).NotEmpty().Must(l => l.Count <= 100);
        RuleForEach(x => x.Lines).SetValidator(new OrderLineValidator());
    }
}

MediatR pipeline'da ValidationBehavior ile handler oncesi calistirilir. Validation hatalari RFC 7807 ProblemDetails formatinda donulmelidir.

Tip güvenliği ve model binding

String olarak gelen sayisal alanlar model binding'de donusturulurken hata üretir; ancak JsonElement veya Dictionary kullanımı tip kontrolunu zayiflatir. Strongly typed DTO, required modifier ve nullable reference types tutarlılık sağlar. API versiyonlarinda yeni alanlar opsiyonel tasarlanmali; breaking change validation kurallarini da etkiler.

Injection saldirilarina karşı

SQL injection: Her zaman parametreli sorgu veya ORM parameterized query. Raw SQL'de string birlestirme yasak. EF Core'da FromSqlRaw ile kullanıcı girdisi birlestirilmemeli.

Command injection: Process.Start, shell cagrilari ve dosya yolu birlestirmede whitelist karakter seti. Kullanıcı girdisi hicbir zaman shell argumani olarak gecmemeli.

LDAP/XML injection: Enterprise entegrasyonlarda escape kutuphaneleri ve parameterized LDAP filter kullanın.

// Guvensiz
var sql = $"SELECT * FROM Users WHERE Email = '{email}'";

// Guvenli
await conn.QueryAsync("SELECT * FROM Users WHERE Email = @email", new { email });

XSS ve HTML girdisi

Kullanıcı içeriği HTML olarak saklaniyorsa server-side sanitization (HtmlSanitizer) uygulanir. Çıktı encoding baglama gore yapilir: Razor'da varsayilan encoding, JavaScript'e gommede JSON serialize. Content-Security-Policy XSS etkisini daraltir ancak validation yerine gecmez.

Dosya yükleme validation

Dosya adi, uzanti, MIME type ve içerik magic byte kontrolu birlikte yapilmalidir. Yalnizca uzanti kontrolu yetersizdir; evil.pdf.exe veya sahte Content-Type bypass edilebilir. Yuklenen dosyalar web root dışında saklanmali; indirme endpoint'i Content-Disposition: attachment ile sunulmali.

  • Maksimum dosya boyutu limiti (Kestrel, reverse proxy).
  • Izin verilen MIME whitelist.
  • Antivirus tarama (ClamAV) yüksek riskli senaryolarda.
  • Randomize edilmis depolama adi; path traversal engeli.

Is mantigi ve sınır degerler

Güvenlik aciklarinin önemli bir kismi teknik injection degil, is kurali ihlalidir: negatif miktar, sifir fiyat, baska kullanıcının kaydina erişim (IDOR). Her endpoint'te yetki + kaynak sahipligi kontrolu validation'in parcasidir. Enum disi deger, gelecek tarih, asiri uzun string (DoS) ve nested JSON derinligi limitleri tanimlanmalidir.

Uluslararasi girdi ve normalizasyon

Unicode normalizasyonu (NFC/NFKC) homoglyph saldirilarini azaltir. Türkçe karakterler ASCII fold edilmeden doğru islenmeli; arama ve karsilastirmada culture-invariant kurallar dikkatle secilir. Basinda/sonunda bosluk trim, null byte (\0) reddi ve kontrol karakterlerinin filtrelenmesi standart uygulama olmalidir.

API ve JSON Schema

OpenAPI spesifikasyonundaki maxLength, pattern, enum kisitlari contract olarak belgelenir. Istek govdesi boyutu limiti (RequestSizeLimit) JSON bomb ve entity expansion saldirilarina karşı korur. GraphQL'de query depth ve complexity limitleri validation'in uzantisidir.

Test stratejisi

Validation birim testleri happy path yaninda edge case kapsamali:

  • Null, bos string, cok uzun string.
  • SQL/XSS payload ornekleri (regression).
  • Sınır deger (int.MaxValue, minimum tarih).
  • Yetkisiz kaynak ID'si (IDOR).

Fuzz testing (OWASP ZAP, RESTler) rastgele girdi ile crash ve 500 hatalarini tespit eder. Property-based testing (FsCheck) ile invariant dogrulama guclendirilir.

Logging ve gizlilik

Validation hatalarinda kullanıcı girdisi loglanirken PII maskeleme uygulanir. Şifre, token ve kredi karti alanlari log'a yazilmamali. Hata yanitinda hangi alanin hatali olduğu belirtilmeli; ancak saldirganin recon yapmasini kolaylastiracak detay verilmemeli.

Özet ilkeler

  1. Whitelist validation; reddet ve bildir.
  2. Her katmanda uygun sorumluluk; istemciye guvenme.
  3. Parametreli sorgu ve güvenli API tasarımı.
  4. Is kurallari ve yetki kontrolu validation'in parcasi.
  5. Dosya, JSON ve Unicode özel durumlari.
  6. Otomatik test ve fuzz ile regression onleme.

Input validation bir kerelik checklist degil, yeni her endpoint ve alan icin tekrarlanan muhendislik disiplinidir. Katmanli mimari, güçlü tip sistemi ve OWASP rehberleri ile birlestirildiginde uygulama hem veri butunlugunu korur hem de exploit yuzeyini sistematik olarak daraltir.

Mass assignment ve over-posting

Model binding tüm JSON alanlarini DTO'ya map edebilir. [BindNever], read-only property ve ayri create/update DTO'lari ile kullanıcının IsAdmin gibi alanlari set etmesi engellenir. Record ve init-only property'ler over-posting riskini azaltir.

Rate limiting ve validation birlikte

Validation reddi 400 doner; brute force ve enumeration saldirilarinda rate limiting ve captcha ek katman sağlar. Login endpoint'inde kullanıcı adi format validation'i ile birlikte sabit yanıt suresi (timing attack azaltma) uygulanabilir.

Regulasyon: KVKK ve veri minimizasyonu

Validation asiri veri toplamayi da engeller: gerekenden fazla alan istemeyin, zorunlu alanlari minimize edin. Kişisel veri alanlarinda format dogrulama (TCKN algoritmasi, IBAN) veri kalitesini ve güvenliği artirir.

Deserialize ve type confusion

JSON veya XML deserialize islemlerinde bilinmeyen alanlar yok sayilmali veya reddedilmeli. System.Text.Json varsayilan olarak bilinmeyen property'leri ignore eder; Newtonsoft'da MissingMemberHandling.Error degerlendirilir. Polymorphic deserialization aciksa güvenli tip listesi (allowlist) tanimlanmali; aksi halde gadget chain ile RCE riski dogabilir.

Server-side template injection

Kullanıcı girdisi e-posta sablonu veya rapor motoruna dogrudan gecirilmemeli. Razor, Handlebars veya Scriban sablonlarinda context-aware escape uygulanir. Template ifadelerinde kullanıcı verisi yalnizca encode edilmis degisken olarak baglanir.

Continuous validation in CI

OpenAPI contract testleri ile API'nin dokumante edilen validation kurallarina uygun davranisi her build'de dogrulanir. Breaking change detection, yeni alan veya gevsetilmis kural güvenlik regresyonu olabilir. Static analysis (Security Code Scan) SQL string birlestirme ve zayif validation anti-pattern'lerini erken yakalar.