🔐 Müzibu HLS Güvenlik Analizi

📅 Tarih: 2025-12-04 🎯 Tenant: muzibu.com (1001) 🚨 Öncelik: KRİTİK 👤 Talep: Tüm şarkıları HLS + şifreleme ile koruma

📊 Mevcut Durum Analizi

✅ Mevcut Güvenlik Özellikleri (ZATEN AKTIF)

✅ HLS Streaming

HLS (HTTP Live Streaming) - Müzik dosyaları küçük parçalar halinde stream edilir, tüm dosya indirilmez.

✅ AES-128 Şifreleme

AES-128 Encryption - Her şarkı 128-bit anahtar ile şifrelenir, direkt erişim imkansız.

✅ Signed URL

Token-based authentication - Her stream isteği için geçici token oluşturulur, paylaşım engellenir.

✅ Rate Limiting

Throttling - Guest: 30/dakika, Üye: 120/dakika, Premium: 300/dakika istek limiti.

✅ 30 Saniye Preview

Üye olmayanlar ve normal üyeler sadece 30 saniye dinleyebilir, tam erişim premium üyelere özel.

✅ Lazy Conversion

Şarkı ilk kez istendiğinde otomatik HLS'e dönüştürülür, sunucu kaynaklarını optimize eder.

⚠️ Güvenlik Açıkları (DÜZELTİLMELİ)

🔴 Tüm Şarkılar HLS Değil

Henüz dinlenmemiş şarkılar HLS'e dönüştürülmemiş, ilk 30 saniye MP3 olarak serve ediliyor.

🔴 MP3 Fallback Riski

HLS dönüşmemişse MP3 dosyası direkt serve edilir, şifresiz erişim riski var.

🟡 Encryption Key URL Tutarsızlığı

HLSService /stream/key/{hash} kullanırken, ConvertToHLSJob /api/muzibu/songs/{id}/key kullanıyor.

🟡 Key Endpoint Authentication Eksik

HLSService'te TODO: Token validation + rate limiting ekle notu var, şu an sadece basic rate limit mevcut.

🟡 Signed URL Süresi Uzun

HLS: 60 dakika, MP3: 30 dakika. Guest/Normal user için çok uzun, paylaşım riski artırıyor.

🟡 Preview Chunk Kontrolü Yok

30 saniye preview server-side olarak kontrol edilmiyor, client-side'a güveniliyor (manipüle edilebilir).

🔒 MP3 vs HLS Güvenlik Karşılaştırması

Özellik MP3 (Standart) HLS + AES-128 (Güvenli)
Dosya İndirilebilir mi? Evet, tüm dosya indirilebilir Hayır, sadece şifreli parçalar
URL Paylaşımı MP3 URL'si paylaşılabilir Token geçersiz olur, paylaşılamaz
Hotlink Koruması Yok Var, her segment ayrı token
Şifreleme Yok AES-128 (128-bit key)
Preview Kontrolü Client-side (manipüle edilebilir) Server-side chunk kontrolü
DRM Entegrasyonu İmkansız Fairplay, Widevine eklenebilir
Kalite Kontrolü Sabit kalite Adaptif kalite (bant genişliğine göre)
🚨 KRİTİK GÜVENLİK RİSKİ

Sorun: Henüz HLS'e dönüşmemiş şarkılar MP3 olarak serve ediliyor. Üye olmayan kullanıcılar bile ilk 30 saniye için MP3 URL'sine erişebilir.

Risk: URL paylaşılırsa, kimlik doğrulaması olmadan tüm şarkı indirilebilir.

Çözüm: Tüm şarkıları proaktif olarak HLS + AES-128 ile dönüştür, MP3 fallback'i kaldır.

🎯 Yapılacaklar - Tüm Şarkıları Koruma Planı

1. Tüm Şarkıları Bulk HLS Dönüşümü Kritik

Sistemdeki tüm şarkıları proaktif olarak HLS + AES-128 ile dönüştür. Lazy conversion yerine, tüm kütüphane şifreli HLS formatında olmalı.

Nasıl Yapılır:

  • Artisan command oluştur: php artisan muzibu:convert-all-to-hls
  • Henüz dönüşmemiş şarkıları bul: WHERE hls_converted = 0
  • Her şarkı için ConvertToHLSJob'u queue'ya at (paralel işlem)
  • Queue worker sayısını artır (4-6 worker optimal)
  • Progress tracking ekle (kaç/kaç tamamlandı)

Beklenen Sonuç: Tüm şarkılar şifreli HLS formatında, MP3 fallback ihtiyacı kalmayacak.

2. MP3 Fallback Kaldırma Kritik

HLS dönüşmemişse MP3 serve etme, bunun yerine "Şarkı hazırlanıyor, lütfen bekleyin" mesajı göster. Kullanıcı beklerken HLS dönüşümü tamamlanır.

Değişiklik Yeri: SongStreamController.php - MP3 serve mantığını kaldır

Beklenen Sonuç: Hiçbir şarkı şifresiz olarak serve edilmeyecek.

3. Encryption Key URL Standartlaştırma Yüksek

HLSService ve ConvertToHLSJob farklı URL kullanıyor, tek bir standart endpoint belirle.

Önerilen URL: /api/muzibu/songs/{id}/key (mevcut API rotası)

  • HLSService.php:212 → URL'yi güncelle
  • Route: api.muzibu.songs.encryption-key (zaten tanımlı)
  • SongController'da serveEncryptionKey() method'unu kontrol et

Beklenen Sonuç: Tüm şarkılar aynı key endpoint'ini kullanacak, tutarsızlık kalmayacak.

