İkinci-Origin Fizibilite Raporu (ARTF-021 / F5)

İkinci-Origin Fizibilite Raporu (ARTF-021 / F5)

Tarih: 2026-09-28 · Durum: rapor — operatör kararı bekliyor Bağlı: PLAN-ARTF-002 F5 · raw/web-claude-artifacts-2026.md

Neden konu açıldı

Claude Artifacts'ın en güçlü izolasyonu iki-origin: artifact'lar ayrı host'ta (kullanıcı-yüzü claude.ai'dan ayrı) sunulur; artifact JS'i kötü niyetli olsa bile ana oturum/cookie/token'a erişemez. Bizde tek-origin (artifacts.gonet.com.tr) + hart'ın default-src 'none'+script-src 'unsafe-inline' CSP iskeleti + review iframe'i var.

Ölçülmüş bulgular (2026-09-28, canlı sistem)

  1. iframe sandbox'suz: <iframe id="fr" src="/a/..."> — sandbox attribute yok. Artifact ile parent same-origin olduğundan artifact JS'i parent.document'a tam erişir: review sayfasının DOM'unu okur/ değiştirir, parent bağlamından /review/arti/api/* uçlarını declare gate'i baypas ederek doğrudan çağırır.
  2. Cross-artifact store erişimi: server o/n'yi path'ten alır — /review/arti/api/store/d1/BASKA ucu herkesin herkese açık (link-sahipliği modeli; yorumlar da öyle). "Kişisel" veri için bu yetersiz; shared state için kabul edilebilir.
  3. Gerçek sınır şu an: server-side rate limit + kota + artifact_var (doğru tasarım — client kapısı zaten baypas edilebilir kabul edilmeliydi; öyleydi).
  4. DNS: *.gonet.com.tr wildcard yok (foo-xyz-123 sorgusu boş). NS Cloudflare (titan/evelyn) → wildcard cert DNS-01 + CF API token ister.
  5. Traefik: Coolify label'ları path-bazlı — hart Host(artifacts.gonet.com.tr) && PathPrefix(/), review PathPrefix(/review|/asistan). Yeni Host kuralı = compose'a bir label bloğu (Coolify domains alanına domain eklemek de yeter).
  6. Cert: tek subdomain (a.gonet.com.tr) için HTTP-01 yeterli — wildcard cert şart DEĞİL.

Tehdit modeli

Kim Ne yapabilir bugün Sonuç
Kötü artifact JS parent DOM oku/yaz, arti API'lerini o/n kısıtsız çağır yorumları taklit/deforme, başka store'ları oku/yaz; LLM kota tüketimi (rate+token frenli)
Bizde oturum yok cookie/token ÇALAMAZ — çünkü yok hesapsız model bu yüzden riski düşürür
hart CSP 'none' dış ağ yok (connect-src none) veri sızıntısı postMessage dışında yok — postMessage'ı da yalnız parent dinler

Risk seviyesi: orta — bizde çalınacak oturum yok ama artifact'lar arası "güven sınırı" fiilen yok.

Seçenekler

Seçenek Ne yapılır Maliyet Kazanç Kayıp
A (öneri) a.gonet.com.tr artifact /a/ trafiği ikinci host'a; review/asistan ana host'ta kalır DNS A kaydı (Cloudflare'da 1dk) + compose'a ikinci domain + arti protokol revizyonu artifact JS parent'a artık same-origin DEĞİL — DOM erişimi imkânsız; declare gate gerçek sınıra döner; CSP postMessage'la köprü korunur arti protokolü v2 gerekir (alt.)
B wildcard *.gonet.com.tr her artifact kendi subdomain DNS-01 + CF API token + hostname→artifact map katmanı (hart path-bazlı — ek middleware) en güçlü izolasyon (Claude modeline en yakın) en pahalı: DNS API entegrasyonu + map katmanı + her yeni alt-alanın servis tarafında çözülmesi
C sandbox iframe (ara adım) <iframe sandbox="allow-scripts"> 1 satır parent DOM erişimi kesilir hemen e.origin='null' + contentDocument kapanır → declare-meta okunamaz (aynı protokol fix'i yine şart); /a/ doğrudan açılırsa sandbox'suz kalır

Öneri

Kademeli: önce C, sonra A. C ucuz ve bugünkü en keskin açığı (parent DOM erişimi) hemen kapatır; A kalıcı hedef — Claude'un mimarisine denk düşer ve hediyesi: arti köprüsünün "iframe içi same-origin DOM okuma" bağımlılığı zaten kırılganlık kaynağı, ikisi aynı protokol fix'ini ister.

Protokol v2 (A veya C'de ortak): declare-meta okuması yerine shim ilk mesajı kendisi ilan eder — arti.hello {caps:[...]} (aktif ilan). Parent e.source===FR.contentWindow kontrolü yeterli (origin cross- origin'de sabit değer değil). Caps listesi doğrulanamaz kaynaktan gelir ama zaten doğrulanamazdı (meta'yı da artifact yazar) — gate'in işlevi "kazara aşma" değil "kasıtlı aşma"yı sınırlamak değilse anlamlıdır; asıl sınır server-side'da kalır.

Geçiş planı (A seçilirse)

  1. Cloudflare'da a.gonet.com.tr A kaydı → cx53 IP (5 dk).
  2. Coolify service'e domain ekle: a.gonet.com.tr → hart'a Host(a.gonet.com.tr) && PathPrefix(/a|/_hart) kuralı; ana host'taki /a/ kuralı 301'e döner ya da paralel kalır (geçiş süresince paralel önerilir).
  3. arti protokolü v2: shim arti.hello gönderir; parent caps'i mesajdan alır (meta okuması kaldırılır — hem A hem C'ye hazır).
  4. Review iframe src https://a.gonet.com.tr/a/... olur; postMessage targetOrigin https://a.gonet.com.tr.
  5. Smoke: artifact store/complete/download köprüsü cross-origin'de.

Karar bekleyen

Operatöre: A / B / C / yok (status quo kabul) — öneri A.