Wybber Güvenlik ve Moderasyon Politikası (Safety Policy)
Son güncelleme: 2026-10-02
Bu belge, Wybber'ın kullanıcı güvenliği konusunda bugün gerçekte ne yaptığını anlatır; henüz var olmayan bir özelliği vaat etmez. Nihai hukuki onay şirket avukatına aittir. Bu belgenin İngilizce karşılığı safety-policy.en.md'dir; Türkçe metin esastır, İngilizce metin anlam olarak birebir aynı olacak şekilde yazılmıştır.
1. Kimlik ve Yaş
- Wybber yalnızca 18 yaş ve üzeri kullanıcılara açıktır. Kayıt ekranında "Devam ederek 18 yaşından büyük olduğunu beyan ediyorsun" beyanı gösterilir.
- Yaş, kayıt sırasında beyan edilen yaş bandına (ör. "18-22") dayanır; resmi bir kimlik/belge taraması yapılmaz — bu,
age-rating.md'de ayrıca açıklanan, sektörde yaygın ve dürüstçe belirtilen bir sınırdır. - Hesaplar bir kriptografik kimlikle (DID, Ed25519 anahtar çifti) ilişkilendirilir; kayıt sırasında e-posta/telefon numarası istenmez. Kimlik, kurtarma ifadesinden (BIP39 seed) türetilir; aynı kurtarma ifadesi yeni bir cihazda aynı DID'i yeniden üretir veya QR ile cihazdan cihaza aktarılabilir (bkz.
docs/security/2026-09-19-recovery-restore-spec.md).
2. Profil Fotoğrafı Doğrulama — "Canlılık doğrulandı" Rozeti
- Kullanıcılar isteğe bağlı olarak kamera ile bir canlılık (liveness) testinden geçebilir: göz kırpma, gülümseme, kafayı sola ve sağa çevirme adımlarının hepsi istenir. Doğrulamanın kabul edilmesi için bu adımların birden fazlasının geçilmesi gerekir; hangi adımın düştüğü ekranda ayrıntılı gösterilmez.
- Tamamen cihaz üzerinde işlenir: iOS'ta Apple Vision, Android'de Google ML Kit Face Detection. Ham fotoğraf, video karesi veya yüz embedding'i hiçbir zaman backend'e gönderilmez; doğrulama akışının dosyalarında bu verileri ağa yollayan hiçbir çağrı yoktur (kanıt:
mobile-app/src/services/FaceVerificationService.ts,faceBadgeClaim.ts,mobile-app/src/screens/FaceVerificationScreen.tsx, native köprülermobile-app/ios/Wybber/FaceVerificationModule.mm,android/.../FaceVerificationModule.kt). - Profil fotoğrafıyla karşılaştırma yalnızca iOS'ta ölçülmüş bir yöntemle yapılır: iOS'ta canlı yüz, profil fotoğrafıyla cihaz üzerinde bir yüz-tanıma modeliyle (SFace, MobileFaceNet tabanlı CNN, CoreML) karşılaştırılır. Android'de böyle kalibre edilmiş bir yüz-karşılaştırma modeli yoktur (yalnızca yüz geometrisine dayanan, kalibre edilmemiş bir yöntem vardır); bu nedenle Android'de rozet, profil fotoğrafıyla eşleşme iddiası taşımaz.
- Sonuç, cihazda imzalı bir yerel attestation olarak saklanır: doğrulama zamanı, yöntem, canlılık sonucu ve kanıtın türü, eşleşme skoru, karşılaştırma özeti,
did,publicKey,hash= SHA256(payload),signature= bu hash üzerinde Ed25519 (kullanıcının kendi DID anahtarıyla). Ham foto/video/embedding bu kayda hiç girmez; kayıt cihazda şifreli tutulur, ağa gitmez (FaceVerificationService.ts::signAndSaveAttestation). - Rozet ne söyler, ne söylemez: rozet iki dilde de "Canlılık doğrulandı" / "Liveness verified" der — asla "kimlik doğrulandı" değildir; alttaki sistem bir kimlik-doğrulama sistemi değil, "kamera karşısında canlı bir insan var" testidir. Profil fotoğrafıyla eşleşme yalnızca ölçülmüş yöntemin (iOS) çalıştığı ve birincil profil fotoğrafının eşleştiği durumda iddia edilir; aksi hâlde rozet "Canlılık doğrulandı — profil fotoğrafı eşleştirilmedi" der (
mobile-app/src/screens/VerifiedBadgeScreen.tsx,mobile-app/src/components/VerifiedBadge.tsx,faceBadgeClaim.ts). - Dürüst sınır: rozet, sahte/eski bir fotoğraf veya kayıt kullanma ihtimalini azaltan bir sinyaldir, mutlak bir garanti değildir. Anti-sahtecilik (spoof/presentation-attack) tespiti cihaz üzerinde doku analizine dayanır, ancak eşik sabitleri henüz büyük ölçekli gerçek örneklerle kalibre edilmemiştir; ekrandan oynatılan bir video veya özenle hazırlanmış bir baskı gibi sunum saldırılarına karşı tam koruma sağlamaz (kanıt:
memory-bank/Features/Face-Verification.md).
3. Bildirme (Şikayet Et) ve Engelleme (Engelle)
Uygulamadaki yol. Karşı tarafı bildirmek veya engellemek için, açık bir sohbetin üst çubuğundaki "Şikayet Et" ve "Engelle" düğmelerini kullanırsınız (mobile-app/src/screens/HumanChatScreen.tsx; "Şikayet Et" tam akışı mobile-app/src/screens/ReportBlockScreen.tsx açar). Bu düğmeler yalnızca bir eşleşme sohbete açıldıktan sonra erişilebilir; Wybber görüşmesi (müzakere) sırasında ayrı bir şikayet/engel ekranı yoktur. Ayarlar'da bir şikayet ekranı yoktur; Ayarlar → Engellenen kullanıcılar, engellediğiniz kişileri listeler ve engeli kaldırmanıza izin verir (BlockedUsersScreen.tsx). Bu belgenin geri kalanı, arka planda ne olduğunu anlatır (backend POST /community-safety/report — backend/app/api/community_safety_v1.py; uygulama tarafı mobile-app/src/services/CommunitySafetyGuardianService.ts).
Rapor akışı — uçtan uca ne olur:
- Kullanıcı kategori seçer:
harassment(taciz),spam,fake_profile(sahte profil),inappropriate_content(uygunsuz içerik),scam(dolandırıcılık),violence(şiddet),other(diğer) — bu yedi kategori dışında bir değer backend tarafından reddedilir (community_safety_v1.py::_ALLOWED_REPORT_CATEGORIES). Şiddet, dolandırıcılık ve taciz kategorileri tek dokunuşla gönderilir ve şikayet edilen kişi aynı anda otomatik olarak engellenir; diğer kategoriler ikinci bir onay adımı ister ve kişiyi otomatik engellemez (ReportBlockScreen.tsx,CommunitySafetyGuardianService.ts::reportUser). - Cihaz, bildirilen kişinin kimliğini yalnızca SHA-256(DID) olarak gönderir. Bildirenin kimliği her zaman sunucuda, kendi JWT'sinden türetilen SHA-256(DID) olarak belirlenir — istemcinin gönderdiği "reporter" alanı kasıtlı olarak yok sayılır, böylece bir kullanıcı başka birini raportör gibi göstererek çerçeveleyemez (
community_safety_v1.py::submit_report). - Backend, raporu
abuse_reportstablosuna kalıcı olarak yazar: raportör hash'i, bildirilen hash'i, kategori, (varsa) kanıt hash'i, durum (pending), oluşturulma zamanı. Serbest metin bir açıklama alanı bu uç noktadan hiçbir zaman doldurulmaz —AbuseReport.descriptionkolonu şema olarak vardır ama üretimde bağlı tek yazıcı (submit_report) bunu her zaman boş bırakır; rapor tamamen meta-only'dir. Bugün uygulama rapora kanıt (ekran görüntüsü/mesaj metni) eklemediği için kanıt hash'i alanı da fiilen boştur; içerik/kanıt sunucuya hiç gitmez (kanıt:backend/app/models/__init__.py::AbuseReport,community_safety_v1.py::submit_report). - İnternet yoksa veya sunucu yanıt vermezse rapor cihazda sıraya alınır ve uygulama bir sonraki açılışta/öne gelişinde yeniden dener (
CommunitySafetyGuardianService.ts::flushPendingReports); sunucuya ulaşana kadarabuse_reportstablosunda (ve dolayısıyla veri dışa aktarımınızda) görünmez.
Kendi raporlarınızı görmek. Uygulamada ayrı bir "rapor geçmişi" ekranı yoktur. Gönderdiğiniz raporlara, Ayarlar → Gizlilik → "Verilerim" ile indirdiğiniz veri dosyasından (wybber-data-<tarih>.json) ulaşabilirsiniz: dosyanın server bölümündeki abuse_reports_filed_by_me listesi, sizin gönderdiğiniz her rapor için bildirilen kişinin hash'lenmiş kimliğini, kategoriyi, kanıt hash'ini, durumu ve zaman damgasını içerir (GET /api/users/me/export; saatte bir kez indirilebilir). Bu liste bir isim göstermez (kimlik hash'lidir) ve bir raporun sonucunu da göstermez: durum alanı bugün pending olarak yazılır ve uygulamada bu alanı güncelleyen bir ekran ya da uç nokta yoktur. Hakkınızda yapılan bildirimler bu dosyaya dahil edilmez — bu, bildirenin korunması için bilinçli bir sınırdır (ayrıntı için Gizlilik Politikası §6).
Kim inceler, ne kadar sürede: Bu noktada dürüst olmak gerekir. Bir rapor abuse_reports tablosuna pending olarak yazılır; otomatik bir e-posta, destek kutusuna düşen bir kayıt, moderasyon paneli veya kuyruk yoktur — uygulamada bu tabloyu okuyup bir kişiye bildiren bir bileşen bulunmaz. Raporlar, yalnızca sunucu veritabanına erişimi olan Wybber operatörü tarafından o tabloyu elle sorgulayarak incelenebilir. Bu nedenle bir inceleme süresi taahhüdü vermiyoruz ve her raporun bir insan tarafından incelendiğini de söylemiyoruz. Acil tehlike için yerel acil yardım hatlarını arayın (bkz. §6); acil müdahale için de şikayet kanalına güvenmeyin. Rapor dışında bizimle iletişim: support@wybber.com.
Engelleme (Block) semantiği:
- Herhangi bir kullanıcı diğerini tek taraflı olarak engelleyebilir. Engelleme önce cihaza kaydedilir, ardından sunucuya iletilir (
POST /api/blocks/by-hash/{did_sha256}—backend/app/api/blocks.py); sunucuya ulaşılamazsa cihazda sıraya alınıp yeniden denenir (HumanChatService.ts::blockPeerByDid/flushPendingBlockSync). Aşağıdaki eşleştirme/sinyalleşme dışlamaları, sunucu kaydı oluştuktan sonra devreye girer. - Engelleme sessiz ve tek taraflıdır: uygulama engellenen kişiye bir mesaj veya bildirim göndermez, sunucu da bildirmez. Engelleyen taraf kendi blok listesini görebilir ve engeli kaldırabilir; engellenen taraf, uygulamanın kendisine bunu söylemeyeceğini bilmelidir — sadece karşı tarafı bir daha göremez/eşleşemez/mesajlaşamaz.
- Bir engelleme anında, o iki kullanıcı arasındaki var olan karşılıklı eşleşme durumu da silinir (
backend/app/api/matching.py::purge_mutual_state_for_block,blocks.py::_do_blockile aynı işlemde) — böylece "engellendim" ile "eşleşme sona erdi" durumları karşı taraf için ayırt edilemez hale gelir; bu kasıtlıdır (bir "blok kâhini/oracle" oluşturmamak için). Engeli kaldırmak silinen eşleşmeyi geri getirmez. - Eşleştirme/sinyalleşme sorguları her zaman karşılıklı blok listesini kontrol eder (
matching.py::_is_blocked_pair,is_mutual_match): engellenen taraf ne yeni bir Wybber turu için aday olarak önerilir, ne sinyalleşme (WebRTC) bağlantısı kurabilir. - Hesap silinse dahi (
DELETE /api/users/me), o hesabın verdiği veya aldığı raporlar silinmez; ancak her iki taraftaki kimlik bağı geri döndürülemez şekilde anonimleştirilir (deleted:önekli, tek yönlü bir değerle değiştirilir;backend/app/api/users.py,abuse_reportssatırları) — bu, "hesabımı silip rapor geçmişimi gizlemek" yoluyla kötüye kullanımın saklanmasını önlemek içindir. Silinen hesabın raporları, hesabınızla bağlantısı koparıldığı için sonradan veri dışa aktarımınızda da görünmez.
4. Otomatik Politika Denetimi (Guardian) — cihaz üzerinde
- Cihaz üzerinde çalışan bir Guardian politika motoru (
mobile-app/src/services/GuardianPolicyEngine.ts) şunları denetler: Wybber görüşmesinin (müzakere) çıktıları ve sizin gönderdiğiniz sohbet mesajları — mesaj karşı tarafa gitmeden önce cihazınızda kural kümesinden geçer (HumanChatService.ts::sendMessage). Mesaj içindeki telefon numarası, e-posta adresi ve kart numarası karşı tarafa gitmeden[PHONE]/[EMAIL]/[CARD]ile değiştirilir; spam, küfür/nefret söylemi ve kişisel bilgi isteme kalıplarıyla eşleşen mesajlar gönderilmez; buluşma ve para talebi kalıpları için uyarı kuralları vardır. Motorun ayrıca konu bazlı bekleme süresi (cooldown) ve konu bazlı açık rıza kapıları ile komut-enjeksiyonu (prompt-injection) sınıflandırması ve otomatik onarımı vardır. - Dürüst sınır: bugünkü içerik-engelleme kuralları esas olarak İngilizce anahtar sözcük/kalıp eşleştirmesidir; Türkçe ve diğer dillerdeki küfür/taciz içeriğini kapsamlı biçimde yakalayan bir sınıflandırıcı değildir. Guardian bir tam içerik moderasyonu değildir — kullanıcı bildirimi ve engelleme (§3), asıl koruma mekanizmasıdır.
- Guardian, backend'e ulaşan bir içerik değil, kullanıcının kendi cihazındaki metni denetler; Guardian kararları/logları cihazda tutulur. Bu belge hazırlanırken yapılan kod taramasında, uygulamanın canlı akışlarında bu kararları sunucuya gönderen bir çağıran bulunmadı (taranan: Guardian karar-kaydı ve şeffaflık servislerinin sunucuya
fetcheden metotlarının çağıranları); tarama bir kanıt-yokluğu taramasıdır, resmî bir veri-akışı denetimi değildir. - Wybber görüşmesi/turu deterministik, önceden tanımlı kategori kodları ile yürütülür (LLM çıktısı karar yolunda değildir); serbest metin karşı cihaza iletilmez (kanıt:
agents/agent-represented-matching.md).
5. Sohbetlere Sunucu Erişimi Yoktur — Kolluk Kuvveti Talepleri İçin Anlamı
- Eşleşen iki kullanıcı arasındaki tüm sohbet mesajları uçtan uca şifrelidir (E2EE: X25519 anahtar değişimi + XSalsa20-Poly1305,
nacl.secretbox) ve WebRTC ile cihazdan cihaza gider. Doğrudan bağlantı kurulamazsa trafik Wybber'ın kendi barındırdığı TURN röle sunucusu üzerinden geçer; röle mesaj içeriğini göremez (trafik uçtan uca şifrelidir) ama bağlantı sırasında IP adresinizi görür. Bağlantı kurulumu sırasında iletilen ICE adayları da IP taşır; bunlar aktarım anında sinyalleşme sunucusundan geçer, kalıcı olarak saklanmaz (bkz. Gizlilik Politikası §3.2). - Backend,
conversationstablosunda yalnızca kimin kiminle (dahili katılımcı id'leri), ne zaman konuştuğuna ve oturumun aktif olup olmadığına dair meta veriyi tutar; mesaj içeriği için hiçbir sunucu tarafı kolon yoktur (kanıt:backend/app/models/__init__.py,Conversation). - Sonuç olarak: Wybber, mahkeme kararı dahil hiçbir talep karşılığında bir kullanıcının sohbet içeriğini sağlayamaz — çünkü bu içerik hiçbir zaman şirketin sunucularına ulaşmamıştır ve şirketin elinde bir şifre çözme anahtarı yoktur. Yasal olarak paylaşılabilecek olan, sunucuda gerçekten tutulan meta veridir; örneğin: hesap kayıt bilgisi (DID, kayıt sırasında beyan edilen cinsiyet/ilgi cinsiyeti/yaş bandı, seçilen il/ilçe), kimin kiminle ne zaman eşleştiği/konuştuğu, bildirim (push) token'ları, satın alma kayıtları (ürün, mağazanın işlem kimliği, makbuz hash'i, durum) ve
abuse_reportstablosundaki (hash'lenmiş kimlikli, içeriksiz) rapor kayıtları. Bu liste örnektir; sunucuda tutulan verinin tam ve güncel listesi Gizlilik Politikası §3'teki tablodadır. Bu sınır, kullanıcıya ve yetkili makamlara aynı netlikte açıklanır.
6. Buluşma Güvenliği — Kullanıcı Tavsiyeleri
Uygulama bu tavsiyeleri bir eşleşme sohbete açıldığında otomatik olarak göstermez; bunlar bu belgedeki genel tavsiyelerdir:
- İlk buluşmaları halka açık bir yerde yapın.
- Buluşma planınızı güvendiğiniz birine bildirin.
- Kendi ulaşımınızı sağlayın.
- Şüpheli davranış (para talebi, erken aşamada aşırı kişisel bilgi talebi, tutarsız hikaye) gördüğünüzde "Şikayet Et" / "Engelle" düğmelerini kullanın (§3).
- Acil bir durumda yerel acil yardım hatlarını arayın; Wybber bir acil durum servisi değildir.
7. Kapsam ve Yöntem Notu
Bu belge, aşağıdaki kod yollarının doğrudan okunmasıyla doğrulanmıştır: backend/app/api/community_safety_v1.py (mounted, gerçek rapor yazıcı), backend/app/api/blocks.py, backend/app/api/matching.py (purge_mutual_state_for_block, _is_blocked_pair), backend/app/models/__init__.py (AbuseReport, Block, Conversation), backend/app/api/users.py (delete_me/export_my_data), mobile-app/src/screens/{HumanChatScreen,ReportBlockScreen,BlockedUsersScreen,SettingsScreen}.tsx, mobile-app/src/services/{FaceVerificationService,faceBadgeClaim,GuardianPolicyEngine,CommunitySafetyGuardianService,HumanChatService,GDPRDataSubjectRightsService}.ts, memory-bank/Features/Face-Verification.md. Not edilen bir eski/alternatif rapor uç noktası, backend/app/api/trust_safety.py, üretimde mount edilmemiştir (_INTERNAL_OPS_ROUTERS) — bu belge yalnızca gerçekten canlı olan community-safety/report akışını anlatır.
İlgili Belgeler
privacy-policy.tr.md/.en.md— tam veri akışıterms-of-service.tr.md/.en.mdage-rating.md— yaş derecelendirmesiapp-privacy-nutrition-label.md— App Store "App Privacy" cevapları