Güvenlik kararları

Sürüm 1.0.0 · Bu sayfa whmcs-musteri-yorumlari-1.0.0.zip paketindeki docs/GUVENLIK.md dosyasının HTML görünümüdür.

Kimlik ve yetki

  • Müşteri kimliği yalnızca WHMCS oturumundan alınır (WHMCS\Authentication\CurrentUser: kullanıcı + seçili müşteri hesabı; kullanıcının o hesaba erişimi hasAccessToClient ile yeniden denetlenir). Formdaki hiçbir alan (müşteri kimliği, ad, e-posta) kimlik sayılmaz.
  • Bağlı kullanıcılar: hesap sahibi olmayan kullanıcı varsayılan olarak yorum yazamaz. Ayar açılırsa yalnızca o hesapta products + manageproducts izni olan kullanıcı yazabilir. Görünür ad her zaman müşteri hesabının adından üretilir.
  • Yönetici "müşteri olarak giriş" yaptığında yorum yazılamaz/değiştirilemez (yöneticinin müşteri adına yorum üretmesini engeller).
  • E-posta doğrulaması: WHMCS'te açıksa (ya da ayar "her zaman" ise) doğrulanmamış kullanıcı formu göremez; doğrulama e-postasını yeniden gönderme düğmesi (CSRF + saatte 3 sınır) gösterilir. WHMCS genel ayarı değiştirilmez.
  • IDOR/BOLA: her uç noktada yorum client_id'si oturumdaki hesapla karşılaştırılır (SubmissionService::ownedReview); hizmet seçimi yalnızca o hesabın uygun hizmetleri arasından kabul edilir. Herkese açık kimlik 12 karakter rastgele (public_id), sıralı veritabanı kimliği dışarı verilmez.
  • Yönetici izinleri: (1) yönetici etkin, (2) rolü WHMCS modül erişim listesinde, (3) rolün modül içi izin listesinde ilgili izin. Denetim servis katmanında her işlemde yapılır (toplu işlem, dışa aktarma, bakım dahil); sekme gizlemek yetki değildir. Kendi rolünden ayar yetkisini kaldırmak ve son ayar yetkisini silmek engellenir. İzinler: görüntüleme, moderasyon, yanıt, maskeleme, bildirim/talepler, kategoriler, davetler, kanıtlar, ayarlar, raporlar, dışa aktarma, dışa aktarmada e-posta, denetim, bakım.

