Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-16.05

Static files, filesystem ve request processing

Bir URL public asset map’ine eşlenir; filesystem ise ayrı bir namespace ve I/O owner’dır. GET, HEAD ve iki farklı missing branch’ini izle.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

GET asset

  1. Asset seç

    Client, public asset için GET /assets/tea.txt?view=plain request’ini hazırladı. HTTP server bu request’i henüz almadı; map seçimi ve filesystem okuması başlamadı.

    Duru / Client
    GET /assets/tea.txt?view=plain hazır
    HTTP server
    No request
    Public map
    No selection
    Filesystem API
    No I/O
  2. Request ulaştı

    HTTP server method ve target’ı aldı; public map’i henüz seçmedi ve filesystem read başlatmadı.

    Duru / Client
    Waiting response
    HTTP server
    GET /assets/tea.txt?view=plain received
    Public map
    No selection
    Filesystem API
    No I/O
  3. Map seçimi

    Exact whitelist logical pathname’i seçer; query bu fixture’in map key’ine eklenmez ve local işlem packet değildir.

    Duru / Client
    Waiting response
    HTTP server
    GET /assets/tea.txt?view=plain received
    Public map
    Selected tea.txt
    Filesystem API
    No I/O
  4. File I/O sonucu

    Seçilen tea.txt için yerel fs.readFile tamamlandı: Çay, UTF-8 c3876179 ile dört octet’tir. HEAD dalında da okuma bu küçük örneğin tercihidir; HTTP bütün HEAD işlemlerinde aynı I/O’yu şart koşmaz.

    Duru / Client
    Waiting response
    HTTP server
    GET /assets/tea.txt?view=plain received
    Public map
    Selected tea.txt
    Filesystem API
    4 UTF-8 octets read
  5. Response policy

    Server GET için 200, text/plain; charset=utf-8 ve dört octet body hazırladı. Content-Length byte sayısını gösterir; hazır body henüz client’ta değildir.

    Duru / Client
    Waiting response
    HTTP server
    200; 4 octets ready
    Public map
    Selected tea.txt
    Filesystem API
    4 UTF-8 octets read
  6. Response ulaştı

    Client şimdi 200 ve Çay body’sinin dört UTF-8 octet’ini aldı. Header/body receipt browser parsing, DOM veya pixel sonucu değildir.

    Duru / Client
    200; Çay; 4 octets
    HTTP server
    200; 4 octets ready
    Public map
    Selected tea.txt
    Filesystem API
    4 UTF-8 octets read

HEAD metadata

  1. Asset seç

    Client, public asset için HEAD /assets/tea.txt request’ini hazırladı. HTTP server bu request’i henüz almadı; map seçimi ve filesystem okuması başlamadı.

    Duru / Client
    HEAD /assets/tea.txt hazır
    HTTP server
    No request
    Public map
    No selection
    Filesystem API
    No I/O
  2. Request ulaştı

    HTTP server method ve target’ı aldı; public map’i henüz seçmedi ve filesystem read başlatmadı.

    Duru / Client
    Waiting response
    HTTP server
    HEAD /assets/tea.txt received
    Public map
    No selection
    Filesystem API
    No I/O
  3. Map seçimi

    Exact whitelist logical pathname’i seçer; query bu fixture’in map key’ine eklenmez ve local işlem packet değildir.

    Duru / Client
    Waiting response
    HTTP server
    HEAD /assets/tea.txt received
    Public map
    Selected tea.txt
    Filesystem API
    No I/O
  4. File I/O sonucu

    Seçilen tea.txt için yerel fs.readFile tamamlandı: Çay, UTF-8 c3876179 ile dört octet’tir. HEAD dalında da okuma bu küçük örneğin tercihidir; HTTP bütün HEAD işlemlerinde aynı I/O’yu şart koşmaz.

    Duru / Client
    Waiting response
    HTTP server
    HEAD /assets/tea.txt received
    Public map
    Selected tea.txt
    Filesystem API
    4 UTF-8 octets read
  5. Response policy

    Server HEAD için 200 ve Content-Length: 4 hazırladı, fakat content body göndermez. Uzunluk karşılık gelen GET representation’ına aittir; client metadata’yı henüz almadı.

    Duru / Client
    Waiting response
    HTTP server
    200; CL 4; no body
    Public map
    Selected tea.txt
    Filesystem API
    4 UTF-8 octets read
  6. Response ulaştı

    Client HEAD için 200, Content-Length: 4 ve sıfır content octet aldı. Boş HEAD content’i, tea.txt dosyasının boş olduğunu göstermez.

    Duru / Client
    200; 0 content octets
    HTTP server
    200; CL 4; no body
    Public map
    Selected tea.txt
    Filesystem API
    4 UTF-8 octets read

