Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-20.S01

Server-side fetch, SSRF boundary ve egress policy

Server’ın dış request kararını belirli bir iş amacına bağla. URL biçimi, onaylı destination ve egress aynı kontrol değildir.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Onaylı catalog

  1. Client isteği hazır

    Client note-A public kaydı için isteğini hazırlar; server-owned profile GET /public-notes/note-A hedefini belirler. Mesaj henüz Fetch gate’e ulaşmadı; destination veya egress kararı verilmedi.

    Client
    İstek hazır
    Fetch gate
    Henüz değerlendirilmedi
    Public catalog
    Sabit public kayıt hazır
  2. Server request’i aldı

    Request server’a ulaşır. Kaynak izni ve güncel context bundan sonra ayrı değerlendirilir.

    Client
    İstek hazır
    Fetch gate
    İstek geldi; gate bekliyor
    Public catalog
    Sabit public kayıt hazır
  3. Destination kabul edildi

    Onaylı origin/path, destination ve egress girdileri kabul edilir. Public read hazırlanır.

    Client
    İstek hazır
    Fetch gate
    Origin/path uygun; destination/egress kabul; GET hazır
    Public catalog
    Sabit public kayıt hazır
  4. Catalog request’i aldı

    Catalog note-A okuma isteğini alır. Sabit public title response’u hazırlanır; gerçek network ölçümü yapılmaz.

    Client
    İstek hazır
    Fetch gate
    Origin/path uygun; destination/egress kabul; GET hazır
    Public catalog
    İstek geldi; public yanıt hazır
  5. Title server’a ulaştı

    Server public catalog title’ını alır. Public projection henüz hazırlanmamıştır.

    Client
    İstek hazır
    Fetch gate
    Public kayıt geldi; projection bekliyor
    Public catalog
    İstek geldi; public yanıt hazır
  6. Public projection hazır

    Server yalnız title alanını public yanıt için seçer. Server context’in diğer alanları response’a dahil edilmez.

    Client
    İstek hazır
    Fetch gate
    Title projection kabul; yanıt hazır
    Public catalog
    İstek geldi; public yanıt hazır
  7. Yanıt client’a ulaştı

    Client Tea & Bread public yanıtını alır. Response verisi client’a geçer; server’ın permission kararı aktarılmış bir yetki olmaz.

    Client
    Public body geldi: Tea & Bread
    Fetch gate
    Title projection kabul; yanıt hazır
    Public catalog
    İstek geldi; public yanıt hazır
  8. Client title’ı kullandı

    Client public title sonucunu yerel state’ine alır. Sonraki işlem için server’da yeni karar gerekir.

    Client
    Public title yerel kayda alındı
    Fetch gate
    Title projection kabul; yanıt hazır
    Public catalog
    İstek geldi; public yanıt hazır

Origin onaysız

  1. Client isteği hazır

    Client note-A public kaydı için isteğini hazırlar; server-owned profile GET /public-notes/note-A hedefini belirler. Mesaj henüz Fetch gate’e ulaşmadı; destination veya egress kararı verilmedi.

    Client
    İstek hazır
    Fetch gate
    Henüz değerlendirilmedi
    Public catalog
    Sabit public kayıt hazır
  2. Server request’i aldı

    Request server’a ulaşır. Kaynak izni ve güncel context bundan sonra ayrı değerlendirilir.

    Client
    İstek hazır
    Fetch gate
    İstek geldi; gate bekliyor
    Public catalog
    Sabit public kayıt hazır
  3. Origin onaysız

    Origin onaylı profile uymadığı için catalog’a dispatch yapılmaz; public title body oluşmaz.

    Client
    İstek hazır
    Fetch gate
    Origin onaysız; dispatch yok; ret hazır
    Public catalog
    Sabit public kayıt hazır
  4. Client ret sonucunu aldı

    Client ret kararını alır. Catalog dispatch, public title body ve write oluşmaz.

    Client
    Ret geldi; body/delivery/write yok
    Fetch gate
    Origin onaysız; dispatch yok; ret hazır
    Public catalog
    Sabit public kayıt hazır

