Suistimal Sistemi — Tam Plan v4

Bug Fix + Batch Ayrımı + Uyarı/Yasaklama + Migration Detayları

6
Bug
4
Tasarım
2
Yeni
2
Migration
Basit Anlatim Kararlar Uyari/Yasak Buglar Batch Migration Dosyalar TODO

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:

1.

Hata Duzeltmeleri

Mevcut tarama ekranindaki 6 hata ve 4 gorsel sorun duzeltilecek. Ornegin istatistik kartlari yanlis seyleri gosteriyor, skorlar yanlis formatta.

2.

Tarama Gruplari

Simdi her tarama oncekini eziyor. Artik her tarama ayri bir grup olacak. Sabah yapilan tarama ile aksam yapilan karismaycak.

3.

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

1

Admin "Uyari Gonder" butonuna basar

2

Kullanici siteye girdiginde her sayfanin onunde uyari yazisi cikar. Hicbir sey yapamaz, hicbir yere gidemez. Sadece bu yaziyi gorur.

3

Kullanici bir onay formu doldurur:

  • Isim Soyisim
  • Telefon (05XX XXX XX XX)
  • "Okudum, anladim, onayliyorum." yazisi (ELLE yazmak zorunda, kopyala-yapistir yasak)
4

Formu dogru doldurursa → normal kullanima doner

!

3 gun icinde onaylamazsa → muzik calari kapanir. Onaylayana kadar dinleyemez.

Geri sayim: Kullanici ekranda "2 gun 14 saat 23 dakika kaldi" seklinde kalan sureyi gorur.

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)

1. Uyari
Onay formu
3 gun sure
2. Yasak
3 gun engel
Iletisim ekrani
3. Yasak
15 gun engel
Iletisim ekrani
4. Kalici
Suresiz engel
Iletisim ekrani

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...]

Isim Soyisim: [____]
Telefon: [05__ ___ __ __]
Onay: [Okudum, anladim...]
Gonder

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

3 tespit yontemi kalacak (Ping-Pong dahil)
Kademe: Uyari → 3 gun → 15 gun → Kalici
E-posta gondermeyecegiz, sadece site ici
Abonelik devam eder, sadece erisim engeli
Geri sayim gosterilecek (kalan sure)
Form: Isim + Telefon (05XX) + Onay metni
Onay: Buyuk/kucuk, Turkce karakter, virgul onemsiz
Kopyala-yapistir yasak, elle yazmak zorunda

Admin ne gorecek?

Tarama Listesi (mevcut): Butun kullanicilarin suistimal tarama sonuclari. Artik her tarama ayri bir "grup" olacak, dropdown ile secim yapilacak.
Rapor Detayi (mevcut): Bir kullanicinin detayli analizi. Burada "Uyari Gonder" ve "Yasakla" butonlari olacak.
Uyarili/Yasakli Kullanicilar (yeni sayfa): Uyari veya yasak almis tum kullanicilar. Her birinin altinda suistimal gunleri, onay bilgileri (isim, telefon, ne yazdi), kalan sure gorunecek.

Teknik Kararlar

KARAR-1 Ping-Pong KALACAK — 3 Pattern

Ping-Pong KALIYOR

A→B→A dongusu. Sirayla dinleyenleri yakalar.

detectPingPong() — ip, browser, platform, device_key

Concurrent Different

Ayni anda farkli fingerprint. Es zamanli dinleyenleri yakalar.

detectConcurrentDifferentSource()

Split Stream

Ayni fingerprint + overlap. 1 PC → 2 hoparlor yakalar.

detectSplitStream()

Skor (max 1300): PP: dongu x 100 (max 500) + CD: ornek x 50 (max 500) + SS: ornek x 30 (max 300)

KARAR-2/3 Kademe + Diger

Kademe: Uyari → 3g → 15g → Kalici
E-posta: Hayir, site ici
Abonelik: Devam eder, erisim engeli
Geri sayim: Evet, gosterilecek

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)

B1 Kritik apiStats() yanlis pattern key'leri

rapid_skips, high_volume gibi eski key'ler → ping_pong, concurrent_different, split_stream + detected kontrolu

B2 formatScore() saniye formati

Skor puan ama "8m 20s" gosteriyor → "500 puan" olmali

B3 getPatternCount() detected filtresi yok

Temiz kullanicida bile "3 pattern" → .filter(p => p.detected) olmali

B4 Kritik show.blade overlap kartlari eksik alanlar

device, platform, overlap_start/end, same_browser, same_ip service tarafindan uretilmiyor

B5 calculateDailyStats() overlaps key yok

Gunluk cakisma sayisi eksik

B6 scan_date saat gosteriyor

format('d.m.Y H:i') → format('d.m.Y')

D1 scanUser() status: hasAbuse → determineStatus

Pattern varsa direkt "abuse" yaziyor → skora gore kademeli olmali

D2 quickCheck() Job'da kullanilmiyor

Tek fingerprint kullanicilar gereksiz Horizon'a gidiyor

D3 THRESHOLD sabitleri yorum duzeltme

"saniye cinsinden" → "puan cinsinden"

D4 show.blade dark tema cakismasi

.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.

Migration

scan_batch_id (UUID) + scan_batch_label + index + unique(user_id, batch_id)

API

GET /api/batches + list/stats batch filtresi