No mapping

  1. Asset seç

    Client, public asset için GET /assets/missing.txt request’ini hazırladı. HTTP server bu request’i henüz almadı; map seçimi ve filesystem okuması başlamadı.

    Duru / Client
    GET /assets/missing.txt hazır
    HTTP server
    No request
    Public map
    No selection
    Filesystem API
    No I/O
  2. Request ulaştı

    HTTP server method ve target’ı aldı; public map’i henüz seçmedi ve filesystem read başlatmadı.

    Duru / Client
    Waiting response
    HTTP server
    GET /assets/missing.txt received
    Public map
    No selection
    Filesystem API
    No I/O
  3. Map seçimi

    /assets/missing.txt için exact whitelist entry yoktur. Map kararı burada durur; readAttempts=0 kalır. Bu yerel kontrol fiziksel dosyanın varlığını incelemez.

    Duru / Client
    Waiting response
    HTTP server
    GET /assets/missing.txt received
    Public map
    No mapping
    Filesystem API
    No I/O
  4. Response policy

    Server, map bulunmaması sonucunu bu public policy’de 404 response’una eşler. Filesystem çağrısı yapılmadı; hazır response client’a henüz ulaşmadı.

    Duru / Client
    Waiting response
    HTTP server
    404 ready
    Public map
    No mapping
    Filesystem API
    No I/O
  5. Response ulaştı

    Client 404 response’unu şimdi aldı. Bu status tek başına map entry bulunmaması ile mapped file okumasının ENOENT vermesini ayıramaz; iç neden için map/I/O kaydı gerekir.

    Duru / Client
    404 received
    HTTP server
    404 ready
    Public map
    No mapping
    Filesystem API
    No I/O

Missing file

  1. Asset seç

    Client, public asset için GET /assets/gone.txt request’ini hazırladı. HTTP server bu request’i henüz almadı; map seçimi ve filesystem okuması başlamadı.

    Duru / Client
    GET /assets/gone.txt hazır
    HTTP server
    No request
    Public map
    No selection
    Filesystem API
    No I/O
  2. Request ulaştı

    HTTP server method ve target’ı aldı; public map’i henüz seçmedi ve filesystem read başlatmadı.

    Duru / Client
    Waiting response
    HTTP server
    GET /assets/gone.txt received
    Public map
    No selection
    Filesystem API
    No I/O
  3. Map seçimi

    Exact whitelist logical pathname’i seçer; query bu fixture’in map key’ine eklenmez ve local işlem packet değildir.

    Duru / Client
    Waiting response
    HTTP server
    GET /assets/gone.txt received
    Public map
    Selected gone.txt
    Filesystem API
    No I/O
  4. File I/O sonucu

    Map’in seçtiği fixtureRoot/gone.txt için yerel fs.readFile çağrısı ENOENT ile tamamlandı. Read denendi ama asset byte’ları elde edilmedi; client sonucu henüz bilmiyor.

    Duru / Client
    Waiting response
    HTTP server
    GET /assets/gone.txt received
    Public map
    Selected gone.txt
    Filesystem API
    ENOENT; own absent file
  5. Response policy

    Server bu örneğin ENOENT sonucunu 404’e eşler. Map entry vardır; başarısız olan backing-file okumasıdır. Bu seçim her filesystem error’unun 404 olması gerektiğini söylemez.

    Duru / Client
    Waiting response
    HTTP server
    404 ready
    Public map
    Selected gone.txt
    Filesystem API
    ENOENT; own absent file
  6. Response ulaştı

    Client 404 response’unu şimdi aldı. Bu status tek başına map entry bulunmaması ile mapped file okumasının ENOENT vermesini ayıramaz; iç neden için map/I/O kaydı gerekir.

    Duru / Client
    404 received
    HTTP server
    404 ready
    Public map
    Selected gone.txt
    Filesystem API
    ENOENT; own absent file

