İçeriğe geç

Güvenlik ve CSP

Sayfanız bir CSP gönderiyorsa widget için iki kaynağa izin vermeniz gerekir: yükleyici betiği (API origin’i) ve iframe (site origin’i):

Content-Security-Policy: script-src 'self' https://api.mirac-ozdemir.com; frame-src https://mirac-ozdemir.com
Direktif Kaynak Neden
script-src https://api.mirac-ozdemir.com widget.js yükleyicisi.
frame-src (veya child-src) https://mirac-ozdemir.com Hesaplayıcının çalıştığı embed sayfası.

connect-src gerekmez: hesaplama iframe’in kendi içinde yapılır. Yükleyici sayfanıza satır içi (inline) betik veya stil eklemez; iframe’in stilleri CSSOM ile ayarlanır, bu yüzden unsafe-inline gerekmez.

  • Mesaj güveni. Yükleyici bir mesajı yalnızca şu koşulların hepsi sağlanırsa kabul eder: event.origin site origin’i, data.source mirac-ozdemir-widget, data.version 1, data.id bilinen bir widget örneği ve event.source o örneğin iframe penceresi. Bir çerçeve başka bir widget’ı yeniden boyutlandıramaz veya taklit edemez.
  • DOM’a veri eklenmez. API’den ve iframe’den gelen veriler textContent/DOM API’leriyle işlenir, HTML olarak ayrıştırılmaz; yük yalnızca olay detail’i olarak size iletilir.
  • İzolasyon. Embed sayfası sizin sayfanıza göre farklı bir origin’dedir: sayfanızın içeriğini, çerezlerini veya depolamasını okuyamaz. Yükleyici de iframe’e hiçbir izin (allow) vermez.
  • Sandbox. iframe’de betik, form ve açılır pencere açık; üst pencereyi yönlendirme (top navigation), indirme, modal diyaloglar ve pointer lock kapalıdır. Araç bağlantısı yeni sekmede normal şekilde açılır (allow-popups-to-escape-sandbox).
  • Komut güveni (embed sayfası). Ters yönde embed sayfası, sayfanızdan gelen bir komutu yalnızca event.source === window.parent, zarf host zarfı, id widget’ın kendi id’si (asla null değil) ve yük düzgün biçimliyse kabul eder. Bu komutlar yalnızca sunumu (tema, vurgu rengi, …) değiştirebilir, girdileri doldurabilir ve hesaplama başlatabilir; bilinmeyen türler yok sayılır. Yükleyici bunları targetOrigin olarak site origin’iyle gönderir.
  • Girdi doğrulama. data-* öznitelikleri, data-input-* değerleri ve update/setInputs argümanları katı izin listelerine göre doğrulanır (değer uzunlukları, alan adı deseni, 6 onaltılık haneli vurgu rengi, sabit tema/köşe/yoğunluk değerleri) ve URL parçaları kodlanır; bilinmeyen alanlar ve geçersiz değerler yok sayılır ya da kapsayıcı uyarıyla atlanır.
  • Yükleyicinin başlıkları. Yükleyici yanıtları Content-Type: application/javascript; charset=utf-8, Access-Control-Allow-Origin: *, Cross-Origin-Resource-Policy: cross-origin ve Content-Security-Policy: default-src 'none' (yanıtın kendisi hiçbir şey yükleyemez) taşır. Önbellek adrese göre değişir: /widget.js ve /widget/v1.js için Cache-Control: public, max-age=3600; sürümlü /widget/v<semver>.js için public, max-age=31536000, immutable; /widget/manifest.json için max-age=300 (o da origin’ler arası okunabilir).
  • Subresource Integrity. Değişmez yükleyici adresi, manifestteki sha384-… özetiyle sabitlenebilir; dosya değişirse tarayıcı reddeder: Sürüm politikası.
  • Konsol mesajları. Yükleyici geçersiz seçenekleri İngilizce console.warn ile bildirir ([MiracOzdemirWidget] …).
  • Widget sayfası site iskeletini ve Matomo analitiğini yüklemez.
  • Hesaplama girdileri yalnızca hesaplamayı yapmak için API’ye gönderilir; widget bunları sizin sayfanıza mo:result olayında geri iletir, başka bir yere göndermez.
  • Widget, ziyaretçinin kişisel verilerini sizin sayfanızdan okumaz; çünkü origin izolasyonu bunu engeller.
  • Sitenizin çerez/KVKK metninde, hesaplayıcının üçüncü taraf bir alan adından (mirac-ozdemir.com) yüklendiğini belirtmeniz iyi bir uygulamadır.

Hangi araçların ne kadar gömüldüğünü görebilmek için embed sayfası, bir widget gösterildiğinde (embed-view) ve içinde bir hesaplama yapıldığında (embed-calculation) kendi API’mize anonim bir işaret (beacon) gönderir (POST /v1/public/tools/{toolId}/events). Bu, yükleyici için de düz iframe için de geçerlidir.

  • Ne gönderilir: olay türü ve gömen sayfanın alan adı (örn. example.com); referrer origin’inden alınır, küçük harfe çevrilir. Alan adı yoksa değer (direct) olur.
  • Ne saklanır: yalnızca araç, alan adı ve gün başına sayaçlar. IP adresi, kullanıcı aracısı (user agent), sayfa yolu, çerez, hesaplama girdisi veya sonucu saklanmaz.
  • Sınırlar: günde 5.000’den fazla farklı alan adı (other) altında toplanır. Sayaçlar, diğer kullanım istatistikleriyle aynı saklama süresinden sonra silinir.
  • Nerede görünür: toplu olarak, platformun yönetim paneli içgörülerinde (“Embeds” görünümü).
  • Güvenilirlik: alan adı tarayıcının bildirdiği (referrer) bir değerdir; yani analitiktir, kanıt değildir; taklit edilebilir veya eksik olabilir.

Kendi gizlilik metniniz için: widget, ziyaretçilerinizin tarayıcılarının mirac-ozdemir.com (embed sayfası) ve api.mirac-ozdemir.com (yükleyici, hesaplama verisi ve sayaç işareti) adreslerine bağlanmasını sağlar; sayaçtan yalnızca sayfanızın alan adı, günlük olarak sayılarak tutulur.

Widget, aracın sorumluluk reddi notunu içinde gösterir ve kaldırmanıza izin vermez. Sonuçlar bilgilendirme amaçlıdır; vergi, hukuk veya finans danışmanlığı yerine geçmez.

Bir güvenlik sorunu fark ettiyseniz lütfen herkese açık bir yerde paylaşmadan önce bize ulaşın.