UI

Batch dropdown + varsayilan son batch

Veritabani Degisiklikleri (2 Migration)

MIG-1 muzibu_abuse_reports → Batch Kolonlari

IslemKolon/IndexTipAciklama
+ Kolonscan_batch_idstring(36) nullableUUID
+ Kolonscan_batch_labelstring(100) nullable"Son 7 Gun — 28.02.2026 01:15"
+ Indexscan_batch_idindexHizli filtreleme
+ Unique(user_id, scan_batch_id)uniqueBatch basina 1 rapor

MIG-2 YENİ TABLO: muzibu_abuse_sanctions

KolonTipAciklama
idbigint PK auto
user_idbigint unsigned FKusers.id
abuse_report_idbigint unsigned nullable FKTetikleyen rapor
typeenum('warning','ban_3day','ban_15day','ban_permanent')Yaptirim turu
leveltinyint unsigned default 1Kacinci yaptirim (1,2,3,4)
statusenum('active','acknowledged','expired','lifted')Durum
messagetextGosterilen uyari metni
sent_bybigint unsigned FKGonderen admin (users.id)
sent_attimestampGonderilme zamani
expires_attimestamp nullablenull = kalici yasak
player_blocked_attimestamp nullablePlayer kapandigi an (uyari+3 gun sonra)
acknowledged_attimestamp nullableKullanici onayi zamani
consent_namestring(255) nullableYazdigi isim soyisim
consent_phonestring(20) nullableTelefon (05XX XXX XX XX)
consent_textstring(500) nullableYazdigi onay metni (aynen)
consent_ipstring(45) nullableOnaylayan IP adresi
consent_user_agentstring(500) nullableOnaylayan cihaz/tarayici
admin_notestext nullableAdmin notu
created_attimestamp
updated_attimestamp
Index'ler: user_id, status, type, (user_id, status) composite
Sari satirlar = Kullanici onay formu verileri (isim, telefon, metin, IP, cihaz)

Dosyalar

Guncellenecek (8)

AbuseReport.phpModel
AbuseDetectionService.phpService
ScanUserForAbuseJob.phpJob
AbuseReportController.phpController
routes/admin.phpRoutes
index.blade.phpListe
show.blade.phpDetay
player-core.jsPlayer (sanction check)

Yeni (8+)

migration: add_scan_batchMIG-1
migration: create_sanctionsMIG-2
AbuseSanction.phpModel
AbuseSanctionService.phpService
CheckAbuseSanction.phpMiddleware
sanctions.blade.phpAdmin liste
abuse-warning.blade.phpFrontend uyari
abuse-banned.blade.phpFrontend yasak

TODO Listesi

FAZ 1 Bug Fix + Batch

Ping-Pong KALACAK (3 pattern)
MIG-1 Asama 1 onayi
MIG-1 Asama 2: Icerik goster + onay
MIG-1 Asama 3: Calistirma onayi
AbuseReport.php: fillable, threshold, skor format, scopeInBatch
AbuseDetectionService.php: batch params, sliding window, sample alanlari, overlaps [B4,B5,D1]
ScanUserForAbuseJob.php: batch params, quickCheck early exit [D2]
AbuseReportController.php: batch ID/label, apiStats fix [B1], apiBatches
Routes: api/batches GET
index.blade: 3 pattern karti, formatScore, getPatternCount, batch dropdown [B1-B3]
show.blade: 3 pattern meta, skor puan, dark tema fix, batch bilgisi [B6,D3,D4]

FAZ 2 Uyari / Yasaklama Sistemi

Veritabani

MIG-2: muzibu_abuse_sanctions tablosu (3 asamali onay)

Model + Service

AbuseSanction.php model (type, level, status, iliskiler)
AbuseSanctionService.php (sendWarning, banUser, acknowledge, getNextLevel)

Middleware

CheckAbuseSanction middleware
Uyari → onay ekrani, Ban → yasak ekrani, 3 gun → player engeli
Frontend route'lara middleware kaydet

Frontend Sayfalari

abuse-warning.blade.php (uyari + onay formu + geri sayim)
abuse-banned.blade.php (yasak mesaji + iletisim)
Onay form submit route + controller
Paste engeli + typing validation
Telefon input mask (05XX XXX XX XX)
Geri sayim timer (JS)

Admin Paneli

show.blade: "Uyari Gonder" + "Yasakla" butonlari
sanctions.blade.php (uyarili/yasakli kullanicilar listesi)
Kullanici detay: suistimal gunleri + yaptirim gecmisi
API: sendWarning, banUser, liftSanction
Routes: sanctions prefix

Player

Stream endpoint: ban/uyari kontrolu
Player UI: engelli bilgi mesaji

FAZ 3 Dogrulama

Migration sonrasi kolonlar/tablo olustu mu?
Batch + Score + Pattern sayisi dogru mu?
Uyari gonder → kullanici ekrani + paste engeli
Onay sonrasi → normal kullanim
3 gun + onaysiz → player durdu mu?
Yasakla → yasak ekrani + kademe yukseltme
Geri sayim timer dogru mu?

Kapsam Disi

E1: Otomatik tarama (cron) E2: CSV/Excel export E3: Arsiv/soft delete E4: Real-time progress E5: E-posta bildirimi E6: Abonelik iptali