ROLLER · STATE · VERİ AKIŞI

URL path’i filesystem path’i değildir

Static file serving, seçilmiş bir public mapping’den uygun dosya bytes’ını HTTP representation olarak döndürmektir. /assets/tea.txt URL path’i örnekte fixtureRoot/tea.txt dosyasına eşlenir; /assets directory’sinin filesystem’de bulunması gerekmez. Express static mount örneği bu virtual prefix ayrımını gösterir. Dosyanın fiziksel dirname’i URL’de görünmeyebilir. Uygulama process’inin bütün filesystem’i public web alanı sayılmaz.

Bizim mapping exact whitelist’tir: tea.txt ve intentionally absent gone.txt için iki önceden seçilmiş entry vardır. Client text’i filesystem path’ine eklenmez; route key’i sabit map’ten karşılığı seçer. /assets/missing.txt map’te yoktur ve file read yapılmadan 404 olur. /assets/gone.txt map’te vardır ama backing file bulunamadığı için aynı dış status seçilir. İlkinde namespace seçimi, ikincisinde I/O availability başarısızdır; dış 404 bu iç farkı tek başına söylemez.

Filesystem file path, process’in bulunduğu host/container namespace’ine aittir. Relative root process’in launch directory’sine bağlı olabilir; server’ın beklediği public root açık ve kararlı seçilmelidir. Root map, filesystem read izinleri ve HTTP public policy ayrı konulardır. OS’nin file’ı okuyabilmesi onun client’e sunulması gerektiği anlamına gelmez. Bu örnek yalnız kendisi için oluşturulmuş küçük synthetic files’ı kullanır; directory listing veya gerçek kullanıcı dosyası yoktur.

Request processing bytes ve metadata üretir

Akış HTTP method/target’ı almak, URL pathname’i seçmek, public map’i çözmek, gerekli file I/O’yu yapmak ve response policy uygulamaktır. Query view=plain bu örneğin map key’ine dahil değildir; pathname /assets/tea.txt olarak kalır. Gerçek uygulama query’yi başka bir contract’ta kullanabilir. Repository function’ı gibi filesystem read de burada aynı process API’sidir; local read’e sahnede HTTP packet çizilmez.

Node fs.readFile callback’i err veya data verir; encoding seçilmezse data Buffer’dır. Bu tiny file Çay UTF-8 ile C3 87 61 79, yani 4 octet’tir. String’in görünen üç harfi Content-Length değildir. Media type text/plain; charset=utf-8 map metadata’sında seçilir. Filename extension bu policy’nin girdisi olabilir ama bytes’ın doğru formatta olduğunu veya public erişim kararını tek başına kanıtlamaz.