İstekler

  • Bütün yazma işlemleri POST + WHMCS CSRF belirteci (generate_token('plain') ile sabit zamanlı karşılaştırma). GET hiçbir durumu değiştirmez (davetten çıkma da onay sayfası + POST'tur).
  • Başarılı POST sonrası yalnızca modülün kendi sabit adreslerine 303 yönlendirme (PRG). Kullanıcıdan gelen adrese yönlendirme yapılmaz; donus yalnızca izinli kökenle birebir eşleşirse bağlantı olarak gösterilir.
  • WHMCS'in girdiye uyguladığı HTML kodlaması bir kez çözülür (htmlspecialchars_decode), veri düz metin olarak saklanır, çıktıda bağlama göre yeniden kaçışlanır.
  • Gönderimde idempotency anahtarı (oturumda verilen tek kullanımlık değer, veritabanında benzersiz): çift tıklama tek revizyon üretir.

Veri bütünlüğü ve eşzamanlılık

  • Hesap × kategori için tek değerlendirme: UNIQUE (client_id, category_id) + INSERT IGNORE + SELECT … FOR UPDATE. Kilitlenmede (1213/1205) işlem artan beklemeyle en çok 6 kez yeniden denenir. 8 eşzamanlı süreçle test edildi (tek kayıt).
  • Yayındaki içerik yalnızca revizyon onayında, aynı işlemde değişir. Yöneticinin puan/metin değiştiren yöntemi yoktur; kişisel bilgi maskelemesi yalnızca metin parçalarının [gizlendi] ile değiştirilmesine izin verir (Text::isValidMask).

Çıktı

  • HTML: htmlspecialchars(ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5); satır sonları kaçıştan sonra <br>. Bağlantı üretilmez, HTML desteklenmez.
  • JSON-LD: JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT → </script> kırılması mümkün değil (test edildi).
  • JS widget: API metni yalnızca textContent/createTextNode ile DOM'a girer; kaynakta innerHTML, eval, new Function yoktur (statik test).
  • E-posta: birleştirme alanları HTML-kaçışlı.
  • CSV: = + - @, sekme ve satır başıyla başlayan hücrelere ' öneki; e-posta kolonu ayrı izin.
  • Herkese açık dosyalarda (JS, CSS, şablon çıktısı) açıklama yorumu yoktur.

Oran sınırları ve IP

  • API: IP başına dakikada 120 (ayar). Gönderim: hesap başına saatte 6. Ziyaretçi bildirimi: IP başına saatte 5, aynı IP + yorum için 24 saatte 1; saatte 2'den fazla bildirimde sunucu tarafı doğrulama sorusu. Doğrulama e-postası: kullanıcı başına saatte 3.
  • IP ham olarak saklanmaz; HMAC özeti kullanılır (bildirimlerde varsayılan 30 gün sonra silinir).
  • Vekil başlıkları (CF-Connecting-IP, X-Forwarded-For, X-Real-IP) yalnızca bağlantı yapılandırılmış güvenilir vekilden geliyorsa kullanılır; Cloudflare listesi resmi kaynaktan alındı (2026-10-05). Doğrudan gelen istemcinin sahte başlığı yok sayılır (test edildi).

Gizli bilgiler

  • Modül gizli anahtarı (mod_myr_settings.secret_key) etkinleştirmede rastgele üretilir; çıktıya, günlüğe, dışa aktarıma yazılmaz.
  • Davetten çıkma belirteci: HMAC imzalı, 180 gün geçerli, yalnızca davet tercihini günceller; oturum açmaz, yorum yetkisi vermez.
  • Denetim kaydı meta alanında parola/belirteç/oturum/e-posta/IP anahtarları süzülür.
  • Hata ayrıntısı kullanıcıya gösterilmez (SQL, yol, yığın izi yok); WHMCS etkinlik günlüğüne kısa sınıf adı + mesaj yazılır.

Denetim kaydı

Uygulamada mod_myr_audit için yalnızca ekleme yolu vardır. Her satır öncekinin SHA-256 özetini taşır; yönetim panelinde "Zinciri doğrula" silme/değiştirme olup olmadığını gösterir. Bu, veritabanı yöneticisine karşı mutlak değişmezlik sağlamaz; kurcalamayı görünür kılar.

Dosya erişimi

  • lib/*.php doğrudan çağrılınca çıktı vermez (WHMCS/MYR_STANDALONE sabiti yoksa çıkış); musteriyorumlari.php ve hooks.php WHMCS dışında reddeder. Şablonlar sabit eşlemeden seçilir; kullanıcı kontrollü include/yol, şablon eval'i, uzaktan kod indirme ya da otomatik güncelleme yoktur.
  • api.php WHMCS'i yüklemez; configuration.php'yi yalnızca veritabanı bilgisi için okur ve modül etkin değilse 404 döner.

Bağımlılıklar

Modül yeni bir bağımlılık getirmez; yalnızca WHMCS'in kendi paketlediği Illuminate Database'i (Capsule) ve PHP'nin yerleşik eklentilerini kullanır. JS widget harici kütüphane, CDN ya da jQuery kullanmaz. Test için kullanılan jsdom yalnızca geliştirme ortamındadır, pakette yoktur. Kod gizleme/obfuscation güvenlik önlemi olarak kullanılmamıştır.

Hukuki not

Yayınlama bilgilendirmesi, saklama süreleri, kaldırma ve anonimleştirme teknik olarak sağlanır ve yapılandırılabilir. Bu, KVKK/GDPR ya da tüketici mevzuatına uyum garantisi değildir; metinler hukuk danışmanıyla gözden geçirilmelidir.

İnternet bağlantınız kesildi