Basit Anlatim
Teknik terim yok, herkes icin
Ne yapiyoruz?
Muzibu'da her abonelik tek bir kisi icindir. Ama bazi kullanicilar sifresini baskasina verip ayni anda iki farkli yerden dinliyor. Bu bir suistimaldir.
Biz bunu otomatik tespit eden bir sistem yaptik. Simdi bu sisteme 3 sey ekliyoruz:
Hata Duzeltmeleri
Mevcut tarama ekranindaki 6 hata ve 4 gorsel sorun duzeltilecek. Ornegin istatistik kartlari yanlis seyleri gosteriyor, skorlar yanlis formatta.
Tarama Gruplari
Simdi her tarama oncekini eziyor. Artik her tarama ayri bir grup olacak. Sabah yapilan tarama ile aksam yapilan karismaycak.
Uyari ve Yasaklama
Suistimal yapan kullaniciya uyari gonderme ve yasaklama sistemi. Kullanici onay formu doldurmak zorunda.
Nasil tespit ediyoruz?
Her kullanici sarki dinlediginde, hangi cihazdan, hangi sehirden, hangi tarayiciyla dinledigini kaydediyoruz. Sonra su 3 seye bakiyoruz:
Ping-Pong
IP adresi surekli degisiyor: Ankara → Istanbul → Ankara → Istanbul... Tek kisi boyle dinlemez. Iki farkli yerdeki iki kisi ayni hesabi paylasiyor demektir.
Ayni Anda Farkli Yerden
Saat 14:00'te hem Ankara'dan hem Istanbul'dan sarki caliyor. Bir insan ayni anda iki sehirde olamaz. Iki kisi kullaniyordur.
Ayni Bilgisayardan 2 Yayin
Ayni bilgisayardan ayni anda 2 farkli sarki caliniyor. Bir kisi 2 farkli hoparlore dagitim yapiyor olabilir. Bu da yasak.
Suistimal tespit edilince ne oluyor?
Admin suistimal gordugunce 2 secenegi var:
Secenek 1: Uyari Gonder
Admin "Uyari Gonder" butonuna basar
Kullanici siteye girdiginde her sayfanin onunde uyari yazisi cikar. Hicbir sey yapamaz, hicbir yere gidemez. Sadece bu yaziyi gorur.
Kullanici bir onay formu doldurur:
- Isim Soyisim
- Telefon (05XX XXX XX XX)
- "Okudum, anladim, onayliyorum." yazisi (ELLE yazmak zorunda, kopyala-yapistir yasak)
Formu dogru doldurursa → normal kullanima doner
3 gun icinde onaylamazsa → muzik calari kapanir. Onaylayana kadar dinleyemez.
Secenek 2: Yasakla
Admin direkt yasaklarsa, kullanici siteyi hic kullanamaz. Sadece "Musteri hizmetleriyle iletisime gecin" mesaji gorur.
Abonelik devam eder ama erisim engellenir.
Kademe Sistemi (Giderek Agirlasiyor)
Her seferinde bir kademe yukselir. Admin isterse dogrudan yasaklama da yapabilir.
Kullanici ne gorur?
Uyari Aldiysa:
Suistimal tespit edilmistir.
Kalan sure: 2 gun 14 saat
[Uyari metni...]
Yasaklandiysa:
Hesabiniz Askiya Alinmistir
Kullanim sartlarina aykiri davranis nedeniyle hesabiniz 3 gun / 15 gun / suresiz askiya alinmistir.
destek@muzibu.com
0850 XXX XX XX
Kalan: 2 gun 14 saat
Alinan Kararlar Ozeti
Admin ne gorecek?
Teknik Kararlar
KARAR-1 Ping-Pong KALACAK — 3 Pattern
A→B→A dongusu. Sirayla dinleyenleri yakalar.
detectPingPong() — ip, browser, platform, device_key
Ayni anda farkli fingerprint. Es zamanli dinleyenleri yakalar.
detectConcurrentDifferentSource()
Ayni fingerprint + overlap. 1 PC → 2 hoparlor yakalar.
detectSplitStream()
KARAR-2/3 Kademe + Diger
Uyari / Yasaklama Sistemi — Teknik
Onay Dogrulama Kurallari
Kullanicinin yazmasi gereken: "Okudum, anladim, onayliyorum."
Kabul Edilir
okudum anladim onayliyorum — virgul, Turkce karakter onemsiz
OKUDUM ANLADIM ONAYLIYORUM — buyuk/kucuk onemsiz
Okudum, anladim, onayliyorum. — tam dogru
Reddedilir
okudum — eksik kelimeler
tamam — farkli metin
copy-paste — yapistirma engelli
Normalize: lowercase → tr chars to ascii → virgul/nokta kaldir → trim → "okudum anladim onayliyorum" === input
Telefon Formati
Format: 05XX XXX XX XX (Turkiye cep telefonu)
Input mask uygulanacak. 05 ile baslamali, 11 hane olmali.
Veritabaninda: consent_phone string(20)
Akis Diyagrami
Suistimal Tespit → Admin inceledi
├── Temiz Isaretle → Bitti
├── Uyari Gonder → Kullanici uyari ekrani gorur
│ ├── 3 gun icinde onayladi → Normal (izleme surer)
│ │ ├── Tekrar suistimal → Yasakla (1. = 3 gun)
│ │ │ ├── Sure bitti → Normal
│ │ │ │ └── Tekrar → Yasakla (2. = 15 gun)
│ │ │ │ └── Tekrar → Yasakla (kalici)
│ │ └── Suistimal yok → Temiz
│ └── 3 gun gecti, onaylamadi → Player calismaz
│ └── Onayladi → Normal (player acilir)
└── Yasakla → Kademeye gore sure
└── Iletisim ekrani gosterilir
Bug Listesi (6) + Tasarim Hatalari (4)
rapid_skips, high_volume gibi eski key'ler → ping_pong, concurrent_different, split_stream + detected kontrolu
Skor puan ama "8m 20s" gosteriyor → "500 puan" olmali
Temiz kullanicida bile "3 pattern" → .filter(p => p.detected) olmali
device, platform, overlap_start/end, same_browser, same_ip service tarafindan uretilmiyor
Gunluk cakisma sayisi eksik
format('d.m.Y H:i') → format('d.m.Y')
Pattern varsa direkt "abuse" yaziyor → skora gore kademeli olmali
Tek fingerprint kullanicilar gereksiz Horizon'a gidiyor
"saniye cinsinden" → "puan cinsinden"
.abuse-report-page gradient + zorla dark input stili kaldirilacak
Tarama Batch Ayrimi
Her taramaya benzersiz batch ID verilir. Ayni gun birden fazla tarama yapilabilir, sonuclar karismaz.
scan_batch_id (UUID) + scan_batch_label + index + unique(user_id, batch_id)
GET /api/batches + list/stats batch filtresi
Batch dropdown + varsayilan son batch
Veritabani Degisiklikleri (2 Migration)
MIG-1 muzibu_abuse_reports → Batch Kolonlari
| Islem | Kolon/Index | Tip | Aciklama |
| + Kolon | scan_batch_id | string(36) nullable | UUID |
| + Kolon | scan_batch_label | string(100) nullable | "Son 7 Gun — 28.02.2026 01:15" |
| + Index | scan_batch_id | index | Hizli filtreleme |
| + Unique | (user_id, scan_batch_id) | unique | Batch basina 1 rapor |
MIG-2 YENİ TABLO: muzibu_abuse_sanctions
| Kolon | Tip | Aciklama |
| id | bigint PK auto | |
| user_id | bigint unsigned FK | users.id |
| abuse_report_id | bigint unsigned nullable FK | Tetikleyen rapor |
| type | enum('warning','ban_3day','ban_15day','ban_permanent') | Yaptirim turu |
| level | tinyint unsigned default 1 | Kacinci yaptirim (1,2,3,4) |
| status | enum('active','acknowledged','expired','lifted') | Durum |
| message | text | Gosterilen uyari metni |
| sent_by | bigint unsigned FK | Gonderen admin (users.id) |
| sent_at | timestamp | Gonderilme zamani |
| expires_at | timestamp nullable | null = kalici yasak |
| player_blocked_at | timestamp nullable | Player kapandigi an (uyari+3 gun sonra) |
| acknowledged_at | timestamp nullable | Kullanici onayi zamani |
| consent_name | string(255) nullable | Yazdigi isim soyisim |
| consent_phone | string(20) nullable | Telefon (05XX XXX XX XX) |
| consent_text | string(500) nullable | Yazdigi onay metni (aynen) |
| consent_ip | string(45) nullable | Onaylayan IP adresi |
| consent_user_agent | string(500) nullable | Onaylayan cihaz/tarayici |
| admin_notes | text nullable | Admin notu |
| created_at | timestamp | |
| updated_at | timestamp |
user_id,
status,
type,
(user_id, status) composite
Dosyalar
Guncellenecek (8)
AbuseReport.phpModelAbuseDetectionService.phpServiceScanUserForAbuseJob.phpJobAbuseReportController.phpControllerroutes/admin.phpRoutesindex.blade.phpListeshow.blade.phpDetayplayer-core.jsPlayer (sanction check)Yeni (8+)
migration: add_scan_batchMIG-1migration: create_sanctionsMIG-2AbuseSanction.phpModelAbuseSanctionService.phpServiceCheckAbuseSanction.phpMiddlewaresanctions.blade.phpAdmin listeabuse-warning.blade.phpFrontend uyariabuse-banned.blade.phpFrontend yasakTODO Listesi
FAZ 1 Bug Fix + Batch
FAZ 2 Uyari / Yasaklama Sistemi
Veritabani
Model + Service
Middleware
Frontend Sayfalari
Admin Paneli
Player