WEB / WEB-14.S04
Object, function ve property authorization
Note rename örneğinde capability, resource relationship ve writable/readable field kararlarını ayrı izle.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Title rename
- Note rename niyeti
Client note-A için title rename intent’ini hazırladı. Public read hakkı, aynı notu rename etme hakkı değildir.
- Atlas client
- Rename niyeti; title bekliyor
- Notes application
- Title=Tea & Bread; request yok
- Request hazır
Bilinen note ve context için request hazırlandı. Tablodaki policy sonuçları client’ın yetki beyanı değildir; server kararını temsil eder.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Title=Tea & Bread; request yok
- Request app’te
Request application’a ulaştı. Title hâlâ Tea & Bread’dir; function, object ve property kararları henüz tamamlanmadı.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Request geldi; Title=Tea & Bread
- Local function gate
Server notes.rename için açık function grant’i değerlendirir. Route adı veya UI’da görünen düğme bu kararın yerine geçmez.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Function izinli; Title=Tea & Bread
- Object ilişkisi kararı
Function gate geçti; server resource ilişkisini ve tenant context’ini değerlendirir. Bu karar tamamlanmadan title değişmez.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Object ilişkisi izinli; Title=Tea & Bread
- Title değişimi kabul
Bütün gerekli gate’ler geçti. Yalnız title, Bread & Tea olarak değiştirilir; owner, tenant ve publicationState aynı kalır.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Bütün gate’ler geçti; Title=Bread & Tea
- Result hazır
Kabul edilen dal için title-only response, reddedilen dal için protected body içermeyen yanıt hazırdır. Client henüz sonucu almamıştır.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Yanıt hazır; title=Bread & Tea
- Result client’ta
Yanıt client’a ulaştı. Title verisi yalnız kabul edilen dalda teslim edildi; ret, yeni title veya mutation başarısı gibi gösterilmez.
- Atlas client
- Yanıt geldi; title=Bread & Tea
- Notes application
- Yanıt hazır; title=Bread & Tea
Object reddi
- Note rename niyeti
Client note-A için title rename intent’ini hazırladı. Public read hakkı, aynı notu rename etme hakkı değildir.
- Atlas client
- Rename niyeti; title bekliyor
- Notes application
- Title=Tea & Bread; request yok
- Request hazır
Bilinen note ve context için request hazırlandı. Tablodaki policy sonuçları client’ın yetki beyanı değildir; server kararını temsil eder.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Title=Tea & Bread; request yok
- Request app’te
Request application’a ulaştı. Title hâlâ Tea & Bread’dir; function, object ve property kararları henüz tamamlanmadı.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Request geldi; Title=Tea & Bread
- Local function gate
Server notes.rename için açık function grant’i değerlendirir. Route adı veya UI’da görünen düğme bu kararın yerine geçmez.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Function izinli; Title=Tea & Bread
- Object ilişkisi kararı
Function gate geçti; server resource ilişkisini ve tenant context’ini değerlendirir. Bu karar tamamlanmadan title değişmez.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Object ilişkisi reddedildi; Title=Tea & Bread
- Title değişmedi
object gate’i reddettiği için title değişmez: Tea & Bread korunur. Bütün gerekli izinler sağlanmadan mutation veya protected response projection oluşturulmaz; başka bir gate’in olumlu olması bu ret sonucunu kaldırmaz.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Kabul koşulları sağlanmadı; Title=Tea & Bread
- Result hazır
Kabul edilen dal için title-only response, reddedilen dal için protected body içermeyen yanıt hazırdır. Client henüz sonucu almamıştır.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Yanıt hazır; protected body yok
- Result client’ta
Yanıt client’a ulaştı. Title verisi yalnız kabul edilen dalda teslim edildi; ret, yeni title veya mutation başarısı gibi gösterilmez.
- Atlas client
- Yanıt geldi; ret; body yok
- Notes application
- Yanıt hazır; protected body yok
Function reddi
- Note rename niyeti
Client note-A için title rename intent’ini hazırladı. Public read hakkı, aynı notu rename etme hakkı değildir.
- Atlas client
- Rename niyeti; title bekliyor
- Notes application
- Title=Tea & Bread; request yok
- Request hazır
Bilinen note ve context için request hazırlandı. Tablodaki policy sonuçları client’ın yetki beyanı değildir; server kararını temsil eder.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Title=Tea & Bread; request yok
- Request app’te
Request application’a ulaştı. Title hâlâ Tea & Bread’dir; function, object ve property kararları henüz tamamlanmadı.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Request geldi; Title=Tea & Bread
- Local function gate
Server notes.rename için açık function grant’i değerlendirir. Route adı veya UI’da görünen düğme bu kararın yerine geçmez.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Function reddedildi; Title=Tea & Bread
- Object ilişkisi kararı
Function reddedildiği için object gate çalışmaz. Title değiştirilmez; değerlendirilmemiş ilişki için allow sonucu üretilmez.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Object değerlendirilmedi; Title=Tea & Bread
- Title değişmedi
function gate’i reddettiği için title değişmez: Tea & Bread korunur. Bütün gerekli izinler sağlanmadan mutation veya protected response projection oluşturulmaz; başka bir gate’in olumlu olması bu ret sonucunu kaldırmaz.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Kabul koşulları sağlanmadı; Title=Tea & Bread
- Result hazır
Kabul edilen dal için title-only response, reddedilen dal için protected body içermeyen yanıt hazırdır. Client henüz sonucu almamıştır.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Yanıt hazır; protected body yok
- Result client’ta
Yanıt client’a ulaştı. Title verisi yalnız kabul edilen dalda teslim edildi; ret, yeni title veya mutation başarısı gibi gösterilmez.
- Atlas client
- Yanıt geldi; ret; body yok
- Notes application
- Yanıt hazır; protected body yok
Property reddi
- Note rename niyeti
Client note-A için title rename intent’ini hazırladı. Public read hakkı, aynı notu rename etme hakkı değildir.
- Atlas client
- Rename niyeti; title bekliyor
- Notes application
- Title=Tea & Bread; request yok
- Request hazır
Bilinen note ve context için request hazırlandı. Tablodaki policy sonuçları client’ın yetki beyanı değildir; server kararını temsil eder.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Title=Tea & Bread; request yok
- Request app’te
Request application’a ulaştı. Title hâlâ Tea & Bread’dir; function, object ve property kararları henüz tamamlanmadı.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Request geldi; Title=Tea & Bread
- Local function gate
Server notes.rename için açık function grant’i değerlendirir. Route adı veya UI’da görünen düğme bu kararın yerine geçmez.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Function izinli; Title=Tea & Bread
- Object ilişkisi kararı
Function gate geçti; server resource ilişkisini ve tenant context’ini değerlendirir. Bu karar tamamlanmadan title değişmez.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Object ilişkisi izinli; Title=Tea & Bread
- Title değişmedi
property gate’i reddettiği için title değişmez: Tea & Bread korunur. Bütün gerekli izinler sağlanmadan mutation veya protected response projection oluşturulmaz; başka bir gate’in olumlu olması bu ret sonucunu kaldırmaz.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Kabul koşulları sağlanmadı; Title=Tea & Bread
- Result hazır
Kabul edilen dal için title-only response, reddedilen dal için protected body içermeyen yanıt hazırdır. Client henüz sonucu almamıştır.
- Atlas client
- Rename request hazır; title sabit
- Notes application
- Yanıt hazır; protected body yok
- Result client’ta
Yanıt client’a ulaştı. Title verisi yalnız kabul edilen dalda teslim edildi; ret, yeni title veya mutation başarısı gibi gösterilmez.
- Atlas client
- Yanıt geldi; ret; body yok
- Notes application
- Yanıt hazır; protected body yok
ROLLER · STATE · VERİ AKIŞI
Hangi object üzerinde hangi işlem?
Duru, public note-A’nın Tea & Bread title’ını Bread & Tea yapmak ister. Public read policy notu okumaya izin verebilir; rename ise ayrı bir action’dır ve owner/tenant ilişkisi ister. Subject, object, action ve context server’ın güvenilen kaynaklarından birleştirilir. Client’ın object reference’ı yalnız hedefi seçer; yetki vermez. Object-level authorization, caller’ın istenen action’ı seçilen resource üzerinde yapıp yapamayacağını değerlendirir. IDOR/BOLA bu ilişkinin yeterince denetlenmemesini anlatır. Integer, UUID veya string seçmek permission sağlamaz; login olmak da note-A için gerekli ilişkiyi kurmaz. Artifact, izinli not ilişkisi ile object-denied sonucunu yan yana gösterir.
Function gate object gate’ten farklıdır
notes.rename function’ı, ürün policy’sinde açık bir grant ister. Function-level authorization bu business capability’nin actor’a açık olup olmadığını değerlendirir. Object gate ise capability kullanılırken seçilen resource ile actor’ın ilişkisini kontrol eder. Admin görünümlü URL, hidden button veya route adı bu karar değildir. Bir role function grant verebilir ama bütün tenant object’lerine erişim vermek zorunda değildir. Function-denied satırında objectRelation=true olsa da action capability yoktur. Server, ilgili her request’te bu kararları uygular. Ortak policy module tutarlılığa yardımcı olur; client context’ini trusted kabul etme hatasını düzeltmez. Actor veya policy kanıtı eksikse ret verilir; eksik kanıt kötü niyetin kanıtı değildir.
Property sınırı iki yönde yürür
Object ve function izinlerinin geçmesi, caller’ın her property’yi okuyup değiştirebileceği anlamına gelmez. Atlas rename input’unu yalnız title alanına map eder; owner, tenant ve publicationState server tarafından yönetilen context/workflow alanlarıdır. Type/schema validation, title’ın string olduğunu söyler; publication state’i değiştirme yetkisi vermez. Mass assignment, generic input binding’in izin verilmeyen internal alanları da business object’e taşımasıyla bu sınırı bozar. Property authorization ve açık input projection birlikte uygulanır. Read tarafında da bütün object’i serialize etmek yerine bu response için izinli alanlar seçilir. Property-denied dalında body ve mutation oluşmaz. Gerçek uygulamada transaction, concurrency ve side effect’ler aynı karar sınırını korumalıdır.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Function deny
- Rename operation kapsamı seçildi
Duru tenant-A içindeki note-A başlığını Bread & Tea yapmak ister. Public visibility veya object ownership bu write operation’ın bütün gate’lerini otomatik geçirmez.
- Rename context
- case=function-denied
- Permission gates
- Gate değerlendirilmedi
- Record/projection boundary
- Title: Tea & Bread
- Function ve object ilişkisi ayrıldı
Object relation true’dur, fakat functionGrant=false’tur. Own note üzerinde işlem seçebilmek notes.rename capability’si vermez.
- Rename context
- case=function-denied
- Permission gates
- Function=false; object=true
- Record/projection boundary
- Title: Tea & Bread
- Property sınırı ayrı okundu
propertyGrant=true olsa da failed function gate’i telafi edilmez. Title’ın writable field olması function capability’nin kendisi değildir.
- Rename context
- case=function-denied
- Permission gates
- Property=true; function failed
- Record/projection boundary
- Title: Tea & Bread
- Bütün gate’ler commit’ten önce uygulandı
mutationAfterAllGates policy’si nedeniyle expectedAccepted=false olur. Failed gate hangi katmanda olursa olsun title değişimi bu branch’te uygulanmaz.
- Rename context
- case=function-denied
- Permission gates
- Accepted=false
- Record/projection boundary
- Mutation=false; Tea & Bread
- Body ve delivery durduruldu
expectedBody=null ve expectedDelivery=false korunur. Küçük bir denial body, daha önce yapılmış side effect’i geri alıyor diye gösterilmez; burada mutation baştan yoktur.
- Rename context
- case=function-denied
- Permission gates
- Decision denied
- Record/projection boundary
- Body=null; delivery=false
- Public read write yetkisine dönüşmedi
Notun public ve Duru’ya ait olması bu olumsuz gate’i ortadan kaldırmaz. Function/object/property üç ayrı sorudur; UI’da düğmenin görünmesi veya gizlenmesi server kararına ek authority vermez.
- Rename context
- case=function-denied
- Permission gates
- Function denial
- Record/projection boundary
- Title unchanged; no body/delivery
Property deny
- Rename operation kapsamı seçildi
Duru tenant-A içindeki note-A başlığını Bread & Tea yapmak ister. Public visibility veya object ownership bu write operation’ın bütün gate’lerini otomatik geçirmez.
- Rename context
- case=property-denied
- Permission gates
- Gate değerlendirilmedi
- Record/projection boundary
- Title: Tea & Bread
- Function ve object ilişkisi ayrıldı
Function grant ve object relation true’dur. Bu iki olumlu gate, istenen property set için ayrı write/read permission kararını kaldırmaz.
- Rename context
- case=property-denied
- Permission gates
- Function=true; object=true
- Record/projection boundary
- Title: Tea & Bread
- Property sınırı ayrı okundu
propertyGrant=false olduğundan mutation ve response projection durur. JSON type veya ORM binding, property authorization sonucu üretmez.
- Rename context
- case=property-denied
- Permission gates
- Property=false
- Record/projection boundary
- Title: Tea & Bread
- Bütün gate’ler commit’ten önce uygulandı
mutationAfterAllGates policy’si nedeniyle expectedAccepted=false olur. Failed gate hangi katmanda olursa olsun title değişimi bu branch’te uygulanmaz.
- Rename context
- case=property-denied
- Permission gates
- Accepted=false
- Record/projection boundary
- Mutation=false; Tea & Bread
- Body ve delivery durduruldu
expectedBody=null ve expectedDelivery=false korunur. Küçük bir denial body, daha önce yapılmış side effect’i geri alıyor diye gösterilmez; burada mutation baştan yoktur.
- Rename context
- case=property-denied
- Permission gates
- Decision denied
- Record/projection boundary
- Body=null; delivery=false
- Public read write yetkisine dönüşmedi
Notun public ve Duru’ya ait olması bu olumsuz gate’i ortadan kaldırmaz. Function/object/property üç ayrı sorudur; UI’da düğmenin görünmesi veya gizlenmesi server kararına ek authority vermez.
- Rename context
- case=property-denied
- Permission gates
- Property denial
- Record/projection boundary
- Title unchanged; no body/delivery
VARSAYIM · SINIR · KONTROL
Reference ve capability’ye gereğinden çok anlam vermek
Normal function call, bilinen note seçimini ve authenticated context’i server’a taşır. Bozulan varsayım, function’ı kullanma hakkının seçilen object üzerindeki bütün action’ları kapsadığıdır. Resource ilişkisi veya tenant scope ilgili action’da değerlendirilmezse read, rename ya da başka business action’ın sınırı genişleyebilir. Public title’ı okumak public rename yetkisi değildir; UUID’nin zor bilinmesi de policy kontrolünü tamamlamaz. Object-denied dalı, functionGrant=true olmasına rağmen title’ı değiştirmez. Function-denied dalı ise actor’a ait object için capability yokluğunu ayırır. İki gate’in de action’a bağlı server policy ve güvenilir resource context ile uygulanması gerekir.
Allowed object’ın bütün alanlarına güvenmek
Normal rename yalnız değiştirilebilir title’ı taşır. Object ownership, server’ın yönettiği publishing state’i değiştirme hakkı vermez. Bozulan varsayım, validated JSON veya ORM modelinin kendiliğinden authorized property map olduğu düşüncesidir. Yasak input alanlarının internal state’e bind edilmesi ya da response’un izinli read projection dışına genişlemesi bu sınırı bozar. Etki, yanlış publication state veya gereksiz property disclosure olabilir. Property-denied satırında bütün gate sonuçları görünür kalırken write ve protected response body oluşmaz. Closed input fields, actor/action’a bağlı write allowlist ve açık read DTO birbirini tamamlar. Denial body’sini küçük tutmak, daha önce oluşmuş transaction side effect’lerini tek başına geri almaz.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Title projection
- Normal rename evidence seçildi
Normal satırda functionGrant, objectRelation ve propertyGrant true’dur. Review yalnız allow boolean’ını değil, accepted command ve returned field set’ini birlikte okur.
- Permission observation
- Normal rename row
- Projection/context review
- Projection incelenmedi
- Evidence conclusion
- State sonucu incelenmedi
- Write field allowlist okundu
inputWritableFields yalnız title içerir. Owner, tenant ve publicationState server-owned alanlardır; client title girdisinin yanında otomatik editable hâle gelmezler.
- Permission observation
- Input: title only
- Projection/context review
- Owner/tenant/workflow not writable
- Evidence conclusion
- State sonucu incelenmedi
- Command projection karşılaştırıldı
Input ve command projection title=Bread & Tea taşır. Schema type veya model alan listesi yerine bu operation’ın permitted write fields’i esas alınır.
- Permission observation
- Input: title only
- Projection/context review
- Command: title=Bread & Tea
- Evidence conclusion
- State sonucu incelenmedi
- Response read projection ayrıldı
responseReadableFields ve response projection yalnız title taşır. Write edilen alan ile bütün object body’sini dışarı vermek aynı permission kararı değildir.
- Permission observation
- Input: title only
- Projection/context review
- Response: title only
- Evidence conclusion
- Owner/tenant response dışında
- Unchanged context karşılaştırıldı
ownerAfter=Duru, tenantAfter=tenant-A ve publicationStateAfter=published korunur. Başlık mutation’ı bu authoritative context alanlarına yayılmamıştır.
- Permission observation
- Mutation: title changed
- Projection/context review
- Owner/tenant/workflow retained
- Evidence conclusion
- Projection scope uyumlu
- Projection kanıtı kapsamlandı
Bu ledger title rename ve field projection sonucunu gösterir. Gerçek ORM, transaction concurrency veya bütün tenant handlers için enforcement kanıtı eklenmez.
- Permission observation
- Known: title rename
- Projection/context review
- Known: limited command/response
- Evidence conclusion
- Runtime enforcement ayrı evidence
Context eksik
- Unknown-evidence satırı seçildi
actorMissing=true ve policyMissing=true satırı trusted authorization context’in eksik olduğunu gösterir. Object’in note-A olarak bilinmesi bu eksikliği tamamlamaz.
- Permission observation
- Actor/policy missing
- Projection/context review
- Gate evidence eksik
- Evidence conclusion
- Sonuç incelenmedi
- Eksik ile false gate ayrıldı
Bir functionGrant=false satırı bilinen policy denial’dır. Burada actor veya policy çözülememiştir; unknown evidence known hostile action olarak sunulmaz.
- Permission observation
- Actor/policy missing
- Projection/context review
- Insufficient evidence
- Evidence conclusion
- Attribution bilinmiyor
- Deny-default kararı korundu
expectedAccepted=false missing context’te processing’i durdurur. Unpredictable ID, public title veya UI’daki rol metni trusted actor/policy input’u yerine kullanılmaz.
- Permission observation
- Actor/policy missing
- Projection/context review
- Accepted=false
- Evidence conclusion
- Attribution bilinmiyor
- Mutation ve body alanı okundu
expectedMutation=false ve expectedBody=null olumsuz veri sınırıdır. Bu kayıt sırf eksik telemetry var diye izin üretmez; aynı zamanda gerçekleşmiş bir saldırı icat etmez.
- Permission observation
- Actor/policy missing
- Projection/context review
- No mutation; body=null
- Evidence conclusion
- No acceptance evidence
- Correlation için doğru kaynak istendi
Aynı actor, operation, resource scope ve policy revision için trusted karar kaydı gerekir. Raw bearer token veya tüm object body’sini log’a eklemek bu boşluğu çözmez.
- Permission observation
- Missing context
- Projection/context review
- Trusted decision evidence required
- Evidence conclusion
- UNKNOWN: policy evaluation
- Missing context hükmü sınırlandı
Bilinen karar no acceptance ve no mutation’dır. Hangi gerçek grant’in karşılanıp karşılanmadığı ve hostile attribution bilinmez; source evidence gelene kadar ayrı tutulur.
- Permission observation
- Known: context missing
- Projection/context review
- Known: mutation/body withheld
- Evidence conclusion
- UNKNOWN: grant/attribution
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Üç gate’in kanıtını aynı action’a bağla
Audit context; actor/session validation referansı, policy revision, business operation, resource/tenant, function grant, object ilişkisi ve property set kararını ayrı tutar. Raw bearer token veya bütün body yerine izinli field adları ve reason code’lar yeterli olabilir. Baseline, Duru’nun kendi public notunda title rename yapmasıdır; diğer üç satır farklı ret koşullarını gösterir. 403 veya 404 seçimi ürünün information-disclosure policy’sine bağlıdır; tek başına hangi gate’in çalıştığını anlatmaz. Correlation, server kararını commit ve response projection ile bağlamalıdır. Eksik telemetry saldırının başarısızlığı demek değildir. Unknown-evidence satırı kabulü durdurur; gözlenmeyen bir hostile action çıkarımı yapmaz. Bu karar tablosu gerçek endpoint veya database audit’i değildir.
Permission regression state sonuçlarını da ölçer
Regression’da yalnız allow/deny return value değil, title’ın önceki ve sonraki değeri de karşılaştırılır. Owner, tenant ve publicationState korunmalı; response yalnız izinli key’leri taşımalı; reddedilen dal protected body veya delivery üretmemelidir. Role veya policy version değişince object ilişkisi yeniden değerlendirilir; read ve write field grant’leri aynı varsayılmaz. Server command DTO’su kabul edilen title’ı internal context’ten ayırır; body alanlarını doğrudan model’e yaymaz. Authorization ile mutation arasında resource version veya ilişki değişebiliyorsa concurrency/transaction tasarımı ayrıca gerekir. Local object projection, ORM veya persistence transaction güvenliğini kanıtlamaz. Aynı context, ilgili handler ve asynchronous iş boyunca korunmalıdır.
ŞİMDİ VAKAYA UYGULA
Own object üzerinde function ve property izni nasıl ayrılır?
Tea & Bread başlığını değiştirmek function, object relation ve property policy ister. Accepted command ve response alanları server-owned context’ten ayrılır.
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
Üç permission gate defteri
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"profile": {
"actor": "Duru",
"tenant": "tenant-A",
"operation": "rename-own-note",
"authenticatedDeclared": true,
"expectedFunction": "notes.rename",
"note": {
"id": "note-A",
"owner": "Duru",
"tenant": "tenant-A",
"title": "Tea & Bread",
"visibility": "public",
"publicationState": "published"
},
"desiredTitle": "Bread & Tea",
"inputWritableFields": [
"title"
],
"responseReadableFields": [
"title"
],
"actualEndpoint": false,
"actualStore": false,
"actualNetwork": false
},
"rows": [
{
"case": "normal",
"functionGrant": true,
"objectRelation": true,
"propertyGrant": true,
"expectedAccepted": true,
"expectedMutation": true,
"expectedAfterTitle": "Bread & Tea",
"expectedBody": {
"title": "Bread & Tea"
},
"expectedDelivery": true
},
{
"case": "object-denied",
"functionGrant": true,
"objectRelation": false,
"propertyGrant": true,
"expectedAccepted": false,
"expectedMutation": false,
"expectedAfterTitle": "Tea & Bread",
"expectedBody": null,
"expectedDelivery": false
},
{
"case": "function-denied",
"functionGrant": false,
"objectRelation": true,
"propertyGrant": true,
"expectedAccepted": false,
"expectedMutation": false,
"expectedAfterTitle": "Tea & Bread",
"expectedBody": null,
"expectedDelivery": false
},
{
"case": "property-denied",
"functionGrant": true,
"objectRelation": true,
"propertyGrant": false,
"expectedAccepted": false,
"expectedMutation": false,
"expectedAfterTitle": "Tea & Bread",
"expectedBody": null,
"expectedDelivery": false
}
],
"policy": {
"denyDefault": true,
"functionRequiresExplicitGrant": true,
"objectRequiresActorTenantAndRelationship": true,
"propertyRequiresAllowedWriteAndReadProjection": true,
"mutationAfterAllGates": true,
"publicReadDoesNotGrantRename": true
},
"fieldLedger": [
{
"field": "title",
"input": "caller-provided ordinary string with type/length validation",
"writeAllowed": true,
"responseAllowed": true
},
{
"field": "owner",
"input": "server-owned relationship context",
"writeAllowed": false,
"responseAllowed": false
},
{
"field": "tenant",
"input": "server-owned resource scope",
"writeAllowed": false,
"responseAllowed": false
},
{
"field": "publicationState",
"input": "server-owned publishing workflow state",
"writeAllowed": false,
"responseAllowed": false
}
],
"projections": {
"input": {
"title": "Bread & Tea"
},
"command": {
"title": "Bread & Tea"
},
"response": {
"title": "Bread & Tea"
},
"ownerAfter": "Duru",
"tenantAfter": "tenant-A",
"publicationStateAfter": "published"
},
"unknownEvidence": {
"actorMissing": true,
"policyMissing": true,
"expectedAccepted": false,
"expectedMutation": false,
"expectedBody": null,
"attribution": "insufficient evidence; not automatic hostile activity"
},
"boundaries": {
"unguessableIDGrantsAccess": false,
"publicReadGrantsWrite": false,
"UIHiddenFunctionProtected": false,
"schemaTypeAloneGrantsProperty": false,
"ORMBindingIsAuthorization": false
}
}- profile
- Known actor/action ve public note başlangıcı.
- rows
- Independent function/object/property sonuçları.
- fieldLedger
- Write/read ve server-owned alan sınıfları.
- projections
- Explicit title command/response; context korunur.
- unknownEvidence
- Eksik kanıt deny; attack attribution değil.
Supplied policy sonuçları ve ordinary public note projection; endpoint, ID enumeration, ORM veya database transaction çalışmaz.
İki yanlış kanı
UUID object-level authorization yerine geçer.
Reference selection permission değildir; action ve resource relation server’da değerlendirilir.
Schema-valid input bütün object property’lerine map edilebilir.
Type validity, property write/read permission ve server-owned context ayrıdı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.
Duru kendi note’una erişiyor ve title alanı writable, fakat functionGrant=false. Rename yapılır mı?
- Evet. Object owner olmak bütün function’lara izin verir.
- Hayır. Mutation yok; eski Tea & Bread korunur.
Gerekçeli cevabı oku
Hayır. Mutation yok; eski Tea & Bread korunur. — function-denied satırı objectRelation=true ve propertyGrant=true olsa da expectedAccepted=false verir. Diğer izinler eksik function grant’i tamamlamaz.
Accepted rename command neden yalnız title taşıyor; owner ve tenant neden değişmiyor?
Dersten seçilen artifact alanları; öğretim örneği
- fieldLedger[0]
- {"field":"title","input":"caller-provided ordinary string with type/length validation","writeAllowed":true,"responseAllowed":true}
- fieldLedger[1]
- {"field":"owner","input":"server-owned relationship context","writeAllowed":false,"responseAllowed":false}
- fieldLedger[2]
- {"field":"tenant","input":"server-owned resource scope","writeAllowed":false,"responseAllowed":false}
- projections
- {"input":{"title":"Bread & Tea"},"command":{"title":"Bread & Tea"},"response":{"title":"Bread & Tea"},"ownerAfter":"Duru","tenantAfter":"tenant-A","publicationStateAfter":"published"}
- Title projection izinli; owner ve tenant server-owned context.
- Schema’da string olan bütün property’ler otomatik yazılabilir.
Gerekçeli cevabı oku
Title projection izinli; owner ve tenant server-owned context. — Field ledger yalnız title için write/read projection’a izin verir. Command ve response sadece bu alanı taşır; ownerAfter ve tenantAfter korunur.
Actor ve policy kanıtı eksikse expectedMutation=false ve expectedBody=null. Neden bunu hostile activity kanıtı veya ID güvenliği diye yorumlayamayız?
Gerekçeli cevabı oku
Gerekli actor/policy bağları kurulamadığı için mutation ve delivery durur. Bu, eksik girdinin hostile olduğunun kanıtı değildir. Object ID’nin tahmin edilememesi de function/object/property authorization yerine geçmez. UI’da gizlenen function server kontrolü sayılmaz. Bu artifact, örnekte verilen policy sonuçlarını açıklar; gerçek endpoint veya store enforcement testi değildir.
□ Eksik evidence’ı hostile activity diye sınıflandırmadım.
□ ID veya UI görünürlüğünü authorization yerine koymadım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- OWASP API1:2023 — Broken Object Level AuthorizationIs the API Vulnerable?: requested action on requested object; object versus function distinction; How To Prevent: per-record policy checks
- OWASP API3:2023 — Broken Object Property Level AuthorizationIs the API Vulnerable?: read/write properties; How To Prevent: explicit property selection, avoid generic input binding, update allowlist and response schema
- OWASP API5:2023 — Broken Function Level AuthorizationIs the API Vulnerable?: business function not inferred from path; How To Prevent: explicit function grants and shared deny-default enforcement
- OWASP Authorization Cheat SheetRecommendations: Enforce Least Privileges; Deny by Default; Validate the Permissions on Every Request; attribute/relationship context