4. Key Endpoint Güvenlik Güçlendirme Yüksek

Encryption key endpoint'ine ek güvenlik katmanları ekle.

Eklenecek Özellikler:

  • Token Validation - Sadece geçerli stream token'ı olan istekler kabul edilmeli
  • Referer Check - Sadece kendi domain'den gelen istekler kabul edilmeli
  • IP Rate Limiting - Aynı IP'den fazla key isteği engellensin (key harvesting riski)
  • User Agent Check - Bot trafiğini filtrele
  • Logging - Tüm key isteklerini logla (şüpheli aktivite tespiti için)

Beklenen Sonuç: Encryption key sadece yetkili stream istekleri için serve edilecek.

5. Signed URL Süresi Optimizasyonu Yüksek

Kullanıcı tiplerine göre token sürelerini kısalt.

Guest User:
- HLS: 10 dakika (şu an 60 dakika)
- MP3: 5 dakika (şu an 30 dakika)
- Sebep: Üye değil, paylaşım riski en yüksek

Normal User (Premium değil):
- HLS: 15 dakika (şu an 60 dakika)
- MP3: 10 dakika (şu an 30 dakika)
- Sebep: Üye ama premium değil, orta risk

Premium User:
- HLS: 60 dakika (olduğu gibi)
- MP3: 30 dakika (olduğu gibi)
- Sebep: Ödeyen müşteri, uzun süre gerekli

Değişiklik Yeri: SongStreamController.php - generateHlsUrl() ve generateStreamUrl() sürelerini user tipine göre ayarla

Beklenen Sonuç: Üye olmayan kullanıcılar token'ı paylaşsa bile kısa sürede geçersiz olacak.

6. Server-Side Preview Chunk Kontrolü Orta

30 saniye preview'ı client-side JavaScript'e değil, server-side'a taşı. Sadece ilk X chunk'ı serve et.

Nasıl Çalışır:

  • 30 saniye = 3 chunk (10 saniye/chunk varsayımıyla)
  • Guest/Normal user için playlist.m3u8'de sadece ilk 3 chunk'ı listele
  • Premium user için tüm chunk'ları listele
  • Chunk dosyalarını serve ederken user tipini kontrol et

Beklenen Sonuç: JavaScript manipüle edilse bile, server sadece izin verilen chunk'ları serve edecek.

7. HLS Dönüşüm Sonrası MP3 Silme (Opsiyonel) Orta

HLS dönüşümü tamamlandıktan sonra orijinal MP3 dosyasını sil, disk alanı tasarruf et ve güvenliği artır.

Dikkat: MP3'leri silersen, fallback imkansız hale gelir. Sadece tüm şarkılar HLS'e dönüştükten sonra uygula.

Alternatif: MP3'leri sil yerine, erişimini engelle (storage/muzibu/songs/ klasörüne web erişimini kapat).

Beklenen Sonuç: Disk alanı %40-50 azalır, orijinal dosyalara erişim tamamen engellenir.

📋 Uygulama Öncelik Sırası

Aşama 1: Tüm Şarkıları HLS'e Dönüştür (1-2 gün)

  • Bulk conversion command oluştur
  • Queue worker'ları artır
  • Dönüşüm başlat (arka planda çalışır)
  • Progress takip et

Aşama 2: Güvenlik Yamalarını Uygula (1 gün)

  • MP3 fallback'i kaldır
  • Key URL standardize et
  • Signed URL sürelerini ayarla
  • Key endpoint güvenliğini güçlendir

Aşama 3: İleri Seviye Özellikler (Opsiyonel)

  • Server-side preview chunk kontrolü
  • Orijinal MP3 dosyalarını silme/erişim engelleme
  • DRM entegrasyonu (Fairplay, Widevine)
  • Forensic watermarking (kullanıcı ID'si audio'ya gömülür)

🎉 Beklenen Sonuçlar

🔒 %100 Şifreli Kütüphane

Tüm şarkılar AES-128 ile şifreli, hiçbir dosya direkt indirilemez.

🚫 URL Paylaşımı İmkansız

Signed URL'ler kısa sürede geçersiz olur, paylaşım işe yaramaz.

👤 Kullanıcı Tipine Göre Erişim

Guest/Normal: 30 saniye preview, Premium: Sınırsız dinleme.

📊 Server-Side Kontrol

JavaScript manipüle edilse bile, server izin verilen chunk'ları serve eder.

🛡️ Key Endpoint Koruması

Encryption key sadece yetkili stream istekleri için verilir.

💾 Disk Alanı Tasarrufu

MP3'leri silerseniz %40-50 disk alanı kazanırsınız.

🔧 Teknik Notlar

FFmpeg Kurulumu

HLS dönüşümü için FFmpeg gerekli. Sistemde yüklü olduğundan emin olun:

ffmpeg -version
# FFmpeg version 4.2.4 veya üzeri olmalı

Disk Alanı Hesaplama

HLS dönüşümü her şarkı için yaklaşık %20 daha fazla alan kullanır:

MP3: 5 MB → HLS: 6 MB (segment'ler + playlist + key files)
Toplam kütüphane: 10 GB MP3 → 12 GB HLS
MP3'leri silersen: 10 GB geri kazanırsın

Queue İşleme Süresi

Bulk dönüşüm süresi şarkı sayısına ve sunucu gücüne bağlı:

1 şarkı dönüşümü: ~30 saniye (3-4 dakikalık şarkı için)
4 worker (paralel): Saatte ~480 şarkı
1000 şarkı: ~2 saat
10,000 şarkı: ~20 saat