Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-16.S03

Paths, upload ve download authorization

Display name, stored key, owner policy ve response body’nin ayrı sahiplerini izle.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Upload kabul

  1. 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
  2. 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
  3. 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
  4. 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
  5. İş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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. İş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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. İş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
  6. 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ığı

  1. 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
  2. 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
  3. 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
  4. 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
  5. İş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
  6. 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ı

  1. İ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
  2. 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
  3. İ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
  4. 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
  5. 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
  6. 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

  1. İ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
  2. 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
  3. İ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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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ı?

  1. Hayır. reads=0, writes=0 ve body=null.
  2. 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\""}
  1. Content-Disposition içindeki filename bütün filesystem path’ini belirler.
  2. 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