iframe Güvenliği (ZORUNLU)

Custom UI sayfaların kötü niyetli sitelerce çerçevelenip (clickjacking) tenant oturumunun istismarını engellemek için iki kural zorunludur: (1) CSP frame-ancestors ile yalnız panel origin'ine izin ver, (2) App Bridge mesajlaşmasını origin'e pinle ve gelen event.origin'i doğrula.

1) CSP frame-ancestors (otomatik denetlenir)

Custom UI sayfanın HTTP yanıtında bu header bulunmalı. Sürüm onayında otomatik denetlenir:

✓ GEÇER:  frame-ancestors var + panel origin'ini içerir + '*' yok
✗ REDDET: header yok · '*' · 'none' · panel origin'i yok  → onay bloklanır

2) App Bridge origin-pinleme (manuel review)

postMessage'ı wildcard '*' ile değil panel origin'ine pinli gönder ve gelen mesajlarda event.origin'i doğrula. Bu JS içinde olduğundan reviewer manuel teyit eder.

Referans

// 1) Custom UI sayfan SADECE panel tarafından çerçevelenebilmeli (anti-clickjacking).
//    Sayfanın HTTP yanıtında şu header ZORUNLU (onayda otomatik denetlenir):
Content-Security-Policy: frame-ancestors https://panel.restomenum.com
//    ❌ header yok · ❌ frame-ancestors '*' · ❌ 'none' · ❌ panel origin'i yoksa  → onay reddedilir.

// 2) App Bridge postMessage'ı wildcard '*' DEĞİL, panel origin'ine pinli gönder + gelen mesajda
//    event.origin doğrula (manuel review'da teyit edilir):
const PANEL = 'https://panel.restomenum.com';
window.parent.postMessage({ type: 'ready' }, PANEL);          // hedef origin pinli
window.addEventListener('message', (e) => {
  if (e.origin !== PANEL) return;                              // gelen origin doğrula
  // ... güvenli: e.data işle
});

Kontrol listesi

  • ✅ Sayfa yanıtında Content-Security-Policy: frame-ancestors <panel-origin>.
  • frame-ancestors '*' veya 'none' içermiyor.
  • postMessage(data, PANEL_ORIGIN) — wildcard yok.
  • if (event.origin !== PANEL_ORIGIN) return; — gelen origin doğrulanıyor.
  • Session token backend'de doğrulanıyor.
Bu kurallara uymayan Custom UI sayfaları içeren sürümler onaydan geçemez. Detaylı mekanizma için Custom UI Sayfaları.