Kanıt eksik

  1. Client isteği hazır

    Client note-A public kaydı için isteğini hazırlar; server-owned profile GET /public-notes/note-A hedefini belirler. Mesaj henüz Fetch gate’e ulaşmadı; destination veya egress kararı verilmedi.

    Client
    İstek hazır
    Fetch gate
    Henüz değerlendirilmedi
    Public catalog
    Sabit public kayıt hazır
  2. Server request’i aldı

    Request server’a ulaşır. Kaynak izni ve güncel context bundan sonra ayrı değerlendirilir.

    Client
    İstek hazır
    Fetch gate
    İstek geldi; gate bekliyor
    Public catalog
    Sabit public kayıt hazır
  3. Destination bilgisi eksik

    Destination için gerekli bilgi unknown kalır. Profile kabul edilmez, dispatch ve title body oluşmaz.

    Client
    İstek hazır
    Fetch gate
    Destination kanıtı unknown; dispatch yok; ret hazır
    Public catalog
    Sabit public kayıt hazır
  4. Client ret sonucunu aldı

    Client ret kararını alır. Catalog dispatch, public title body ve write oluşmaz.

    Client
    Ret geldi; body/delivery/write yok
    Fetch gate
    Destination kanıtı unknown; dispatch yok; ret hazır
    Public catalog
    Sabit public kayıt hazır

Egress ret

  1. Client isteği hazır

    Client note-A public kaydı için isteğini hazırlar; server-owned profile GET /public-notes/note-A hedefini belirler. Mesaj henüz Fetch gate’e ulaşmadı; destination veya egress kararı verilmedi.

    Client
    İstek hazır
    Fetch gate
    Henüz değerlendirilmedi
    Public catalog
    Sabit public kayıt hazır
  2. Server request’i aldı

    Request server’a ulaşır. Kaynak izni ve güncel context bundan sonra ayrı değerlendirilir.

    Client
    İstek hazır
    Fetch gate
    İstek geldi; gate bekliyor
    Public catalog
    Sabit public kayıt hazır
  3. Egress reddedildi

    Egress kararı bilinen rettir. Profile kabul edilmez, catalog’a dispatch ve title body oluşmaz.

    Client
    İstek hazır
    Fetch gate
    Egress known ret; dispatch yok; ret hazır
    Public catalog
    Sabit public kayıt hazır
  4. Client ret sonucunu aldı

    Client ret kararını alır. Catalog dispatch, public title body ve write oluşmaz.

    Client
    Ret geldi; body/delivery/write yok
    Fetch gate
    Egress known ret; dispatch yok; ret hazır
    Public catalog
    Sabit public kayıt hazır

ROLLER · STATE · VERİ AKIŞI

HTTP client kimin yetkisiyle çalışır?

Browser bir sayfanın JavaScript isteğini kendi origin ve credential kuralları içinde yürütür. Server-side fetch ise uygulama sürecinin network erişimiyle çalışır. Aynı fetch adı bu iki ortamın aynı security boundary olduğu anlamına gelmez. Public catalog örneğinde öğrenci note-A seçer; server bu iş kimliğini kendi kayıtlı catalog endpoint’iyle eşler. Client genel bir URL veya server’ın taşıyacağı credential seçmez.

SSRF boundary, dışarıdan gelen iş talebinin server’ın nereye ve hangi amaçla bağlantı kuracağına karar verdiği yerdir. Bir read isteğinin input schema’ya uyması destination permission vermez. Undici’nin browser CORS kontrollerini varsayılan olarak yapmaması özellikle bu ayrımı gösterir: response için ACAO olmaması server’a giden isteği durduran bir network politikası değildir. Uygulama permission ve egress kararını kendi tasarımında vermelidir.

