[GÜVENLİK] 7 dakika okuma

[GÜVENLİK] Base64 Güvenlik En İyi Uygulamaları

Web uygulamalarında Base64 kodlama ile çalışırken önemli güvenlik hususları.

Ocak 2025 | security

// BASE64 ŞİFRELEME DEĞİLDİR

En kritik güvenlik yanlış anlaması, Base64'ü şifreleme olarak görmektir. Base64 sadece kodlamadır - herhangi bir anahtar veya şifre olmadan tamamen tersine çevrilebilir.

Herhangi biri Base64 verilerini anında çözebilir. Güvenlik veya veri koruması için asla Base64'e güvenmeyin.

// ❌ YANLIŞ: Base64'ü 'güvenlik' olarak kullanma
const password = 'secret123';
const encoded = btoa(password); // cGFzc3dvcmQ=
// Herhangi biri bunu anında çözebilir!

// ✅ DOĞRU: Uygun şifre hashleme
import bcrypt from 'bcrypt';
const password = 'secret123';
const hashedPassword = await bcrypt.hash(password, 12);
// Bu gerçekten güvenlidir

// GİRDİ DOĞRULAMA

Enjeksiyon saldırılarını ve uygulama hatalarını önlemek için her zaman Base64 girdisini doğrulayın:

Uygun doğrulama, kötü niyetli girdinin güvenlik sorunlarına veya uygulama çökmelerine neden olmasını önler.

// Base64 formatını doğrula
function isValidBase64(str) {
    // Format kontrolü: sadece geçerli Base64 karakterleri
    const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;
    if (!base64Regex.test(str)) {
        return false;
    }
    
    // Uzunluk kontrolü (4'ün katı olmalıdır)
    if (str.length % 4 !== 0) {
        return false;
    }
    
    // Kod çözme testi
    try {
        atob(str);
        return true;
    } catch (e) {
        return false;
    }
}

// Doğrulama ile güvenli kod çözme
function safeBase64Decode(input, maxLength = 10000) {
    if (typeof input !== 'string') {
        throw new Error('Girdi string olmalıdır');
    }
    
    if (input.length > maxLength) {
        throw new Error('Girdi çok uzun');
    }
    
    if (!isValidBase64(input)) {
        throw new Error('Geçersiz Base64');
    }
    
    return atob(input);
}

// XSS ÖNLEMİ

Base64 verileri çözüldüğünde kötü niyetli betikler içerebilir. Çözümlenmiş içerik görüntülenirken her zaman çıktıyı temizleyin:

Kullanıcılardan gelen Base64 girdilerine asla güvenmeyin. HTML'de render etmeden önce her zaman temizleyin.

// ❌ TEHLİKELİ: Doğrudan HTML enjeksiyonu
function displayDecodedData(base64) {
    const decoded = atob(base64);
    document.innerHTML = decoded; // XSS güvenlik açığı!
}

// ✅ GÜVENLİ: Çıktıyı temizle
function safeDisplayDecodedData(base64) {
    const decoded = atob(base64);
    
    // Metin düğümü oluştur (HTML çalıştırma yok)
    const textNode = document.createTextNode(decoded);
    container.appendChild(textNode);
    
    // Veya HTML varlıklarını kaçır
    const escaped = decoded
        .replace(/&/g, '&')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#x27;');
    
    container.innerHTML = escaped;
}

// BOYUT SINIRLARI

Base64 kodlaması veri boyutunu ~%33 artırır. DoS saldırılarını önlemek için boyut sınırları uygulayın:

Sınırsız Base64 girdisi aşırı bellek ve işlem gücü tüketebilir.

  • > Maksimum girdi uzunluğu sınırları belirleyin
  • > İşlem sırasında bellek kullanımını izleyin
  • > Uzun işlemler için zaman aşımları uygulayın
  • > Büyük veri kümeleri için akış kullanın
  • > Kodlamadan önce sıkıştırmayı düşünün
  • > Base64 işlemlerini hız sınırlayın

// GÜVENLİ TOKEN İŞLEME

Tokenlar veya hassas ID'ler için Base64 kullanırken, güvenlik en iyi uygulamalarını takip edin:

Uygun token işleme, yetkisiz erişimi ve token tabanlı saldırıları önler.

// Güvenli token oluşturma
function createSecureToken() {
    // Kriptografik olarak güvenli rastgele değerler kullan
    const array = new Uint8Array(32);
    crypto.getRandomValues(array);
    
    // Base64'e dönüştür ve URL güvenli yap
    const base64 = btoa(String.fromCharCode(...array))
        .replace(/\+/g, '-')
        .replace(/\//g, '_')
        .replace(/=/g, '');
    
    return base64;
}

// Güvenli token doğrulama
function validateToken(token, expectedLength = 43) {
    if (typeof token !== 'string') {
        return false;
    }
    
    // Uzunluk kontrolü
    if (token.length !== expectedLength) {
        return false;
    }
    
    // URL güvenli Base64 formatını kontrol et
    const urlSafeBase64Regex = /^[A-Za-z0-9_-]+$/;
    return urlSafeBase64Regex.test(token);
}

// VERİ URI GÜVENLİĞİ

Base64 veri URI'leri kötü niyetli içerik içerebilir. Her zaman veri URI'lerini doğrulayın ve temizleyin:

Kötü niyetli veri URI'leri betik çalıştırabilir, harici kaynaklar yükleyebilir veya uygunsuz içerik barındırabilir.

// Veri URI'sini doğrula
function validateDataURI(dataUri, allowedTypes = ['image/png', 'image/jpeg']) {
    const dataUriRegex = /^data:([a-zA-Z0-9][a-zA-Z0-9\/+]*);base64,(.+)$/;
    const match = dataUri.match(dataUriRegex);
    
    if (!match) {
        throw new Error('Geçersiz veri URI formatı');
    }
    
    const [, mimeType, base64Data] = match;
    
    // MIME tipini doğrula
    if (!allowedTypes.includes(mimeType)) {
        throw new Error(`Desteklenmeyen MIME tipi: ${mimeType}`);
    }
    
    // Base64 verisini doğrula
    if (!isValidBase64(base64Data)) {
        throw new Error('Veri URI'sinde geçersiz Base64');
    }
    
    // Boyut kontrolü
    const sizeEstimate = (base64Data.length * 3) / 4;
    if (sizeEstimate > 1024 * 1024) { // 1MB sınırı
        throw new Error('Veri URI çok büyük');
    }
    
    return { mimeType, base64Data };
}

// GÜVENLİ UYGULAMA KONTROL LİSTESİ

  • > Asla Base64'ü şifreleme veya güvenlik önlemi olarak kullanmayın
  • > Her zaman Base64 girdi formatını ve uzunluğunu doğrulayın
  • > Görüntülemeden önce çözümlenmiş çıktıyı temizleyin
  • > Boyut sınırları ve zaman aşımları uygulayın
  • > Web uygulamaları için URL güvenli Base64 kullanın
  • > Veri URI'leri için MIME tiplerini doğrulayın
  • > Tokenlar için kriptografik olarak güvenli rastgele değerler kullanın
  • > Uygun hata işleme uygulayın
  • > Potansiyel DoS saldırıları için izleyin
  • > Base64 işleme kodunun düzenli güvenlik denetimlerini yapın