GET /assets/tea.txt dört content octet’i döndürür. HEAD aynı selected representation’ın metadata’sını taşıyabilir; Content-Length: 4 verildiğinde bile response content’i göndermez ve client body’si 0 octet’tir. Burada HEAD file’ı okuyup length hesaplar; bütün static server’ların aynı I/O stratejisini izlediği söylenmez. File callback success, response hazırlanması ve client response arrival farklı aşamalardır. File sonradan değişirse bu tiny fixture’in read snapshot’ı başka zamanın state garantisi değildir.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Map yok

  1. Public asset target seçildi

    Target /assets/missing.txt finite artifact case’idir. Public URL, physical directory veya arbitrary client text’ten üretilen file path değildir.

    Public asset target
    /assets/missing.txt
    Map/I/O gate
    Mapping incelenmedi
    Response boundary
    Read sonucu yok
  2. Exact map boundary’si okundu

    missing.txt için whitelist entry yoktur. clientTextConcatenatedToFilePath=false olduğu için target path bir filesystem adayına serbestçe eklenmez.

    Public asset target
    /assets/missing.txt
    Map/I/O gate
    Mapped=false
    Response boundary
    Read sonucu yok
  3. I/O dispatch boundary’si ayrıldı

    Map bulunmadığında readAttempts=0 kalır. Route body üretmeden önce I/O’ya geçilmemesi, bu public mapping boundary’sini korur.

    Public asset target
    /assets/missing.txt
    Map/I/O gate
    Read attempts=0
    Response boundary
    I/O yapılmadı
  4. Failure owner’ı doğru kaldı

    Failure mapping boundary’sindedir; filesystem’e ulaşılmamıştır. Map yokluğu disk file’ın fiziksel olarak var veya yok olduğunu söylemez.

    Public asset target
    /assets/missing.txt
    Map/I/O gate
    Known: no mapped asset
    Response boundary
    File existence not examined
  5. Public error response sınırlandı

    Status=404 seçili mapping policy’sidir. İç root/path ayrıntıları veya bütün OS topology dış response’a aktarılmış sayılmaz; diğer 404 branch’i farklı cause taşır.

    Public asset target
    /assets/missing.txt
    Map/I/O gate
    Declared status=404
    Response boundary
    No inferred topology disclosure
  6. Map ve file authority eşitlenmedi

    Bu case unmapped-before-read sınırını gösterir. Private asset permission veya deployment root hardening bu public whitelist sonucundan türetilmez.

    Public asset target
    /assets/missing.txt
    Map/I/O gate
    Known: mapping/I/O distinction
    Response boundary
    No general filesystem authority claim

File missing

  1. Public asset target seçildi

    Target /assets/gone.txt finite artifact case’idir. Public URL, physical directory veya arbitrary client text’ten üretilen file path değildir.

    Public asset target
    /assets/gone.txt
    Map/I/O gate
    Mapping incelenmedi
    Response boundary
    Read sonucu yok
  2. Exact map boundary’si okundu

    gone.txt için fixed map entry vardır; fixtureRoot/gone.txt backing asset’i seçilir. Mapping, fiziksel file’ın bulunduğunu henüz kanıtlamaz.

    Public asset target
    /assets/gone.txt
    Map/I/O gate
    Mapped=true
    Response boundary
    Read sonucu yok
  3. I/O dispatch boundary’si ayrıldı

    Mapped asset için readAttempts=1 olur. Bu seçili okuma known absent fixture file’a aittir; directory enumeration veya arbitrary filesystem erişimi değildir.

    Public asset target
    /assets/gone.txt
    Map/I/O gate
    Read attempts=1
    Response boundary
    I/O sonucu bekleniyor
  4. Failure owner’ı doğru kaldı

    ENOENT in own absent fixture file sonucu backing file boundary’sidir. Bu case her filesystem error için aynı HTTP mapping’i önermemektedir.

    Public asset target
    /assets/gone.txt
    Map/I/O gate
    Known: backing file unavailable
    Response boundary
    No asset bytes available
  5. Public error response sınırlandı

    Status=404 seçili mapping policy’sidir. İç root/path ayrıntıları veya bütün OS topology dış response’a aktarılmış sayılmaz; diğer 404 branch’i farklı cause taşır.

    Public asset target
    /assets/gone.txt
    Map/I/O gate
    Declared status=404
    Response boundary
    No inferred topology disclosure
  6. Map ve file authority eşitlenmedi

    Bu case mapped-but-unavailable asset’i gösterir; map entry’yi silmiş veya file’ı public başarıyla vermiş sayılmaz.

    Public asset target
    /assets/gone.txt
    Map/I/O gate
    Known: mapping/I/O distinction
    Response boundary
    No general filesystem authority claim

VARSAYIM · SINIR · KONTROL