URL, destination ve bağlantı tek karar zinciridir

Bu profile origin https://catalog.example.org, path /public-notes/note-A ve method GET server tarafından sabitlenir. URL parser protocol, hostname, port, pathname gibi bileşenleri ayırır; origin tek başına path iznini içermez. Aynı origin’deki /help geçerli bir URL olsa da bu işin endpoint’i değildir. Oluşturulan URL’nın tekrar parse edilmesi aynı onaylı bileşenleri üretmelidir; bileşenleri başka servise string olarak geçirirken parser tutarlılığı tasarımın parçasıdır.

Domain onayı, bağlantıda kullanılacak destination’ın onayıyla aynı kanıt değildir. Resolution sonucu, connection seçimi, retry ve fallback aynı destination politikası içinde kalmalıdır. Çizimde approved-set-A yalnız bir alias’tır; gerçek DNS lookup, IP sınıflandırması, certificate validation veya socket kurulumu yapılmaz. Destination kanıtı eksikse başarılı kabul edilmez. Otomatik redirect bu profile kapalıdır; ihtiyaç değişirse her yeni hop için hedef, method ve aktarılacak context yeniden değerlendirilir.

Egress ve yanıtın sınırı

Application allowlist hangi işin hangi service’e gitmesi gerektiğini ifade eder. Network egress kuralı sürecin izinli yollar dışına çıkmasını sınırlayan ayrı kontroldür. İkisini aynı boolean’a indirgemek ölçümün hangi katmanda yapıldığını gizler. Artifact’te destination ve egress için ayrı supplied evidence vardır; doğru URL ve onaylı destination, egress ret iken dispatch üretmez.

Normal branch yalnız public title alır; alınan response yeni identity veya instruction olarak yorumlanmaz. Yanıt boyutu, süre ve redirect sayısı da client’ın resource profiline dahildir. 256 byte ve 10 tick bu örneğin öğretim bütçesidir, evrensel limit değildir. Production tasarımı bu bütçeyi gerçek HTTP client yaşam döngüsünde uygular; burada test edilen şey sabit URL bileşenleri ve dispatch öncesindeki finite karar tablosudur.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Endpoint kapsamı

  1. Onaylı profile belirli

    Profile GET, catalog.example.org origin’i ve /public-notes/note-A path’ini birlikte tanımlar. İzin yalnız bir domain kelimesinden oluşmaz.

    URL / profile
    method=GET
    Destination / egress
    path=/public-notes/note-A
    Güven sınırı
    Server-owned profile
  2. Aynı origin, farklı path

    ComponentChecks içindeki /help aynı origin’dedir ama accepted=false. URL’nin parse edilmesi, seçilen endpoint contract’ına uyduğu anlamına gelmez.

    URL / profile
    origin=https://catalog.example.org
    Destination / egress
    path=/help / accepted=false
    Güven sınırı
    URL parsing != permission
  3. Onaylı path ayrı kabul edilir

    Exact configured profile olan /public-notes/note-A için accepted=true verilmiş. Bu kabul /help veya başka endpoint’e yayılmaz.

    URL / profile
    path=/public-notes/note-A
    Destination / egress
    component accepted=true
    Güven sınırı
    Kapsam tek profile
  4. Destination ve egress ayrı şartlar

    Normal row iki approval alanını da true taşır. Endpoint eşleşmesi bu alanların yerine geçmez; her karar kendi girdisine dayanır.

    URL / profile
    destinationApprovedDeclared=true
    Destination / egress
    egressApprovedDeclared=true
    Güven sınırı
    İki ayrı onay girdisi
  5. Dispatch bir öğretim sonucu

    Normal expectedDispatch=true ve expectedDelivery=true supplied model sonucudur. Profile.actualHTTP=false olduğundan gerçek request gönderildiği iddia edilmez.

    URL / profile
    expectedDispatch=true
    Destination / egress
    actualHTTP=false
    Güven sınırı
    Gerçek bağlantı gözlenmedi
  6. Okuma yazma authority’si vermez

    ExpectedWrite=false. Public catalog cevabını okumak local note’a yazma izni veya browser CORS üzerinden server egress izni üretmez.

    URL / profile
    expectedWrite=false
    Destination / egress
    browserCORSIsEgress=false
    Güven sınırı
    Authority sınırı korunur

