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.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
GET asset
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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ı
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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ı
- 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ı
- 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ı
- 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
- 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
- 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
- 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ı
- 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ı
- 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ı
- 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
- 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
- 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ı?
- Evet. /assets prefix’i bütün filesystem’i public yapar.
- 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}
- Unmapped request read yapmaz; mapped ama kayıp file için ENOENT alınır.
- 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