Public map sınırını fiziksel dosyadan ayır

Benign incelemede önce documented public asset ile server’ın map entry’sini eşleştir. tea.txt’nin varlığı tek başına public exposure kararı değildir; controlled route’un map entry’si ve seçilmiş response birlikte gerekir. Birden çok static root kullanan tasarımlarda lookup order aynı URL için hangi asset’in seçildiğini etkileyebilir. Bu ders fixed map kullanır; arbitrary path veya directory enumerasyonu yapmaz.

missing.txt için readAttempts=0 beklenir; gone.txt için readAttempts=1 ve file unavailable beklenir. İkisi de 404 olabilir. Internal file error’ın dış response’a doğrudan bütün path ayrıntısını taşınması gerekmez; hata mapping policy’si ayrıca seçilmelidir. Olası yanlışlık public root’un beklenmedik konuma bağlanması veya açıklanan asset’in farklı bytes vermesidir. Kontrol, açık mapping ve request-specific read/result ilişkisidir; response status’tan filesystem topolojisi çıkarma değildir.

HEAD ve content metadata’nın kapsamı

HEAD’de body boş olduğu için dosya boş sonucu çıkarılmaz. Content-Length: 4 seçilmiş GET representation’ın length bilgisidir; HEAD’in taşınan content uzunluğu 0’dır. GET’de Çay alınması da bütün request processing zincirinin güvenlik kontrolünü kanıtlamaz. Bu gözlem yalnız whitelist entry, bytes ve selected response contract’ının ilişkisini gösterir.

text/plain metadata’sının filename’den seçilmesi ile file bytes’ın gerçekten UTF-8 olması farklı kanıtlardır. Bu örnekte iki bilgi de önceden authored public fixture’e bağlıdır. Gerçek deployment’ta content management, compression ve cache varyantları length/representation’ı değiştirebilir; burada bunlar çalıştırılmaz. Kritik boundary, client arrival olmadan received state yazmamak ve filesystem callback’i tamamlandı diye remote delivery’yi varsaymamaktır.

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

Hareket olmadan bütün senaryoları oku

GET bytes

  1. Selected representation record seçildi

    Bu branch GET artifact row’unu inceler. /assets/tea.txt public whitelist’e bağlıdır; harmless view query’si pathname’den ayrı kalır.

    Asset observation
    GET
    Mapping/byte review
    Representation incelenmedi
    Evidence conclusion
    Delivery fields okunmadı
  2. Map ve content source ilişkilendirildi

    Normal row mapped=true ve readAttempts=1 taşır. Exact entry, fileContentHex ve response fields aynı selected asset’e bağlanır.

    Asset observation
    GET
    Mapping/byte review
    Mapped tea.txt; one selected read
    Evidence conclusion
    Delivery fields okunmadı
  3. UTF-8 representation hesabı ayrıldı

    Çay body’si UTF-8 c3876179 ile dört octet’tir. Character count veya filename uzunluğu content length yerine kullanılmaz.

    Asset observation
    GET
    Mapping/byte review
    Çay: c3876179; 4 octets
    Evidence conclusion
    Delivery fields okunmadı
  4. Declared ve received uzunlukları karşılaştırıldı

    GET declaredLength=4 ve receivedContentOctets=4 taşır. Bu equality selected content bytes içindir; header, wrapper veya compression chain sonucu değildir.

    Asset observation
    GET
    Mapping/byte review
    Declared=4; received=4
    Evidence conclusion
    Selected content received
  5. Metadata’dan yanlış cause çıkarılmadı

    Content-Type ve filename text’i bütün bytes’ın encoding veya güvenliğini tek başına doğrulamaz. Bu row fixed UTF-8 fixture ve bytes equality’siyle sınırlıdır.

    Asset observation
    GET
    Mapping/byte review
    Representation metadata scoped
    Evidence conclusion
    No universal file-validation claim
  6. Asset evidence hükmü sınırlı kaldı

    Bu artifact map, selected I/O ve GET/HEAD response contract’ını ilişkilendirir. Browser rendering, OS permission-hardening ve deployment’daki cache/compression çeşitleri ayrıca evidence ister.

    Asset observation
    GET
    Mapping/byte review
    Known: selected 4-octet representation
    Evidence conclusion
    Other runtime layers unknown