Egress ret

  1. URL profile’a uyuyor

    Egress-denied row aynı configuredURL’yi kullanır. URL uyumu bu dalda değişmeyen koşuldur; sonuç için diğer alanlar da gerekir.

    URL / profile
    configuredURL=approved public path
    Destination / egress
    Approval alanları henüz incelenmedi
    Güven sınırı
    Profile eşleşmesi tek şart değil
  2. Destination onayı true

    DestinationApprovedDeclared=true supplied girdidir. Bu, egress policy’nin de geçirdiğini göstermez.

    URL / profile
    destinationApprovedDeclared=true
    Destination / egress
    Egress ayrıca incelenir
    Güven sınırı
    Destination != egress
  3. Egress onayı false

    EgressApprovedDeclared=false seçilen ret nedenidir. Approved destination ile network çıkış kararı bu kayıtta farklıdır.

    URL / profile
    destinationApprovedDeclared=true
    Destination / egress
    egressApprovedDeclared=false
    Güven sınırı
    Ret koşulu biliniyor
  4. Model dispatch üretmez

    ExpectedDispatch=false ve expectedDelivery=false. Destination true iken egress false olduğunda model teslim edilmiş body üretemez.

    URL / profile
    expectedDispatch=false
    Destination / egress
    expectedDelivery=false
    Güven sınırı
    Body yok
  5. Gerçek firewall sonucu sayma

    ActualFirewall=false. Ret, supplied predicate’in sonucudur; gerçek firewall veya network üzerinde enforcement gözlenmemiştir.

    URL / profile
    egressApprovedDeclared=false
    Destination / egress
    actualFirewall=false
    Güven sınırı
    Declared karar ile enforcement ayrı
  6. Failure boundary’yi doğru koru

    Bu dalın durduğu koşul egress approval’dır. Başka row’daki missing destination bilgisini veya body başarısını bu dala taşıma.

    URL / profile
    known egress rejection
    Destination / egress
    expectedBody=null
    Güven sınırı
    Aynı row’un kanıtı kullanılır

VARSAYIM · SINIR · KONTROL

Bozulan varsayım: input geçerli, hedef izinli

Red perspective burada bir hedefe deneme göndermek yerine karar için gerekli şartları sorgular. note-A schema’ya uyabilir; yine de endpoint config’in approved origin ve path ile eşleşmesi gerekir. Onaysız docs.example.org sıradan bir documentation origin’idir; public olması bu catalog işinin destination’ı yapmaz. Unknown-origin branch hiçbir catalog mesajı veya title body üretmez.

Bir input doğrulaması ancak kontrol ettiği bileşen hakkında kanıttır. URL parse edildi demek DNS sonucu değerlendirildi veya TLS peer doğrulandı demek değildir. Resolver ve client arasında kullanılan destination’ın tutarlılığına ilişkin kanıt yoksa bu eksiklik açık kaydedilir. Missing-evidence branch’in false’tan ayrı null taşıması, ret ile henüz bilinmeyen durumu karıştırmadan aynı no-dispatch sınırını korur.

Kontrolün kaybolduğu katmanı bulmak

İkinci soru önceki hop için verilen kararın yeni bir hop’a sessiz taşınıp taşınmadığıdır. Artifact redirect’i takip etmez; sıradan farklı documentation origin’i için yeni dispatch yoktur. Bu kayıt bir redirect uygulama testi değildir. Gerçek sistemde redirect gereksinimi varsa her hop’ın onaylı profile girdiği ve context aktarımının daraltıldığı ayrıca kanıtlanmalıdır.

