🔒 Güvenlik Analizi v2

Teknik Kullanıcı Engelleme Stratejisi

"Bak İndiriyoruz" Diyemesinler - Developer Arkadaşlar İçin Önlemler

📅 09 Ocak 2026 - Versiyon 2 (Güncellendi)

🎯 Hedef Kitle Netleşti

v1 Hedef: Sıradan kullanıcılar (teknik bilgisi yok) → Rate limiting, user-agent check gibi basit çözümler yeterli

v2 Hedef: Teknik bilgili developer arkadaşlar → DevTools kullanabiliyor, ffmpeg biliyor, network trafiğini okuyabiliyor → "Bak şöyle yapınca indirdim" diyemesinler!

📝 Basit Anlatım (Herkes İçin)

Sorun: Şu anda şarkılar "açık metin" gibi yayınlanıyor. Teknik bilgisi olan biri şarkı parçalarını (segment) toplayıp birleştirerek kaydedebiliyor.

Çözüm: Şarkı parçalarını şifreleyeceğiz (AES-128). Şifre anahtarı sadece o kullanıcının browser'ında, sadece o oturumda geçerli olacak.

⚡ Nasıl Çalışacak?
1. Şarkı çalarken browser bir anahtar alacak (encryption key)
2. Her parça şifreli gelecek, browser anahtarla açacak
3. Anahtar sadece o cihazda, o oturumda geçerli
4. Segment'leri indirse bile şifreli, açamaz
5. Anahtarı başka cihazda kullanamazsa çözemez

Ek Koruma: Her kullanıcıya özel "ses parmak izi" (watermark). Eğer birisi şarkıyı indirip paylaşırsa, kim olduğu tespit edilir → Caydırıcı etki!

🔧 Teknik Detaylar (Geliştiriciler İçin)

