İçeriğe geç

Custom HTML ve iframe Erişimi

Custom HTML sayfaları, animasyon çerçeveleri, raporlar ve dashboard’lar ayrı bir sandbox portundan (varsayılan 8083) iframe içinde açılır. Ayrı port bir izolasyon sınırıdır: bu içerik sandbox="allow-scripts" ile, kendi kaynağında çalışır.

Bu sayfa, aynı kurulumun hem yerel ağdan hem dış adresten (tipik olarak Secure Access) kullanıldığı durumu anlatır. İki erişim yolu da aynı anda çalışabilir, ama tarayıcı tarafındaki izinlerin her yol için ayrı ayrı verilmesi gerekir.

Çerçevenin adresini sunucu değil tarayıcı kurar:

${location.protocol}//${location.hostname}:${sandboxPort}

sandboxPort değeri GET /api/config cevabından gelir. Sonuç: kullanıcı hangi adresten girdiyse çerçeve o adresin 8083 portundan açılır. Çerçeve böylece her zaman uygulamayla aynı ana makineye düşer — ana makineye bağlı çerezler ona ulaşır.

Üç ayrı denetim vardır ve aynı ayardan beslenmezler. Bir erişim yolunun çalışması için üçünün de o yolu tanıması gerekir.

AyarNeyi beslerBiçim
ins.app.url, ins.sandbox.url, ins.frontend.urlHostAllowlist’e birebir origin olarak girer — CORS ve sandbox Referer/Origin denetimiHer biri tek değer
ins.allowed-hostsHostAllowlist’e host regex’i ekler; port kısıtı yokturTek regex
ins.iframe.allowed-hostsAna sayfanın CSP’sindeki frame-src ve frame-ancestors, ve animasyonun dış iframe doğrulamasıVirgülle ayrılmış liste

ins.iframe.allowed-hosts listesinin iki ayrı tüketicisi olduğu için iki biçim birlikte yazılır:

  • CSP yönergeleri somut origin ister (https://makine:8083). Bu yönergeler sabit bir liste olmak zorundadır: sandbox yanıtı üretilirken üst çerçevenin adresi henüz bilinmez, dolayısıyla istek anında türetilen çerçeve adresinin bu listede önceden bulunması gerekir.
  • Animasyonun dış iframe doğrulaması ise adresi çıplak host adıyla karşılaştırır (makine). Bu doğrulama fail-closed’dır: liste boşsa her adres reddedilir.

Bu regex yerel varsayılanların yerine geçer, onlara eklenmez. Varsayılanlar şunlardır:

  • localhost
  • 127.*
  • Secure Access tünel ağı 10.66.66.*

Regex’i verirken bunları da içine yazmazsanız, önceden çalışan tünel erişimi ya da sunucunun kendi üzerinden erişim bozulur.

  1. ins.app.url ve ins.sandbox.url dış adresi göstersin.
  2. Yerel ağ IP’sini ya da makine adını ins.allowed-hosts regex’ine ekleyin — yanına localhost, 127.0.0.1 ve tünel ağını da yazın (yukarıdaki uyarı).
  3. ins.iframe.allowed-hosts listesine her erişim yolu için şunları ekleyin:
    • 8082 ve 8083 origin’leri
    • çıplak host adı
    • localhost ve 127.0.0.1’in origin’leri de buna dahildir. Bunlar HostAllowlist’te varsayılan olarak vardır ama CSP frame-src’e kendiliğinden girmez; yazılmazsa sunucunun kendi üzerinde https://localhost:8082 ile girildiğinde Custom HTML açılmaz.
  4. Yerel ağdan erişim için güvenlik duvarında 8082 ve 8083 gelen bağlantıya açık olmalıdır. Tünel trafiği güvenlik duvarına takılmaz.
  5. Sertifika yerel IP’yi kapsamıyorsa, tarayıcı 8083’ün sertifikasını ayrıca kabul etmelidir: https://<yerel-ip>:8083 adresi bir kez doğrudan açılır. Kabul edilmezse çerçeve hata vermeden boş kalır.

Ayarlar <kurulum>\config\application.yml dosyasına yazılır ve ardından inSCADA servisi yeniden başlatılır. JVM -D parametresi ya da servis tanımında değişiklik gerekmez.

ins:
app:
url: https://<firma>.inscada.online
sandbox:
url: https://<firma>.inscada.online:8083
allowed-hosts: '^(localhost|127\.0\.0\.1|<yerel-ip-kaçışlı>|10\.66\.66\.\d{1,3})$'
iframe:
allowed-hosts: >-
https://<firma>.inscada.online,
https://<firma>.inscada.online:8083,
https://<yerel-ip>:8082,
https://<yerel-ip>:8083,
https://localhost:8082,
https://localhost:8083,
https://127.0.0.1:8082,
https://127.0.0.1:8083,
<firma>.inscada.online,
<yerel-ip>,
localhost,
127.0.0.1

Köşeli parantezli değerler yer tutucudur. Regex içinde IP adresinin noktaları kaçırılır (192\.168\.1\.50).

Açılış günlüğünde şu iki satır görülür:

HostAllowlist: using explicit override regex from ins.allowed-hosts
HostAllowlist initialized. literalOrigins=[...], localPorts=[...], defaultsInEffect=false

defaultsInEffect=false, regex’inizin devreye girdiğini ve varsayılanların artık geçerli olmadığını söyler — 3. maddedeki uyarı tam olarak bu yüzdendir.

Ardından her erişim adresinde yanıtın Content-Security-Policy başlığına bakın: frame-src, o adresin :8083 origin’ini içermelidir.

Son olarak tarayıcıda bir Custom HTML sayfası ya da animasyon açın. Bu, sandbox kaynağını ve çerez akışını uçtan uca sınar.

Çerçeve açılmıyorsa önce DevTools’ta iframe’in src değerine bakın — hangi adresi denediğini görmek, hangi listenin eksik olduğunu söyler.

BelirtiAnlamı
Günlükte Missing or invalid origin for sandbox contentAdres HostAllowlist’te eksik — ins.allowed-hosts ya da duyurulan adresler
Konsolda frame-src / frame-ancestors CSP ihlaliAdres ins.iframe.allowed-hosts listesinde eksik
Çerçeve boş, hata yok8083’ün sertifikası kabul edilmemiş — adresi bir kez doğrudan açın
Günlükte Sandbox port used for illegal API callNormaldir. Sandbox portu /api çağrılarını reddeder
  1. Host’u ins.allowed-hosts regex’ine ekleyin.
  2. https://<host>:8082, https://<host>:8083 ve çıplak <host>’u ins.iframe.allowed-hosts listesine ekleyin.
  3. Servisi yeniden başlatın.