Egress-denied branch’inde uygulamanın iş eşlemesi doğru olmasına rağmen egressApprovedDeclared=false girdisi bu yolun reddedildiğini bildirir. İsteği devam ettirmek kontrolün sonucunu yok sayar. İnceleme bulgusunun etkisi “her yere erişim vardır” diye büyütülmez; gözlenen ret gate’i, erişilebilir katman ve izinli veri ayrı yazılır. Ders bir URL corpus’u, destination keşfi veya üçüncü serviste vulnerability reproduction sunmaz.

3. Blue · Güvenli geliştirme ve savunma

Hareket olmadan bütün senaryoları oku

Onay bilinmiyor

  1. Configured URL aynı

    Missing-evidence row onaylı catalog URL’sini taşır. Config eşleşmesi destination kararının kaydedildiğini söylemez.

    Decision kaydı
    configuredURL=approved public path
    Connection / budget
    Destination bilgisi henüz incelenmedi
    Kanıt kapsamı
    Config ile karar ayrı
  2. Destination alanı null

    DestinationApprovedDeclared=null, true veya false değildir. Bu alan eksik olduğu için destination’ın izinli ya da reddedilmiş olduğu söylenemez.

    Decision kaydı
    destinationApprovedDeclared=null
    Connection / budget
    egressApprovedDeclared=true
    Kanıt kapsamı
    Destination sonucu UNKNOWN
  3. Egress true eksik alanı tamamlamaz

    EgressApprovedDeclared=true başka koşulun girdisidir. Bu olumlu değer destination alanına kopyalanamaz.

    Decision kaydı
    destinationApprovedDeclared=null
    Connection / budget
    egressApprovedDeclared=true
    Kanıt kapsamı
    Kararlar birbirini yerine koymaz
  4. Eksik kanıtta dispatch yok

    ExpectedDispatch=false ve expectedBody=null. Modelin durması, eksik destination kararının false olduğu kanıtı değildir.

    Decision kaydı
    expectedDispatch=false
    Connection / budget
    expectedBody=null
    Kanıt kapsamı
    Fail closed ile bilinen ret farklı
  5. UNKNOWN ayrı raporlanır

    Egress-denied row bilinen false taşır; bu row null taşır. İkisinde dispatch olmaması karar bilgisinin aynı olduğu anlamına gelmez.

    Decision kaydı
    destination=null / egress=true
    Connection / budget
    dispatch=false
    Kanıt kapsamı
    Eksik destination kanıtı
  6. Gereken alanı adıyla iste

    Bu row için gereken gözlem destination approval kaydıdır. Başka request’in başarı body’si veya browser CORS ayarı bu eksikliği kapatmaz.

    Decision kaydı
    destination evidence required
    Connection / budget
    browserCORSIsEgress=false
    Kanıt kapsamı
    Kanıt aynı request’e ait olmalı

