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.
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
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.
// 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
});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.