❌ v1 Çözümleri Neden Yetersiz?

  • Rate Limiting: Yavaş indirirse (10 dk'da 1 segment) bypass edilir
  • User-Agent Check: Browser user-agent kullanırsa geçer
  • Referer Check: DevTools'dan Referer header ekleyerek bypass
  • Token Expire: 10 dakika bile yeterli (şarkı 3-5 dakika)
  • Sonuç: Developer arkadaşlar hepsini bypass eder, "bak indirdim" der

✅ Gerçek Çözüm: Şifreleme + Binding

Token kontrolü değil, şifreleme kullanacağız. Segment'leri indirse bile açamayacak çünkü anahtarı yok.

  • 1.
    AES-128 Encryption: Her segment AES-128 ile şifrelenmiş halde storage'de duracak. Segment URL'ini bilse bile içerik şifreli, dinleyemez.
  • 2.
    Session-Bound Key: Decryption key sadece o session'da geçerli. Session ID + User ID + Browser Fingerprint kombinasyonu ile key oluşturulur. Farklı browser'da key çalışmaz.
  • 3.
    Browser Fingerprint Binding: Canvas, WebGL, Audio API ile browser parmak izi alınır. Key sadece o parmak izine bağlı çalışır. Farklı browser/cihazda key geçersiz.
  • 4.
    Dynamic Key Rotation: Her 5 segment'te bir key değişir. 19 segment var → 4 farklı key. Bir key'i elde etse bile sadece 5 segment açabilir.
  • 5.
    In-Memory Key (No Disk Write): Key asla localStorage/sessionStorage'a yazılmaz. Sadece RAM'de tutar, sayfa kapatılınca yok olur.

🎵 Watermarking (Caydırıcı)

Şifrelemeyi bypass edip indirse bile, kim olduğu tespit edilir.

  • Acoustic Fingerprint: Her kullanıcıya özel insan kulağının duymadığı frekans eklenir (18-20 kHz). FFmpeg ile kalite düşürse bile watermark kalır.
  • User ID + Timestamp Encoding: Watermark'ta user ID + timestamp gömülü. Şarkı sızdırılırsa analiz edip kimin paylaştığını buluruz.
  • Caydırıcı Etki: Kullanıcı bildiğinde paylaşmaz. "İndirdim ama paylaşamam, benim olduğu anlaşılır" der.

🛠️ DevTools Detection (Ek Koruma)

Chrome DevTools açıksa player durdurulur, key geçersiz kılınır.

  • Console Detection: JavaScript ile console.log performansı ölçülür. DevTools açıksa yavaşlar → Tespit edilir.
  • Window Resize Detection: DevTools açılınca window boyutu değişir → Event ile yakalanır.
  • Debugger Trap: debugger; statement ile breakpoint atılır. DevTools açıksa takılır → Player durdurulur.

⚠️ Not: %100 bypass-proof değil ama ekstra engel. Teknik kullanıcı bile uğraşır.

🛡️ Uygulama Planı

Faz 1: Backend - AES-128 Encryption (En Kritik)

1.1. MP3 → HLS + AES Conversion

Mevcut MP3'leri HLS segment'lerine çevirirken AES şifreleme ekle

# FFmpeg komutu
ffmpeg -i song.mp3 \
  -hls_time 10 \
  -hls_key_info_file keyinfo.txt \
  -hls_segment_filename "segment-%03d.ts" \
  playlist.m3u8

keyinfo.txt: Key URI, key dosya path, IV (initialization vector)

1.2. Dynamic Key Generation (Per Session)

Her kullanıcı session'ı için benzersiz AES key oluştur

// Laravel Controller
$key = hash('sha256', $sessionId . $userId . $fingerprint);
Cache::put("song_key_{$songId}_{$sessionId}", $key, 600); // 10 dakika

Key sadece o session + user + browser kombinasyonuna özel

1.3. Key Delivery Endpoint (Secure)

HLS player key'i ayrı endpoint'ten alacak

// Route
Route::get('/api/songs/{id}/key', [SongController::class, 'getDecryptionKey'])
  ->middleware(['auth', 'premium', 'fingerprint.verify']);

Key endpoint'i fingerprint + session doğrulaması yapacak

🔐 Faz 2: Frontend - Browser Fingerprint + Key Binding

2.1. Browser Fingerprinting (FingerprintJS)

Canvas, WebGL, Audio API ile benzersiz parmak izi oluştur

// JavaScript
import FingerprintJS from '@fingerprintjs/fingerprintjs';
const fp = await FingerprintJS.load();
const result = await fp.get();
const fingerprint = result.visitorId; // Benzersiz ID

Her cihaz/browser kombinasyonu farklı fingerprint → Key binding için kullanılır

2.2. In-Memory Key Storage (No Persistence)

Key'i localStorage'a ASLA yazma, sadece RAM'de tut

// JavaScript - YANLIŞ ❌
localStorage.setItem('decryption_key', key); // YAPMA!

// DOĞRU ✅
let decryptionKey = null; // Sadece variable'da tut
window.addEventListener('beforeunload', () => decryptionKey = null);

Sayfa kapatılınca key kaybolur, DevTools'dan bile alınamaz

2.3. DevTools Detection + Player Pause

DevTools açılırsa player durdur, key'i invalidate et

// JavaScript
setInterval(() => {
  const devtoolsOpen = /./[Symbol.toStringTag];
  if (devtoolsOpen) {
    player.pause(); // Player durdur
    decryptionKey = null; // Key'i yok et
    alert('DevTools kapatın lütfen');
  }
}, 1000);

🎵 Faz 3: Watermarking (Caydırıcı)

3.1. Per-User Watermark Generation

Her kullanıcıya özel inaudible watermark ekle

# FFmpeg Audio Watermarking
ffmpeg -i song.mp3 \
  -af "aecho=0.8:0.9:1000|1800:0.3" \
  -metadata user_id="123" \
  -metadata timestamp="2026-01-09" \
  watermarked_song.mp3

User ID + Timestamp yüksek frekansta gömülü (18-20 kHz)

3.2. Watermark Detection System

Sızdırılan dosyayı analiz edip kullanıcı tespit et

Acoustic fingerprint analysis ile watermark'ı decode et → User ID + Timestamp çıkar

3.3. Kullanıcıya Bildirim (Caydırıcı)

Player'da uyarı göster

⚠️ Bu şarkı size özel watermark içerir.
Paylaşırsanız kimliğiniz tespit edilir.

Kullanıcı bunu görünce "indirmeye değmez" der

💡 Gerçekçi Beklentiler (Teknik Kullanıcılar İçin)

🎯
Hedef: Developer Arkadaşlar

DevTools kullanabiliyor, ffmpeg biliyor, network trafiğini okuyabiliyor. v1 çözümleri (rate limit, user-agent) bypass edebilir.

🛡️
AES-128 Encryption Etkisi:

Segment URL'ini bulsa bile içerik şifreli. Decryption key olmadan açamaz. Key session-bound olduğu için başka yerde kullanamaz.

🎵
Watermark Caydırıcı:

Şifrelemeyi bypass edip indirse bile, watermark sayesinde kim olduğu tespit edilir. "İndirebilirim ama paylaşamam" der → Caydırıcı etki.

📌 Sonuç: 3 katmanlı koruma (Encryption + Fingerprint + Watermark) ile teknik kullanıcı bile zorlanır. "Bak indiriyoruz" diyemezler!

⚠️ Gerçek: %100 engelleme imkansız. Screen recording, analog capture her zaman mümkün. Ama o kadar uğraşmaya değmez hale getireceğiz.

Önerilen Strateji (Öncelik Sırasıyla)

  1. 1
    AES-128 Encryption (EN ÖNEMLİ!): Tüm HLS segment'leri AES ile şifrele. Key'i session-bound yap. Tahmini: 2-3 gün (FFmpeg re-encoding + backend key management)
  2. 2
    Browser Fingerprint + Key Binding: Key sadece o cihaz/browser'da çalışsın. FingerprintJS kullan. Tahmini: 1 gün (frontend integration)
  3. 3
    Watermarking (Caydırıcı): Her kullanıcıya özel acoustic fingerprint ekle. Tahmini: 2 gün (FFmpeg processing + metadata embedding)
  4. 4
    DevTools Detection (Ek Koruma): DevTools açıksa player durdur, key'i invalidate et. Tahmini: 0.5 gün (frontend JavaScript)

⏱️ Toplam Süre: 5-6 gün (fullstack geliştirme)
💰 Maliyet: 0 TL (FingerprintJS Pro hariç - $99/ay opsiyonel)
📊 Beklenen Etki: %95+ teknik kullanıcı bile engellenir

🚀 Hemen Başlayalım mı?

Adım 1: Mevcut HLS sistemini analiz edip AES-128 encryption ekleyeceğim.

Adım 2: Browser fingerprinting ile key binding yapacağım.

Adım 3: Watermark sistemi kuracağım (opsiyonel ama önerilir).

❓ Onay verin:
"UYGUNDUR" derseniz Faz 1'e başlıyorum (AES-128 Encryption).
Yoksa önce başka bir şey mi inceleyelim?