Redirect ve kanıt

  1. Redirect ayrı hedefe gider

    RedirectLedger targetOrigin=docs.example.org taşır. Başlangıç catalog profile’ının onayı yeni origin’in onayı değildir.

    Decision kaydı
    targetOrigin=https://docs.example.org
    Connection / budget
    Yeni approval gerekir
    Kanıt kapsamı
    Başlangıç scope’u sınırlı
  2. Otomatik takip kapalı

    RedirectsFollowed=false ve nextDispatch=false. Bu model onaysız yeni hedefe otomatik geçiş yapmaz.

    Decision kaydı
    redirectsFollowed=false
    Connection / budget
    nextDispatch=false
    Kanıt kapsamı
    Redirect sonucu henüz fetch edilmedi
  3. Address set bir alias

    ConnectionEvidence approved-set-A adını kullanır. ActualAddressesIncluded=false olduğu için gerçek bağlantı adresleri bu artifact’te yoktur.

    Decision kaydı
    addressSet=approved-set-A (alias only)
    Connection / budget
    actualAddressesIncluded=false
    Kanıt kapsamı
    Alias gerçek adres ölçümü değil
  4. Declared eşitlik ölçüm değildir

    ValidatedSetEqualsConnectedSetDeclared=true supplied ilişkidir. ActualResolutionPerformed=false iken gerçek DNS sonucu veya bağlantı hedefi doğrulanmış sayılmaz.

    Decision kaydı
    validatedSetEqualsConnectedSetDeclared=true
    Connection / budget
    actualResolutionPerformed=false
    Kanıt kapsamı
    Domain onayı adres onayı değil
  5. Budget değerleri enforcement değil

    MaxResponseBytes=256, maxRedirects=0 ve deadlineTick=10 seçilmiş sınırlardır. ActualRuntimeBudgetEnforced=false olduğundan gerçek runtime’ın bunları uyguladığı bilinmez.

    Decision kaydı
    maxResponseBytes=256 / maxRedirects=0
    Connection / budget
    actualRuntimeBudgetEnforced=false
    Kanıt kapsamı
    Configured budget ile ölçüm ayrı
  6. Kontrol ile gözlemi ayrı raporla

    Rapor yeni hedef için dispatch yapılmadığını, address ilişkisinin declared kaldığını ve budget enforcement’ın ölçülmediğini söyler. Bunlar gerçek DNS, TLS veya firewall testinin sonucu değildir.

    Decision kaydı
    nextDispatch=false
    Connection / budget
    actualDNS=false / actualTLS=false
    Kanıt kapsamı
    Supplied karar kaydı

UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA

Endpoint’i iş kimliğinden oluşturmak

Blue tasarımı client’a yalnız note-A gibi dar bir identifier verir. Server-owned registry bu identifier’ı scheme, origin, path ve method’u sabit bir profile bağlar. Bu profile gelen endpoint config’i bilinen URL parser ile ayrıştırılır ve onaylı bileşenlerle karşılaştırılır. Public title okumasında credential forwarding gerekmez; genel header setini başka service’e kopyalamak bu örneğin contract’ında yoktur.

Destination onayı ile egress onayının sahibi ve ölçüldüğü an ayrı tanımlanır. Retry veya fallback ilk kararın dışında yeni address seçmemelidir. HTTP client redirect ayarı profile kapalıdır; yeni ihtiyaç onay sürecinde açık değişiklik ister. Bütçe için byte, deadline ve hop sayısı birbirini tamamlar; tek timeout diğer sınırları kanıtlamaz. Gerçek client seçimi, resolver kullanımı ve connection kurulumu implementation review ister.

Negatif kanıtı dispatch sayacıyla sınamak

Regression tablosunda doğru config kabul edilir; onaysız origin, eksik destination evidence ve egress ret aynı şekilde catalog dispatch sayısını sıfır bırakır. Reddedilen okumada title body yoktur ve store üzerinde write yapılmaz. Geçerli URL ile geçersiz path için ayrı ordinary /help satırı da endpoint sınırının origin’den daha dar olduğunu gösterir. Pozitif branch sabit title projection’ı üretir.

Native gözlem yalnız Node URL parser’ın bu sabit URL’larda ürettiği bileşenler ve finite permission predicate’idir. Animasyon ise supplied mesaj sırasını shared pure reducer üzerinden oynatır. Bu iki kanıt gerçek DNS, TLS, network firewall veya browser CORS uygulanmış gibi raporlanmaz. İnceleme kaydı başarısız kontrolü, bilinmeyen destination kanıtını ve client’a verilmeyen body’yi ayrı saklar; URL veya response log’unun sır taşıması gerekmez.

ŞİMDİ VAKAYA UYGULA

URL parse sonucu, destination onayı ve egress onayı nasıl ayrılır?