HEAD metadata

  1. Selected representation record seçildi

    Bu branch HEAD artifact row’unu inceler. /assets/tea.txt public whitelist’e bağlıdır; harmless view query’si pathname’den ayrı kalır.

    Asset observation
    HEAD
    Mapping/byte review
    Representation incelenmedi
    Evidence conclusion
    Delivery fields okunmadı
  2. Map ve content source ilişkilendirildi

    Bu fixture’da mapped=true ve readAttempts=1 verilmiştir. HEAD için bu okuma küçük implementation tercihidir; HTTP’nin her HEAD request’inde aynı I/O’yu şart koştuğu anlamına gelmez.

    Asset observation
    HEAD
    Mapping/byte review
    Mapped tea.txt; one selected read
    Evidence conclusion
    Delivery fields okunmadı
  3. UTF-8 representation hesabı ayrıldı

    Çay body’si UTF-8 c3876179 ile dört octet’tir. Character count veya filename uzunluğu content length yerine kullanılmaz.

    Asset observation
    HEAD
    Mapping/byte review
    Çay: c3876179; 4 octets
    Evidence conclusion
    Delivery fields okunmadı
  4. Declared ve received uzunlukları karşılaştırıldı

    HEAD declaredLength=4 fakat receivedContentOctets=0 taşır. GET representation metadata’sı ile HEAD’in taşınmayan content’i aynı sayıya zorlanmaz.

    Asset observation
    HEAD
    Mapping/byte review
    Declared=4; received=0
    Evidence conclusion
    HEAD has no content
  5. Metadata’dan yanlış cause çıkarılmadı

    HEAD body’nin olmaması dosyanın boş olduğunu göstermez. Content-Type text/plain; charset=utf-8 ile gerçek bytes’ın encoding’i de ayrı kontrol alanlarıdır.

    Asset observation
    HEAD
    Mapping/byte review
    Representation metadata scoped
    Evidence conclusion
    No empty-file inference
  6. Asset evidence hükmü sınırlı kaldı

    Bu artifact map, selected I/O ve GET/HEAD response contract’ını ilişkilendirir. Browser rendering, OS permission-hardening ve deployment’daki cache/compression çeşitleri ayrıca evidence ister.

    Asset observation
    HEAD
    Mapping/byte review
    Known: selected 4-octet representation
    Evidence conclusion
    Other runtime layers unknown

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

Mapping ve I/O ledger’ini birlikte oku

Artifact normal case’te target=/assets/tea.txt?view=plain, pathname=/assets/tea.txt, mapping=tea.txt ve fileContentHex=c3876179 tutar. Bunlar gerçek server’ın hazır telemetry alanları değildir; ilişkiyi görünür yapan synthetic ledger’dır. Normal client octet count 4 ile UTF-8 hesabı eşleşir. HEAD record’unda aynı declaredLength=4 ama receivedContentOctets=0 vardır; bu expected behavior’dır.

Unmapped record’un readAttempts=0 olması map sınırında durulduğunu anlatır. Backing-missing record’un attempt=1 olması ayrı bir I/O failure sınırı verir. Bu tiny fixture expected missing-file sonucunu 404’e eşler; her filesystem error’ın evrensel HTTP karşılığı 404 değildir. Unexpected internal failures farklı server policy gerektirir. Deployment public root, build artifact listesi ve OS izinlerini kendi ortamında doğrulamalıdır; yalnız dış status yeterli olmaz.

Missing kayıt ile temiz sonucu eşitleme

XPath count(/audit/asset[@mapping="none" and @reads!="0"]) map bulunmadığı halde read yapılmış authored gözlemleri seçer. Normal missing.txt fixture’i 0, intentionally inconsistent positive fixture’i 1 verir. gone.txt’nin mapping’i bulunduğu için bir read attempt expected benign durumdur; selector onu bu condition’da saymaz. Event yoksa count 0 olsa da bunun anlamı insufficient evidence’dır.

