Skip to content

Input Validation

Genel Bakış

Input Validation (Girdi Doğrulama), uygulamaya gelen tüm verilerin güvenli ve beklenen formatta olduğundan emin olmak için yapılan kontrollerdir. Bu işlem, güvenlik açıklarını önlemek ve veri bütünlüğünü korumak için kritik öneme sahiptir.

Mülakat Soruları ve Cevapları

1. Input Validation neden önemlidir?

Cevap: Input Validation'ın önemi: - Güvenlik: SQL Injection, XSS gibi saldırıları önler - Veri Bütünlüğü: Beklenen veri formatını sağlar - Kullanıcı Deneyimi: Hatalı girişleri erken tespit eder - Sistem Performansı: Geçersiz verilerin işlenmesini engeller

Örnek Kod:

// Model doğrulama
public class UserModel
{
    [Required(ErrorMessage = "Kullanıcı adı zorunludur")]
    [StringLength(50, MinimumLength = 3, ErrorMessage = "Kullanıcı adı 3-50 karakter arasında olmalıdır")]
    [RegularExpression(@"^[a-zA-Z0-9_]+$", ErrorMessage = "Kullanıcı adı sadece harf, rakam ve alt çizgi içerebilir")]
    public string Username { get; set; }

    [Required(ErrorMessage = "E-posta zorunludur")]
    [EmailAddress(ErrorMessage = "Geçerli bir e-posta adresi giriniz")]
    public string Email { get; set; }
}

// Controller'da doğrulama
[HttpPost]
public IActionResult CreateUser(UserModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    // İşlem devam eder...
}

2. Input Validation yöntemleri nelerdir?

Cevap: Input Validation yöntemleri: - Client-side validation - Server-side validation - Model validation - Custom validation - Sanitization

Örnek Kod:

// Custom validation attribute
public class AgeValidationAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value is int age)
        {
            if (age < 18)
            {
                return new ValidationResult("Yaş 18'den küçük olamaz");
            }
            if (age > 120)
            {
                return new ValidationResult("Geçerli bir yaş giriniz");
            }
        }
        return ValidationResult.Success;
    }
}

// Sanitization örneği
public class InputSanitizer
{
    public string SanitizeInput(string input)
    {
        if (string.IsNullOrEmpty(input))
            return input;

        // HTML encoding
        input = WebUtility.HtmlEncode(input);

        // SQL injection koruması
        input = input.Replace("'", "''");

        // XSS koruması
        input = Regex.Replace(input, "<script.*?>.*?</script>", "", RegexOptions.IgnoreCase);

        return input;
    }
}

3. SQL Injection nasıl önlenir?

Cevap: SQL Injection önleme yöntemleri: - Parametreli sorgular - Stored procedures - ORM kullanımı - Input sanitization - Minimum yetki prensibi

Örnek Kod:

// Güvenli olmayan kod
public IActionResult GetUser(string username)
{
    var query = $"SELECT * FROM Users WHERE Username = '{username}'";
    // SQL Injection riski!
}

// Güvenli kod (Entity Framework)
public IActionResult GetUser(string username)
{
    var user = _context.Users
        .Where(u => u.Username == username)
        .FirstOrDefault();
    return Ok(user);
}

// Güvenli kod (Dapper)
public IActionResult GetUser(string username)
{
    var query = "SELECT * FROM Users WHERE Username = @Username";
    var parameters = new { Username = username };
    var user = _connection.QueryFirstOrDefault<User>(query, parameters);
    return Ok(user);
}

4. XSS (Cross-Site Scripting) nasıl önlenir?

Cevap: XSS önleme yöntemleri: - Output encoding - Content Security Policy - Input validation - Sanitization - HttpOnly cookies

Örnek Kod:

// XSS koruması
public class XssProtectionMiddleware
{
    public async Task InvokeAsync(HttpContext context)
    {
        context.Response.Headers.Add("X-XSS-Protection", "1; mode=block");
        context.Response.Headers.Add("Content-Security-Policy", 
            "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval';");

        await _next(context);
    }
}

// Output encoding
public class HtmlEncoder
{
    public string EncodeOutput(string input)
    {
        if (string.IsNullOrEmpty(input))
            return input;

        return WebUtility.HtmlEncode(input);
    }
}

// View'da encoding
@Html.Raw(Model.Content) // Güvenli değil
@Html.Encode(Model.Content) // Güvenli

5. File Upload güvenliği nasıl sağlanır?

Cevap: File Upload güvenliği için: - Dosya tipi kontrolü - Dosya boyutu sınırlaması - Güvenli dosya isimlendirme - Virüs taraması - Güvenli depolama

Örnek Kod:

// Güvenli dosya yükleme
public class FileUploadService
{
    private readonly string[] _allowedExtensions = { ".jpg", ".png", ".pdf" };
    private readonly long _maxFileSize = 5 * 1024 * 1024; // 5MB

    public async Task<string> UploadFile(IFormFile file)
    {
        // Dosya tipi kontrolü
        var extension = Path.GetExtension(file.FileName).ToLowerInvariant();
        if (!_allowedExtensions.Contains(extension))
        {
            throw new InvalidOperationException("Geçersiz dosya tipi");
        }

        // Dosya boyutu kontrolü
        if (file.Length > _maxFileSize)
        {
            throw new InvalidOperationException("Dosya boyutu çok büyük");
        }

        // Güvenli dosya ismi oluşturma
        var fileName = $"{Guid.NewGuid()}{extension}";
        var filePath = Path.Combine("uploads", fileName);

        // Dosyayı güvenli şekilde kaydetme
        using (var stream = new FileStream(filePath, FileMode.Create))
        {
            await file.CopyToAsync(stream);
        }

        return fileName;
    }
}

Best Practices

  1. Güvenlik
  2. Tüm girdileri doğrulayın
  3. Whitelist yaklaşımı kullanın
  4. Minimum yetki prensibini uygulayın
  5. Hata mesajlarını güvenli hale getirin

  6. Performans

  7. Doğrulamayı erken yapın
  8. Gereksiz kontrollerden kaçının
  9. Önbellek kullanın
  10. Batch işlemleri optimize edin

  11. Kullanılabilirlik

  12. Anlamlı hata mesajları verin
  13. Client-side validation kullanın
  14. Kullanıcı dostu geri bildirimler sağlayın
  15. Form tasarımını iyileştirin

Kaynaklar