Atlas yalnız server-owned catalog profile’ındaki public note-A kaydını okumayı modeller. Öğrenci yeni bir hedefe bağlantı kurmaz; supplied karar kayıtlarında hangi koşulun eksik olduğunu inceler.

Vakadaki response’a hangi component’ler katkıda bulunuyor? UI, service, platform ve dış provider sonuçlarının hangi hop’ta tamamlandığını ayrı göster.

Bağlı vaka dosyasını aç ↗

ÖRNEĞİ BİRLİKTE OKUYALIM

Onaylı catalog fetch kararı

Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.

Ham kaydı ve alan açıklamalarını oku
{
  "profile": {
    "origin": "https://catalog.example.org",
    "path": "/public-notes/note-A",
    "method": "GET",
    "title": "Tea & Bread",
    "inputCatalogId": "note-A",
    "actualDNS": false,
    "actualTLS": false,
    "actualHTTP": false,
    "actualFirewall": false
  },
  "rows": [
    {
      "case": "normal",
      "label": [
        "Onaylı catalog",
        "Approved catalog"
      ],
      "configuredURL": "https://catalog.example.org/public-notes/note-A",
      "destinationApprovedDeclared": true,
      "egressApprovedDeclared": true,
      "expectedDispatch": true,
      "expectedDelivery": true,
      "expectedWrite": false,
      "expectedBody": {
        "title": "Tea & Bread"
      }
    },
    {
      "case": "unknown-origin",
      "label": [
        "Origin onaysız",
        "Unapproved origin"
      ],
      "configuredURL": "https://docs.example.org/public-notes/note-A",
      "destinationApprovedDeclared": true,
      "egressApprovedDeclared": true,
      "expectedDispatch": false,
      "expectedDelivery": false,
      "expectedWrite": false,
      "expectedBody": null
    },
    {
      "case": "missing-evidence",
      "label": [
        "Kanıt eksik",
        "Evidence missing"
      ],
      "configuredURL": "https://catalog.example.org/public-notes/note-A",
      "destinationApprovedDeclared": null,
      "egressApprovedDeclared": true,
      "expectedDispatch": false,
      "expectedDelivery": false,
      "expectedWrite": false,
      "expectedBody": null
    },
    {
      "case": "egress-denied",
      "label": [
        "Egress ret",
        "Egress denied"
      ],
      "configuredURL": "https://catalog.example.org/public-notes/note-A",
      "destinationApprovedDeclared": true,
      "egressApprovedDeclared": false,
      "expectedDispatch": false,
      "expectedDelivery": false,
      "expectedWrite": false,
      "expectedBody": null
    }
  ],
  "componentChecks": [
    {
      "url": "https://catalog.example.org/help",
      "accepted": false,
      "reason": "Unapproved path"
    },
    {
      "url": "https://catalog.example.org/public-notes/note-A",
      "accepted": true,
      "reason": "Exact configured profile"
    }
  ],
  "redirectLedger": [
    {
      "redirectsFollowed": false,
      "targetOrigin": "https://docs.example.org",
      "nextDispatch": false,
      "reason": "Automatic following disabled; a new destination needs independent approval"
    }
  ],
  "connectionEvidence": {
    "addressSet": "approved-set-A (alias only)",
    "validatedSetEqualsConnectedSetDeclared": true,
    "actualAddressesIncluded": false,
    "actualResolutionPerformed": false
  },
  "budget": {
    "maxResponseBytes": 256,
    "maxRedirects": 0,
    "deadlineTick": 10,
    "actualRuntimeBudgetEnforced": false
  },
  "boundaries": {
    "browserCORSIsEgress": false,
    "domainApprovalIsAddressApproval": false,
    "URLParsingIsPermission": false
  }
}
profile
Server’ın seçtiği origin, path ve method’u tanımlar. Bu örnekte gerçek DNS, TLS, HTTP veya firewall çalıştırılmaz.
rows
Config eşleşmesi, destination onayı ve egress onayı ayrı koşullardır. Dispatch, body ve write sonuçları birlikte okunur.
componentChecks
Aynı origin’deki /help, onaylı public note endpoint’i değildir. Domain eşleşmesi tek başına endpoint izni vermez.
redirectLedger
Otomatik redirect takibi kapalıdır; başka origin için yeni destination kararı gerekir.
connectionEvidence
Validated ve connected address set ilişkisi yalnız bir alias olarak verilmiştir. Gerçek DNS sonucu ölçülmemiştir.
budget
Byte, deadline ve redirect sınırlarını ayrı gösterir. Config değerleri gerçek runtime enforcement kanıtı değildir.
boundaries
Browser CORS, domain onayı ve URL parsing, server-side destination permission’ın yerine geçmez.