Düzeltmenin etkisini değerlendirirken map entry’si, callback sonucu ve response bytes’ı birlikte kontrol et. Public URL’nin fiziksel root değişince aynı logical asset’e bağlanması bekleniyorsa content continuity ayrı ölçülmelidir. Tiny readFile fixture Buffer, HEAD ve expected error davranışını gösterir; Express static middleware, filesystem permission-hardening, browser rendering ve bütün cache/compression chain’i hakkında doğrulama iddiası taşımaz.

Public dosya alanını açıkça seç

Static root bütün proje klasörü olmamalıdır: yalnız yayımlanması amaçlanan asset’lerin bulunduğu dizini seç. Express’te root fiziksel dizini, mount prefix ise public URL alanını belirler; göreli root process’in başlatıldığı dizine bağlıdır. Bu yüzden root’u açık ve kararlı biçimde çözümle, birden fazla root varsa arama sırasını da incele. Örnekte bunun daha dar karşılığı izin verilen map entry’leridir: mapping bulunmadan filesystem read başlatılmaz.

Public asset listesini ve runtime’ın bu alanı okuma yetkisini birlikte sınırlandır. Normal tea.txt içerik uzunluğu, HEAD’in sıfır content octet’i, unmapped isteğin sıfır read attempt’i ve backing-missing hatası ayrı regression’lardır. Beklenmeyen I/O hatasını sessizce başarılı boş dosyaya dönüştürme veya bütün hataları aynı 404 diye gizleme. Map ve callback kanıtı eksikse dışarıdaki status’tan güvenli dosya sınırı çıkarılamaz; bu küçük örnek OS izinlerini uygulamaz.

ŞİMDİ VAKAYA UYGULA

Unmapped asset, missing file ve HEAD content nasıl ayrılır?

Fixed public whitelist request text’ini arbitrary file path’e dönüştürmez. GET ve HEAD aynı representation metadata’sını farklı content delivery ile gösterebilir.

Vakadaki accepted, delivery ve committed effect kayıtlarını farklı owner’lar üzerinden oku. Caller’ın bilinmeyen sonucunu business rollback olarak yeniden adlandırma.

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

ÖRNEĞİ BİRLİKTE OKUYALIM

Public asset mapping ve octet ledger

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

Ham kaydı ve alan açıklamalarını oku
{
  "mapping": {
    "kind": "exact-public-whitelist",
    "entries": {
      "/assets/tea.txt": "fixtureRoot/tea.txt",
      "/assets/gone.txt": "fixtureRoot/gone.txt"
    },
    "clientTextConcatenatedToFilePath": false,
    "publicPrefixIsPhysicalDirectory": false
  },
  "normal": {
    "method": "GET",
    "target": "/assets/tea.txt?view=plain",
    "pathname": "/assets/tea.txt",
    "mapped": true,
    "readAttempts": 1,
    "fileContent": "Çay",
    "fileContentHex": "c3876179",
    "contentType": "text/plain; charset=utf-8",
    "declaredLength": 4,
    "receivedContentOctets": 4,
    "status": 200
  },
  "head": {
    "method": "HEAD",
    "mapped": true,
    "readAttempts": 1,
    "declaredLength": 4,
    "receivedContentOctets": 0,
    "status": 200
  },
  "unmapped": {
    "target": "/assets/missing.txt",
    "mapped": false,
    "readAttempts": 0,
    "status": 404
  },
  "backingMissing": {
    "target": "/assets/gone.txt",
    "mapped": true,
    "readAttempts": 1,
    "error": "ENOENT in own absent fixture file",
    "status": 404
  },
  "selector": {
    "language": "XPath",
    "xml": "<audit><asset mapping=\"none\" reads=\"0\"/></audit>",
    "xpath": "count(/audit/asset[@mapping=\"none\" and @reads!=\"0\"])",
    "expected": 0,
    "positiveFixtureXml": "<audit><asset mapping=\"none\" reads=\"1\"/></audit>",
    "positiveExpected": 1,
    "scope": "Only authored protocol-decision observations, not product log field names or a live HTTP capture.",
    "missingFieldBehavior": "Missing observation is insufficient evidence; zero matches is not proof of correct runtime behavior."
  }
}
mapping
Sabit URL key’lerinden yalnız fixture path’lerine seçilmiş eşleme.
declaredLength
GET representation’ın octet sayısı; HEAD content uzunluğu değil.
readAttempts
Unmapped ve backing-missing iç nedenlerini ayırır.

