[GÜVENLİK] Base64 Güvenlik En İyi Uygulamaları
Web uygulamalarında Base64 kodlama ile çalışırken önemli güvenlik hususları.
// 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, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
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