Sabit public URL config ve supplied destination/egress evidence; gerçek DNS/TLS/HTTP/firewall yok.

İki yanlış kanı

Browser CORS server fetch’i korur.

Server client aynı browser gate’ini devralmaz; destination ve egress kararı ayrıca gerekir.

Origin onayı bütün bağlantıyı doğrular.

Path, address seçimi, retry/redirect ve network yolu ayrı sınır ve kanıt ister.

SIRA SENDE

Bu hikâyeyi sen çöz.

Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.

Configured origin doğru, fakat destinationApprovedDeclared=null. Public catalog GET’i dispatch edilir mi?

  1. Evet. Geçerli HTTPS URL bütün egress policy’lerini geçer.
  2. Hayır. Dispatch ve body delivery yok.
Gerekçeli cevabı oku

Hayır. Dispatch ve body delivery yok. — Missing-evidence branch’i expectedDispatch=false verir. Egress true olsa da eksik destination kanıtı tamamlanmış sayılmaz.

Aynı onaylı origin üzerindeki /help neden kabul edilmiyor?

Dersten seçilen artifact alanları; öğretim örneği

componentChecks
[{"url":"https://catalog.example.org/help","accepted":false,"reason":"Unapproved path"},{"url":"https://catalog.example.org/public-notes/note-A","accepted":true,"reason":"Exact configured profile"}]
profile.path
/public-notes/note-A
budget.maxRedirects
0
  1. Path farklı; yalnız configured public-note path’i kabul edilir.
  2. Aynı origin’deki bütün URL’ler otomatik equivalent destination’dır.
Gerekçeli cevabı oku

Path farklı; yalnız configured public-note path’i kabul edilir. — Component check /help için Unapproved path verir. Origin eşleşmesi bütün path’leri veya redirect target’larını onaylamaz.

Domain policy, connected address set ve response budget neden ayrı kanıtlar? Browser CORS bu server fetch’i korur mu?

Gerekçeli cevabı oku

URL policy onaylanan method/origin/path’i seçer. Domain onayı tek başına resolution ve gerçekten bağlanılan address set’inin doğrulandığını göstermez. Bu artifact yalnız approved-set alias’ı ve verilmiş eşitlik koşulu taşır; gerçek DNS/TLS/HTTP/firewall çalıştırmaz. Byte, redirect ve deadline bütçeleri de gerçek enforcement kanıtı değildir. Browser CORS script exposure içindir; server-side egress kontrolünün yerine geçmez.

□ Domain onayını address veya connection kanıtı saymadım.

□ CORS ve budget declaration’ını gerçek server egress enforcement saymadım.

Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç

Kaynaklar ve kapsam

  • OWASP SSRF PreventionCase 1 / Available protections / Application layer: redirect handling; Domain name: connection-time destination enforcement; URL: rebuild approved components · Case 1 / Network layer: legitimate flows and restricted routes
  • Node v24.13.0 URL APIURL strings and URL objects; new URL(input[, base]); url.origin; url.pathname
  • Undici specification complianceSpecification Compliance / CORS: no browser CORS checks by default