Yalnız iki whitelist entry, kendi tiny file’ları ve normal HTTP response’lar; arbitrary path, directory listing ve gerçek server capture yok.

İki yanlış kanı

URL’de /assets yazıyorsa disk üzerinde /assets directory’si olmalıdır.

Public prefix virtual mount olabilir; filesystem root server tarafından ayrı seçilir.

HEAD Content-Length 4 ise HEAD body’sinde dört octet gelir.

HEAD content göndermez; header seçilmiş GET representation’ın length’ini anlatabilir.

SIRA SENDE

Bu hikâyeyi sen çöz.

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

Mapping’de olmayan /assets/missing.txt request’i için file read yapılır mı?

  1. Evet. /assets prefix’i bütün filesystem’i public yapar.
  2. Hayır. readAttempts=0; 404 döner.
Gerekçeli cevabı oku

Hayır. readAttempts=0; 404 döner. — Mapping yoksa backing file’a read gönderilmez. Client metni fiziksel path’e eklenerek kullanılmaz.

İki request de 404 döndürürken alttaki mekanizmaları neden farklıdır?

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

backingMissing
{"target":"/assets/gone.txt","mapped":true,"readAttempts":1,"error":"ENOENT in own absent fixture file","status":404}
unmapped
{"target":"/assets/missing.txt","mapped":false,"readAttempts":0,"status":404}
  1. Unmapped request read yapmaz; mapped ama kayıp file için ENOENT alınır.
  2. 404 her zaman başarılı file read ve boş body demektir.
Gerekçeli cevabı oku

Unmapped request read yapmaz; mapped ama kayıp file için ENOENT alınır. — Mapping yokluğu ile backing file yokluğu ayrı sınırlar içinde üretilir. Aynı public status bu farkı ortadan kaldırmaz.

HEAD tea asset için declaredLength=4, received=0. Neden çelişki yok? Query ve HTTP path fiziksel file adı mı?

Gerekçeli cevabı oku

HEAD, GET representation’ına ait metadata’yı verebilir ama content taşımaz. Pathname açıkça tanımlanan mapping entry’sine gider; view=plain query’si fiziksel filename’e eklenmez. Çay UTF-8’de 4 byte’tır. Public URL prefix’i filesystem directory’si değildir; otomatik read/write izni oluşturmaz.

□ HEAD metadata’sını teslim edilmiş body saymadım.

□ HTTP target ile fiziksel file mapping’i ayırdım.

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

Kaynaklar ve kapsam

  • Express — Serving static filesServing static files in Express · root directory and URL distinction · Virtual path prefix · Relative path and process launch directory
  • Node.js v24.13.0 — Filesystem APIfs.readFile(path[, options], callback) · readFile callback err/data and default Buffer · Performance Considerations
  • Node.js v24.13.0 — HTTP APIhttp.createServer([options][, requestListener]) · response.end([data[, encoding]][, callback]) · response.writableEnded · response.writableFinished
  • RFC 9110 — HTTP Semantics3.1 Resources · 3.2 Representations · 8.3 Content-Type · 8.6 Content-Length · 9.2.1 Safe Methods · 9.2.2 Idempotent Methods · 9.3.1 GET · 9.3.2 HEAD · 12.5.1 Accept · 15.5.5 404 Not Found · 15.5.6 405 Method Not Allowed · 15.5.7 406 Not Acceptable