WEB / WEB-16.S03
Paths, upload ve download authorization
Display name, stored key, owner policy ve response body’nin ayrı sahiplerini izle.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Upload kabul
- Attachment isteği hazır
Örnekte attachment isteği hazırdır: Alice; catalog.txt; text/plain; Tea. Principal sağlanan context’tir; gerçek login kanıtı değildir. İşlem henüz storage I/O veya consumer sonucu üretmedi.
- Attachment isteği
- Alice; catalog.txt; text/plain; Tea
- Policy kontrolü
- Policy kararı yok
- Örneğin storage’ı
- Başlangıç verisi aynı; işlem I/O’su yok
- Consumer
- Sonuç yok
- Operation policy kararı
Sağlanan Alice context’i upload’a izin verir. catalog.txt onaylı display adıdır; text/plain, üç Tea byte’ı ve strict UTF-8 koşulları geçer. Henüz write yapılmadı.
- Attachment isteği
- Alice; catalog.txt; text/plain; Tea
- Policy kontrolü
- Policy kabul etti
- Örneğin storage’ı
- Başlangıç verisi aynı; işlem I/O’su yok
- Consumer
- Sonuç yok
- Storage key ve root seçimi
Uygulama yeni asset-02.dat key’ini kendi root’unda seçer; catalog.txt display adı path olarak kullanılmaz. Exclusive creation mevcut asset-01’i overwrite etmeden ayrı dosya oluşturmak içindir.
- Attachment isteği
- Alice; catalog.txt; text/plain; Tea
- Policy kontrolü
- Örneğin storage root’u seçildi
- Örneğin storage’ı
- Başlangıç verisi aynı; işlem I/O’su yok
- Consumer
- Sonuç yok
- Storage işlemi
Yeni asset-02.dat’ye Tea byte’ları yazıldı: reads=0, writes=1. asset-01 byte’ları değişmedi. Bu yerel write, disk ve metadata arasında distributed transaction kanıtı değildir.
- Attachment isteği
- Alice; catalog.txt; text/plain; Tea
- Policy kontrolü
- Örneğin storage root’u seçildi
- Örneğin storage’ı
- Reads=0; writes=1
- Consumer
- Sonuç yok
- İşlem sonucu hazır
Tamamlanan upload için storedId=asset-02 metadata’sı hazırdır. Display catalog.txt ayrı kalır; upload sonucu download body veya headers üretmez. Consumer güncellemesi sonraki yerel adımdadır.
- Attachment isteği
- Alice; catalog.txt; text/plain; Tea
- Policy kontrolü
- Örneğin storage root’u seçildi
- Örneğin storage’ı
- Kaydedilen asset-02 metadata’sı
- Consumer
- Sonuç yok
- Consumer sonucu tamamlandı
Yerel consumer yeni storedId=asset-02 metadata’sını aldı. Mevcut asset-01 aynı kaldı; bu upload sonucu download body, browser receipt veya başka resource izni değildir.
- Attachment isteği
- Alice; catalog.txt; text/plain; Tea
- Policy kontrolü
- Örneğin storage root’u seçildi
- Örneğin storage’ı
- Kaydedilen asset-02 metadata’sı
- Consumer
- Upload tamam; asset-02
Owner download
- Attachment isteği hazır
Örnekte attachment isteği hazırdır: Alice; asset-01 download. Principal sağlanan context’tir; gerçek login kanıtı değildir. İşlem henüz storage I/O veya consumer sonucu üretmedi.
- Attachment isteği
- Alice; asset-01 download
- Policy kontrolü
- Policy kararı yok
- Örneğin storage’ı
- Başlangıç verisi aynı; işlem I/O’su yok
- Consumer
- Sonuç yok
- Operation policy kararı
Alice, asset-01 metadata owner’ı Alice ile eşleşir. Bu sınırlı resource policy read’i kabul eder; ID’nin bilinmesi veya filename tek başına izin değildir. Henüz file okunmadı.
- Attachment isteği
- Alice; asset-01 download
- Policy kontrolü
- Policy kabul etti
- Örneğin storage’ı
- Başlangıç verisi aynı; işlem I/O’su yok
- Consumer
- Sonuç yok
- Storage key ve root seçimi
Metadata asset-01.dat key’ini seçer ve resolved parent örneğin root’u ile eşleşir. Root kontrolü resource izninden ayrıdır; bu model resolve/open arasına genel race-free garanti eklemez.
- Attachment isteği
- Alice; asset-01 download
- Policy kontrolü
- Örneğin storage root’u seçildi
- Örneğin storage’ı
- Başlangıç verisi aynı; işlem I/O’su yok
- Consumer
- Sonuç yok
- Storage işlemi
Seçilen asset-01.dat’den Tea byte’ları okundu: reads=1, writes=0. Bu aşamada body hazır olabilir; consumer henüz sonucu kullanmadı ve browser delivery gerçekleşmiş sayılmaz.
- Attachment isteği
- Alice; asset-01 download
- Policy kontrolü
- Örneğin storage root’u seçildi
- Örneğin storage’ı
- Reads=1; writes=0
- Consumer
- Sonuç yok
- İşlem sonucu hazır
Response record body=Tea, Content-Type text/plain; charset=utf-8 ve attachment; filename="memo.txt" ile hazırdır. Header bir sunum önerisidir; consumer henüz almadı, browser save kanıtı yoktur.
- Attachment isteği
- Alice; asset-01 download
- Policy kontrolü
- Örneğin storage root’u seçildi
- Örneğin storage’ı
- Onaylı Tea response record’u
- Consumer
- Sonuç yok
- Consumer sonucu tamamlandı
Yerel consumer Tea body’sini ve onaylı download metadata’sını aldı. reads=1, writes=0 kalır; HTTP server/browser bu modelde çalıştırılmadığı için gerçek file save sonucu çıkarılmaz.
- Attachment isteği
- Alice; asset-01 download
- Policy kontrolü
- Örneğin storage root’u seçildi
- Örneğin storage’ı
- Onaylı Tea response record’u
- Consumer
- Tea teslim edildi; reads=1
Reddedilen okuma
- Attachment isteği hazır
Örnekte attachment isteği hazırdır: Bob; asset-01 download. Principal sağlanan context’tir; gerçek login kanıtı değildir. İşlem henüz storage I/O veya consumer sonucu üretmedi.
- Attachment isteği
- Bob; asset-01 download
- Policy kontrolü
- Policy kararı yok
- Örneğin storage’ı
- Başlangıç verisi aynı; işlem I/O’su yok
- Consumer
- Sonuç yok
- Operation policy kararı
Bob, record owner Alice ile eşleşmez; resource-policy reddi verilir. Bu karar storage işleminden önce verilir; file read veya yeni write başlatılmaz.
- Attachment isteği
- Bob; asset-01 download
- Policy kontrolü
- Reddedildi: resource-policy
- Örneğin storage’ı
- Başlangıç verisi aynı; işlem I/O’su yok
- Consumer
- Sonuç yok
- Storage key ve root seçimi
Önceki policy reddi nedeniyle storage mapping/root değerlendirmesine geçilmez. İşlem için dosya açılmaz veya oluşturulmaz; başlangıç metadata ve byte’ları aynı kalır.
- Attachment isteği
- Bob; asset-01 download
- Policy kontrolü
- Storage değerlendirilmedi
- Örneğin storage’ı
- Başlangıç verisi aynı; işlem I/O’su yok
- Consumer
- Sonuç yok
- Storage işlemi
Reddedilen işlemde reads=0 ve writes=0 kalır. Sonucu kontrol etmek için ayrı yapılan bir okuma, reddedilen download veya upload’ın I/O’su değildir.
- Attachment isteği
- Bob; asset-01 download
- Policy kontrolü
- Storage değerlendirilmedi
- Örneğin storage’ı
- Reads=0; writes=0
- Consumer
- Sonuç yok
- İşlem sonucu hazır
Yeni storedId, body veya headers hazırlanmaz. Ret, daha önceki Tea sonucunu tekrar kullanarak boş bir başarıya dönüştürülmez; consumer henüz güncellenmedi.
- Attachment isteği
- Bob; asset-01 download
- Policy kontrolü
- Storage değerlendirilmedi
- Örneğin storage’ı
- Body yok; metadata değişmedi
- Consumer
- Sonuç yok
- Consumer sonucu tamamlandı
Consumer resource-policy reddini gösterir: body=null, headers=null ve yeni metadata yoktur. Storage I/O yapılmadı; bu yerel sonuç HTTP status veya browser download gözlemi değildir.
- Attachment isteği
- Bob; asset-01 download
- Policy kontrolü
- Storage değerlendirilmedi
- Örneğin storage’ı
- Body yok; metadata değişmedi
- Consumer
- Sonuç yok; resource-policy
Media uyuşmazlığı
- Attachment isteği hazır
Örnekte attachment isteği hazırdır: Alice; catalog.txt; image/png; Tea. Principal sağlanan context’tir; gerçek login kanıtı değildir. İşlem henüz storage I/O veya consumer sonucu üretmedi.
- Attachment isteği
- Alice; catalog.txt; image/png; Tea
- Policy kontrolü
- Policy kararı yok
- Örneğin storage’ı
- Başlangıç verisi aynı; işlem I/O’su yok
- Consumer
- Sonuç yok
- Operation policy kararı
Beyan edilen image/png, profilin text/plain koşuluna uymaz; text-profile reddi verilir. Bu karar storage işleminden önce verilir; file read veya yeni write başlatılmaz.
- Attachment isteği
- Alice; catalog.txt; image/png; Tea
- Policy kontrolü
- Reddedildi: text-profile
- Örneğin storage’ı
- Başlangıç verisi aynı; işlem I/O’su yok
- Consumer
- Sonuç yok
- Storage key ve root seçimi
Önceki policy reddi nedeniyle storage mapping/root değerlendirmesine geçilmez. İşlem için dosya açılmaz veya oluşturulmaz; başlangıç metadata ve byte’ları aynı kalır.
- Attachment isteği
- Alice; catalog.txt; image/png; Tea
- Policy kontrolü
- Storage değerlendirilmedi
- Örneğin storage’ı
- Başlangıç verisi aynı; işlem I/O’su yok
- Consumer
- Sonuç yok
- Storage işlemi
Reddedilen işlemde reads=0 ve writes=0 kalır. Sonucu kontrol etmek için ayrı yapılan bir okuma, reddedilen download veya upload’ın I/O’su değildir.
- Attachment isteği
- Alice; catalog.txt; image/png; Tea
- Policy kontrolü
- Storage değerlendirilmedi
- Örneğin storage’ı
- Reads=0; writes=0
- Consumer
- Sonuç yok
- İşlem sonucu hazır
Yeni storedId, body veya headers hazırlanmaz. Ret, daha önceki Tea sonucunu tekrar kullanarak boş bir başarıya dönüştürülmez; consumer henüz güncellenmedi.
- Attachment isteği
- Alice; catalog.txt; image/png; Tea
- Policy kontrolü
- Storage değerlendirilmedi
- Örneğin storage’ı
- Body yok; metadata değişmedi
- Consumer
- Sonuç yok
- Consumer sonucu tamamlandı
Consumer text-profile reddini gösterir: body=null, headers=null ve yeni metadata yoktur. Storage I/O yapılmadı; bu yerel sonuç HTTP status veya browser download gözlemi değildir.
- Attachment isteği
- Alice; catalog.txt; image/png; Tea
- Policy kontrolü
- Storage değerlendirilmedi
- Örneğin storage’ı
- Body yok; metadata değişmedi
- Consumer
- Sonuç yok; text-profile
ROLLER · STATE · VERİ AKIŞI
Resource ID, display filename ve storage path farklıdır
Atlas text attachment için üç isim tutar. asset-01 resource ID, memo.txt kullanıcıya sunulan display filename, asset-01.dat ise uygulamanın belirlediği storage key’idir. Client’ın gönderdiği filename doğrudan filesystem path yapılmaz. Download handler bir resource ID alır, metadata record’u bulur ve path’i o record üzerinden seçer. İsmin opaque olması authorization yerine geçmez; aynı ID’ye yapılan her read için ilgili policy yine değerlendirilir.
Örnekteki local storage, Tea byte’larını tutar. Mevcut asset-01 değişmez; kabul edilen upload ayrı asset-02.dat oluşturur. Kullanıcıya gösterilen catalog.txt ise başka bir metadata alanıdır. Bu mapping, storage naming ile HTTP presentation naming’in neden ayrıldığını görünür kılar. Local file davranışı, bir object store’un, web server alias’ının veya shared volume’un davranışıyla eşitlenmez.
Canonical path bir permission kararı değildir
Python Path.resolve, örneğin kullandığı filesystem’de symlink’leri çözüp absolute bir path üretir. Örneğin public-link.dat, aynı root içindeki asset-01.dat’ye işaret eder; path’teki basename farklıdır, çözümlenen hedef aynı file’dır. İzin verilen root kararı, işlenmemiş string’in başına bakılarak verilmez. Seçilen profil, çözümlenmiş parent’ın tam olarak örneğin root klasörü olmasını ister; bu örnek iç içe klasörleri desteklemez.
Bu check resource owner policy’sinden ayrıdır. Alice’in kendi asset’ini okuma kararı doğru olsa bile metadata yanlışlıkla örneğin oluşturduğu kardeş klasördeki catalog.txt’ye işaret ederse storage-root rejection olur ve operation file read’i yapılmaz. Native fixture bu sıradan yanlış mapping’i kendisi üretir; traversal input veya external dosya kullanılmaz. Resolve ile daha sonraki open arasında concurrent değişim için genel race-free garanti verilmez. Production’da file handle, directory ownership ve filesystem concurrency ayrıca tasarlanır.
Upload kabulü filename’den fazlasını içerir
Bu eğitim profilinde yalnız memo.txt veya catalog.txt display seçimi, declared text/plain, 1–16 byte ve strict UTF-8 text kabul edilir. Upload’a örnekte sağlanan context Alice’e izin verir; Bob için write yapılmaz. Beyan edilen image/png ile sıradan Tea byte’ları gönderilen case text-profile kapısında durur. Content-Type bir client beyanıdır; aynı string’i header’a koymak byte’ların gerçekten beklenen formatta olduğunu doğrulamaz.
Kabul edilen upload, uygulamanın ürettiği storage key’e exclusive creation ile yazar; aynı filename ile mevcut resource’u overwrite etmez. File bytes yazıldıktan sonra metadata record’u hazırlanır. Örnek, yürütülen write/readback ile Tea bytes ve asset-02 key’ini kontrol eder; disk write ile metadata commit’i arasında distributed transaction bulunduğu iddia edilmez. Gerçek bir upload service için multipart parsing, authentication, CSRF policy, quarantine/scan, storage quota ve cleanup gibi ek sorumluluklar vardır. Bu derste image/PDF/parser payload veya malware sample işlenmez.
Download izni bytes okunmadan verilir
Download branch, örnekte sağlanan principal ile metadata owner arasındaki sınırlı policy’yi file body’sinden önce değerlendirir. Alice asset-01 için kabul edilir, resolved storage root kontrol edilir, sonra Tea bytes okunur. Bob aynı bilinen resource için resource-policy rejection alır: reads=0, body null ve headers null kalır. Başarılı storage lookup ile caller’a body delivery ayrı olgulardır.
Principal eksikse NOT-COMPUTED olur; model eksik identity evidence’ı izin gibi yorumlamaz. Tanınmayan asset ID için de read yapılmaz. Gerçek endpoint’in not-found/denied responses arasında hangi disclosure politikasını uygulayacağı ayrı bir tasarım kararıdır; burada HTTP status veya timing gözlenmez. Identity alias’ları, örnekte sağlanan sabit context’tir, gerçek login/session doğrulaması değildir. Bu sınırı açık tutmak policy modelini gerçek authorization altyapısı gibi sunmayı önler.
Content-Type ve Content-Disposition farklı işler yapar
Kabul edilen download için uygulama text/plain; charset=utf-8 media type’ı ve attachment; filename="memo.txt" disposition’ını bir response record’da seçer. Content-Type representation’ın media type’ını belirtir. Content-Disposition attachment, recipient’a default save davranışı önerir; filename tavsiye niteliğindedir, recipient’ın storage path’i veya server’ın resource ID’si değildir. Bir header’ın hazırlanması browser’ın dosyayı gerçekten kaydettiği anlamına gelmez.
Bu native check HTTP server başlatmaz; header’lar local typed record’dur. ASCII display labels onaylı, sabit kümeden gelir. Arbitrary filename header serialization, Unicode filename* interoperability veya MIME sniffing davranışı test edilmez. Media type seçimi download authorization’ı bypass etmez; denied branch’te her iki header da yoktur. Static site’nin bu artifact’i göstermesi, o bytes için gerçek download endpoint açılması değildir.
Bir operation’ın kanıtı dört ayrı aşamada tutulur
Intent, policy, storage I/O ve consumer sonucu artifact’te ayrı alanlardır. Upload success writes=1 ve storedId üretir fakat download body üretmez. Download success reads=1 ve body Tea üretir fakat file mutation yapmaz. Media mismatch ve denied read için I/O count=0 kalır. Consumer sonucu sadece tamamlanmış ve onaylanmış operation’dan sonra değişir; önceki başarı yeni rejection’ın üstünü örtmez.
Operation count ile sonucu doğrulamak için yapılan okumayı ayır. Mevcut file’ın readback ile kontrol edilmesi, reddedilen download function’ının read yaptığı anlamına gelmez. Her dal için Tea byte’larının, metadata key’lerinin ve yeni file’ın durumunun ne olması gerektiği ayrı belirlenir. Böylece operation sonucu ile daha sonra yapılan gözlem birbirine karıştırılmaz. Local file örneklerinden rastgele path’ler için genel güvenlik veya OS isolation garantisi çıkarılmaz.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Owner farklı
- İstenen file operation seçildi
Bob, asset-01 için download ister. Record owner Alice’tir; asset ID’nin bilinmesi read permission vermez.
- Upload/download context
- case=denied
- Resource/format policy
- Gate incelenmedi
- Storage/response boundary
- I/O yok
- Authoritative consumer kuralı ayrıldı
Bu fixture supplied Alice equals record owner policy’sini kullanır; gerçek authentication yapmaz. Bob alias’ı known mismatch’tir, missing principal değildir.
- Upload/download context
- case=denied
- Resource/format policy
- Known owner mismatch
- Storage/response boundary
- I/O yok
- İlk failure gate’i I/O’dan önce durdu
Expected decision REJECT ve reason resource-policy’dir. Metadata relationship kontrolü file bytes okunmadan yapılır.
- Upload/download context
- case=denied
- Resource/format policy
- Reason: resource-policy
- Storage/response boundary
- I/O yok
- Negatif I/O sonucu korundu
reads=0, writes=0 ve storedId=null kalır. Ret, yapılmış bir read/write’ın sonradan gizlenmesi olarak gösterilmez; operation bu case’te ilerlemez.
- Upload/download context
- case=denied
- Resource/format policy
- No storage operation
- Storage/response boundary
- Reads=0; writes=0
- Body ve header projection kapalı kaldı
body=null ve headers=null olumsuz consumer boundary’sidir. attachment filename veya response media type, failed resource/profile gate’inden geçiş yaratmaz.
- Upload/download context
- case=denied
- Resource/format policy
- REJECT
- Storage/response boundary
- No body or headers
- Ret kapsamı yanlış genellenmedi
Bu fixture owner mismatch’i gösterir; opaque ID veya UI link’i authorization yerine geçmez. Genel root/race hardening garantisi bu record’dan çıkarılmaz.
- Upload/download context
- case=denied
- Resource/format policy
- Known: failed consumer gate
- Storage/response boundary
- Known: I/O/body/header withheld
Media mismatch
- İstenen file operation seçildi
Alice catalog.txt display adıyla text-profile upload ister, ancak declared media image/png’dir. Client filename ve media, storage key veya accepted format değildir.
- Upload/download context
- case=media-mismatch
- Resource/format policy
- Gate incelenmedi
- Storage/response boundary
- I/O yok
- Authoritative consumer kuralı ayrıldı
Profile declaredMedia=text/plain ve strict UTF-8 text ister. Declared header’ın geçmesi bile bytes validation’ın yerine geçmez; burada media gate baştan uyuşmaz.
- Upload/download context
- case=media-mismatch
- Resource/format policy
- Known text-profile mismatch
- Storage/response boundary
- I/O yok
- İlk failure gate’i I/O’dan önce durdu
Expected decision REJECT ve reason text-profile’dır. Upload storage write başlamadan bu profile sınırında durur.
- Upload/download context
- case=media-mismatch
- Resource/format policy
- Reason: text-profile
- Storage/response boundary
- I/O yok
- Negatif I/O sonucu korundu
reads=0, writes=0 ve storedId=null kalır. Ret, yapılmış bir read/write’ın sonradan gizlenmesi olarak gösterilmez; operation bu case’te ilerlemez.
- Upload/download context
- case=media-mismatch
- Resource/format policy
- No storage operation
- Storage/response boundary
- Reads=0; writes=0
- Body ve header projection kapalı kaldı
body=null ve headers=null olumsuz consumer boundary’sidir. attachment filename veya response media type, failed resource/profile gate’inden geçiş yaratmaz.
- Upload/download context
- case=media-mismatch
- Resource/format policy
- REJECT
- Storage/response boundary
- No body or headers
- Ret kapsamı yanlış genellenmedi
Bu fixture declared-media mismatch’i gösterir; text profile bütün PDF/archive/media decoder güvenliği değildir. Başka formatlar kendi validation ve isolation contract’ını ister.
- Upload/download context
- case=media-mismatch
- Resource/format policy
- Known: failed consumer gate
- Storage/response boundary
- Known: I/O/body/header withheld
VARSAYIM · SINIR · KONTROL
Metadata mapping ile erişim kararını birlikte incele
File review’de client’ın hangi isimleri etkileyebildiğini ve backend’in hangi isimleri kendisinin seçtiğini açıkça ayır. Display filename, resource ID ve işlemde kullanılan storage key artifact’te farklıdır. Bir UI link’inin memo.txt demesi onun disk path’i olduğunu kanıtlamaz. Aynı şekilde asset ID’nin zor tahmin edilmesi owner/resource policy’nin yerini tutmaz; read kararını her request bağlamında düşünmek gerekir.
Bu örneğin reddedilen dalı yalnız bir hata metniyle ölçülmez. Çalıştırılan function reads=0 döner, body/header yoktur ve örneğin mevcut byte’ları aynı kalır. Storage mapping yanlışsa owner için izin kararı verilmiş olsa bile root kontrolü işlemi durdurur. Bu iki hata farklıdır: biri resource policy, diğeri storage boundary. İnceleme bunları aynı not-found etiketi altında kanıtsız birleştirmemelidir.
Sıradan bir hata, format güvenliğini sertifikalamaz
Declared media mismatch, upload kabul kapısının devreye girdiğini gösterir. text/plain beyanının doğru olması ise genel content safety kanıtı değildir; seçilmiş bytes strict UTF-8 olarak ayrıca decode edilir. Bu file profile HTML, PDF, archive veya media processing pipeline değildir. String’lerin başka interpreter’a aktarılması önceki interpretation ve sonraki isolation derslerinin ayrı sınırıdır.
Path.resolve gözlemi de sınırlıdır. Aynı root içindeki symlink’in çözülmesi, eşzamanlı filesystem değişikliklerinin güvenli yönetildiğini veya bütün path girdilerinin uygun olduğunu göstermez. İncelemenin gücü, owner alias, key mapping, root policy, gözlenen I/O ve consumer sonucu arasında kurduğu açık ilişki kadardır. Bu ilişkinin dışında kalan concurrency ve filesystem izinleri için ayrı değerlendirme gerekir.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Name mapping
- Download metadata seçildi
Seed resource id asset-01, storageKey asset-01.dat ve displayName memo.txt alanlarını ayrı taşır. Aynı file için bu adlar farklı roller kurar.
- File metadata observation
- Asset metadata
- Mapping/context review
- Mapping incelenmedi
- Evidence conclusion
- Header/body sonucu yok
- Resource owner kararı okundu
Download principal Alice için expected ACCEPT’tir. Bu alias identity doğrulamasının yerine geçmez; profile owner equality’siyle sınırlı bir karar girdisidir.
- File metadata observation
- Resource asset-01; owner Alice
- Mapping/context review
- Declared owner match
- Evidence conclusion
- Header/body sonucu yok
- Storage ve display adları karşılaştırıldı
Storage key uygulamanın seçtiği asset-01.dat’tır. Download filename memo.txt yalnız onaylı presentation metadata’sıdır; recipient bunu server disk path’i sanmamalıdır.
- File metadata observation
- Storage: asset-01.dat
- Mapping/context review
- Display: memo.txt
- Evidence conclusion
- Distinct naming roles
- Response projection okundu
Expected body Tea ve Content-Type text/plain; charset=utf-8’dir. Content-Disposition attachment; filename="memo.txt" metadata’sı read permission yerine geçmez.
- File metadata observation
- Reads=1; writes=0
- Mapping/context review
- Selected text response
- Evidence conclusion
- Attachment presentation only
- Upload exclusive identity ayrı tutuldu
Accepted upload storedId=asset-02 üretir; seed asset-01 üzerine yazılmış sayılmaz. Display catalog.txt bu yeni opaque storage key’e dönüştürülen path değildir.
- File metadata observation
- Seed retained: asset-01
- Mapping/context review
- Upload separate: asset-02
- Evidence conclusion
- Display/storage mapping explicit
- Metadata hükmü scope’unda kaldı
Bu ledger I/O count ve header/body projection’ını gösterir. Browser save, actual object-store consistency veya general filename serializer güvenliği ayrıca evidence ister.
- File metadata observation
- Known: distinct naming roles
- Mapping/context review
- Known: selected response projection
- Evidence conclusion
- Broader storage/browser behavior unknown
Principal eksik
- Missing principal scope seçildi
missing.principal=null ile başlar. Bob mismatch satırındaki known subject bu boşluğa konmaz; trusted identity evidence eksiktir.
- File metadata observation
- Principal=null
- Mapping/context review
- Policy hesaplanmadı
- Evidence conclusion
- I/O/body yok
- NOT-COMPUTED decision okundu
Decision NOT-COMPUTED’dır. Bu eksik input durumu known owner denial veya unknown resource’ın varlığı/yokluğu hakkında hüküm değildir.
- File metadata observation
- Principal=null
- Mapping/context review
- Decision NOT-COMPUTED
- Evidence conclusion
- No owner-attribution result
- Reads ve writes ayrı kontrol edildi
reads=0 ve writes=0 tutulur. Trusted principal çözülememesi storage’a ilerleme veya guessed Alice context’i üretme gerekçesi değildir.
- File metadata observation
- Missing identity evidence
- Mapping/context review
- No storage operation
- Evidence conclusion
- Reads=0; writes=0
- Response body üretilmedi
body=null kalır. Metadata’daki public display name, eksik principal için file bytes’ı consumer’a otomatik açmaz.
- File metadata observation
- Missing identity evidence
- Mapping/context review
- No accepted download
- Evidence conclusion
- Body=null
- Trusted context kaynağı istendi
Resource action için server identity binding ve owner policy evidence gerekir. Client’tan gelen isim veya attachment başlığı bu missing context’i doğrulayamaz.
- File metadata observation
- Missing principal known
- Mapping/context review
- Trusted binding evidence required
- Evidence conclusion
- No guessed permission
- Unknown ile hostile ayrımı korundu
Bilinen sonuç no I/O ve no body’dir; caller’ın gerçek identity veya permission sonucu bilinmez. Missing principal otomatik kötü niyet kanıtı değildir.
- File metadata observation
- Known: input missing
- Mapping/context review
- Known: not computed
- Evidence conclusion
- UNKNOWN: identity/permission
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Storage key’i uygulama üretsin, policy read’den önce çalışsın
Client filename’i storage identifier olarak yeniden kullanmak yerine uygulamanın onaylı key mapping’ini kullan. Bu örnekte üretilen sabit asset-02 key’i mevcut asset-01’den ayrıdır; exclusive creation mevcut bytes’ın overwrite edilmesini engeller. Download’da metadata owner kararı bytes okunmadan yapılır. Root check de policy’den ayrı bir storage responsibility’dir; başarılı authz yanlış mapping’i meşru hale getirmez.
Production’da identity evidence güvenilen server context’inden gelmeli. Sabit Alice alias’ı bunu test etmez. Upload acceptance, storage commit, metadata publish ve serving policy için failure/cleanup planı ayrıca gerekir. Bu artifact yalnız sıradan text ve sınırları belirlenmiş context kararları içindir. Reduced motion’da da consumer’ın body üretmeyen reddi ve tamamlanmış read/write count’ları kaybolmaz.
Header ve format politikasını regression’a dahil et
Declared upload type’ını byte formatına ilişkin tek kanıt sayma. İzinli formatın content validation’ını, byte budget’ını ve storage naming’ini birlikte kaydet. Download metadata’sı doğru media type ve güvenli, onaylı display name seçmelidir; recipient filename’i storage path gibi güvenilir bir talimat saymamalıdır. attachment davranışı authz yerine geçmez. Buradaki header check bir browser save veya general serializer testi değildir.
Kabul edilen upload, kabul edilen read, reddedilen read ve media mismatch nedeniyle reddedilen upload için beklenen I/O ve sonuçları ayrı yaz. Tanınmayan resource ile eksik principal’ı da ayır. Operation sayaçları, sonucu doğrulamak amacıyla yapılan okumaları içermez. Streaming limits, MIME sniffing, malware scan, object store consistency ve filesystem race koşulları bu local text profilinin dışında kalır. Bir kontrolün başarılı sonucu, bu ek sorumlulukların tamamlandığını göstermez.
ŞİMDİ VAKAYA UYGULA
Upload/download hangi gate’te I/O’ya ilerlememeli?
Application storage key üretir; display metadata ayrı kalır. Resource policy ve text profile negative branch’lerde reads/writes/body/header üretmez.
Vakadaki doğrulanmış actor, tenant ilişkisi ve requested action için gereken kararları ayır. Authentication veya proof başarısını object permission yerine kullanma.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Atlas text attachment sorumluluk kaydı
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"profile": {
"displayNames": [
"memo.txt",
"catalog.txt"
],
"declaredMedia": "text/plain",
"byteRange": [
1,
16
],
"contentValidation": "strict UTF-8 text",
"storageKeys": "application-generated opaque IDs",
"rootRule": "resolved parent equals own root; no nested dirs",
"ownerPolicy": "supplied Alice equals record owner; no real authentication"
},
"seed": {
"id": "asset-01",
"owner": "Alice",
"storageKey": "asset-01.dat",
"displayName": "memo.txt",
"bytesHex": "546561"
},
"inputs": {
"upload": {
"principal": "Alice",
"display": "catalog.txt",
"media": "text/plain",
"bytesHex": "546561"
},
"download": {
"principal": "Alice",
"resourceId": "asset-01"
},
"denied": {
"principal": "Bob",
"resourceId": "asset-01"
},
"media-mismatch": {
"principal": "Alice",
"display": "catalog.txt",
"media": "image/png",
"bytesHex": "546561"
}
},
"expected": {
"upload": {
"decision": "ACCEPT",
"reason": "stored-text",
"reads": 0,
"writes": 1,
"storedId": "asset-02",
"body": null,
"headers": null
},
"download": {
"decision": "ACCEPT",
"reason": "delivered-text",
"reads": 1,
"writes": 0,
"storedId": "asset-01",
"body": "Tea",
"headers": {
"Content-Type": "text/plain; charset=utf-8",
"Content-Disposition": "attachment; filename=\"memo.txt\""
}
},
"denied": {
"decision": "REJECT",
"reason": "resource-policy",
"reads": 0,
"writes": 0,
"storedId": null,
"body": null,
"headers": null
},
"media-mismatch": {
"decision": "REJECT",
"reason": "text-profile",
"reads": 0,
"writes": 0,
"storedId": null,
"body": null,
"headers": null
}
},
"missing": {
"principal": null,
"decision": "NOT-COMPUTED",
"reads": 0,
"writes": 0,
"body": null
}
}- seed / inputs
- Örneğe ait sıradan text ve sağlanan identity alias’ları; opaque ID/path/display ayrı tutulur.
- reads / writes
- İşlemin I/O sayacı; kanıtı kontrol etmek için yapılan okumalar ayrı tutulur.
- storedId / body
- Upload metadata’sı ile tamamlanmış download teslimi aynı değildir.
- headers
- Onaylı local response record; HTTP/browser çalıştırıldığını göstermez.
Örneğin otomatik temizlenen local text dosyaları ve sağlanan context’e dayalı, sınırları belirlenmiş policy; yürütülen Path.resolve/internal symlink işlemleri. HTTP/browser, gerçek identity/tenant, rastgele paths/traversal, OS race isolation, scan/cloud doğrulanmaz.
İki yanlış kanı
Opaque asset ID veya canonical path erişim iznidir.
ID/path resolution ile caller-resource policy ayrı kararlar verir.
Content-Type ve attachment, dosyanın bütün güvenlik özelliklerini kanıtlar.
Byte validation, storage policy, authorization ve alıcının dosyayı işlemesi farklı sınırlardır.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Bob asset-01’i istiyor, fakat record owner Alice. Download sırasında file okunur veya body hazırlanır mı?
- Hayır. reads=0, writes=0 ve body=null.
- Evet. Mevcut resource ID her principal için public download’dır.
Gerekçeli cevabı oku
Hayır. reads=0, writes=0 ve body=null. — resource-policy ret sonucu storage read’den önce uygulanır. Resource ID’yi bilmek download izni sağlamaz.
memo.txt display adı ile asset-01.dat storage key’i neden ayrı tutuluyor?
Dersten seçilen artifact alanları; öğretim örneği
- seed.id
- asset-01
- seed.storageKey
- asset-01.dat
- seed.displayName
- memo.txt
- expected.download.headers
- {"Content-Type":"text/plain; charset=utf-8","Content-Disposition":"attachment; filename=\"memo.txt\""}
- Content-Disposition içindeki filename bütün filesystem path’ini belirler.
- Display adı sunum içindir; storage key application tarafından belirlenir.
Gerekçeli cevabı oku
Display adı sunum içindir; storage key application tarafından belirlenir. — Attachment header memo.txt gösterir, backing key asset-01.dat kalır. Client display adı filesystem path yetkisi vermez.
Tea byte’ları image/png media etiketiyle gelince text-profile reddediyor. Content validation ve owner policy neden ayrı? Eksik principal’da ne olur?
Gerekçeli cevabı oku
Bu dar upload sözleşmesi text/plain, byte range ve strict UTF-8 ister. Uygun content bulunması principal’ın resource iznini sağlamaz. Storage key application tarafından üretilir ve root mapping ayrıca sınırlanır. Principal eksikse NOT-COMPUTED; read/write ve body yoktur. Bu text-only örnek bütün file type’ları veya gerçek authentication için güvenlik garantisi vermez.
□ Content doğrulaması ile owner iznini ayırdım.
□ Eksik principal’ı otomatik allow veya hostile attribution saymadım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- OWASP — File Upload Cheat SheetContent-Type Validation · Filename Safety · File Storage Location · User Permissions · Upload and Download Limits
- OWASP — Authorization Cheat SheetValidate the Permissions on Every Request · Enforce Authorization Checks on Static Resources · Ensure Lookup IDs are Not Accessible Even When Guessed or Cannot Be Tampered With
- Python — pathlibPath.resolve; symlink resolution and strict mode · PurePath.parent; lexical operation
- RFC 9110 — HTTP Semantics8.3 Content-Type
- RFC 6266 — Content-Disposition4.2 Disposition Type · 4.3 Disposition Parameter: Filename; advisory filenames