WEB / WEB-11.S01
CSRF, ambient credentials ve action intent
Authenticated request neden kullanıcı intent’inin veya object permission’ın tek kanıtı değildir?
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Amaçlı action
- UI seçimi
Duru reading-view-A’yı list’ten cards’a geçirmek ister. Session, bound token ve Atlas exact-origin koşulları verilen girdilerdir; henüz POST hazırlanmadı, server record list kaldı. Gerçek cookie veya action çalışmaz.
- Browser UI
- View=list; action pending
- Atlas action gate
- Record=list; request yok
- Request hazır
Session/token yalnız declared validation aliases’tır; fixed POST envelope data olarak hazırlanır.
- Browser UI
- Save-view request ready
- Atlas action gate
- Record=list; request yok
- Request gate’e vardı
Hazırlanan request server’a ulaştı; credentials’ın bulunması action intent’in onaylandığı anlamına gelmez.
- Browser UI
- Save-view request ready
- Atlas action gate
- Request arrived; record=list
- Local provenance gate
Token/session binding, exact source origin ve metadata policy local olarak ayrı değerlendirilir.
- Browser UI
- Save-view request ready
- Atlas action gate
- Provenance accepted; record=list
- Local action permission
Provenance geçse bile tenant/object/action permission ayrı kontrol edilir; yalnız accepted row state değiştirir.
- Browser UI
- Save-view request ready
- Atlas action gate
- Record=cards; accepted response ready
- Response UI’da
Seçilen accepted/denied action result browser’a ulaştı. UI hâlâ list’tir; response receipt, sonucunun yorumlanması veya başarılı action ile eşit değildir.
- Browser UI
- Result arrived; view=list
- Atlas action gate
- Record=cards; accepted response ready
- Local UI sonucu
Provenance ve ayrı action permission geçti; reading-view record cards oldu. UI accepted sonucu response receipt sonrasında yorumlar; gerçek endpoint action’ı çalıştırılmış değildir.
- Browser UI
- View=cards; confirmed
- Atlas action gate
- Record=cards; accepted response ready
Token eksik
- UI seçimi
Duru cards seçer; session valid ve source origin Atlas’tır, fakat tokenPresent false’tur. Henüz server bu girdileri almamıştır; list state’i ve action pending durumu korunur.
- Browser UI
- View=list; action pending
- Atlas action gate
- Record=list; request yok
- Request hazır
Session/token yalnız declared validation aliases’tır; fixed POST envelope data olarak hazırlanır.
- Browser UI
- Save-view request ready
- Atlas action gate
- Record=list; request yok
- Request gate’e vardı
Hazırlanan request server’a ulaştı; credentials’ın bulunması action intent’in onaylandığı anlamına gelmez.
- Browser UI
- Save-view request ready
- Atlas action gate
- Request arrived; record=list
- Local provenance gate
Token/session binding, exact source origin ve metadata policy local olarak ayrı değerlendirilir.
- Browser UI
- Save-view request ready
- Atlas action gate
- Provenance denied; record=list
- Local action permission
Provenance reddi accepted=false sonucunu hazırlar; reading-view record list kalır ve action mutation yapılmaz. Bu daldan ayrıca object permission’ın geçtiği veya reddedildiği sonucu çıkarılmaz.
- Browser UI
- Save-view request ready
- Atlas action gate
- Record=list; denied response ready
- Response UI’da
Seçilen accepted/denied action result browser’a ulaştı. UI hâlâ list’tir; response receipt, sonucunun yorumlanması veya başarılı action ile eşit değildir.
- Browser UI
- Result arrived; view=list
- Atlas action gate
- Record=list; denied response ready
- Local UI sonucu
Token bulunmadığı için provenance reddedildi; record ve UI list kaldı. Bu sonuç session invalid veya object permission denial kanıtı değildir; action mutation yapılmadı.
- Browser UI
- View=list; unchanged
- Atlas action gate
- Record=list; denied response ready
Sibling origin
- UI seçimi
Duru cards seçer; token bound’dur, fakat sourceOrigin notes.example.org, target Atlas origin’inden farklıdır. Same-site metadata exact-origin eşleşmesi değildir; henüz server kararı yoktur.
- Browser UI
- View=list; action pending
- Atlas action gate
- Record=list; request yok
- Request hazır
Session/token yalnız declared validation aliases’tır; fixed POST envelope data olarak hazırlanır.
- Browser UI
- Save-view request ready
- Atlas action gate
- Record=list; request yok
- Request gate’e vardı
Hazırlanan request server’a ulaştı; credentials’ın bulunması action intent’in onaylandığı anlamına gelmez.
- Browser UI
- Save-view request ready
- Atlas action gate
- Request arrived; record=list
- Local provenance gate
Token/session binding, exact source origin ve metadata policy local olarak ayrı değerlendirilir.
- Browser UI
- Save-view request ready
- Atlas action gate
- Provenance denied; record=list
- Local action permission
Provenance reddi accepted=false sonucunu hazırlar; reading-view record list kalır ve action mutation yapılmaz. Bu daldan ayrıca object permission’ın geçtiği veya reddedildiği sonucu çıkarılmaz.
- Browser UI
- Save-view request ready
- Atlas action gate
- Record=list; denied response ready
- Response UI’da
Seçilen accepted/denied action result browser’a ulaştı. UI hâlâ list’tir; response receipt, sonucunun yorumlanması veya başarılı action ile eşit değildir.
- Browser UI
- Result arrived; view=list
- Atlas action gate
- Record=list; denied response ready
- Local UI sonucu
notes.example.org aynı site içinde olsa da exact Atlas origin’i değildir; provenance reddedildi. Record ve UI list kaldı, action mutation yapılmadı. Token binding bu origin koşulunu kaldırmaz.
- Browser UI
- View=list; unchanged
- Atlas action gate
- Record=list; denied response ready
Yetki reddi
- UI seçimi
Duru cards seçer; session, bound token ve exact origin koşulları olumludur. Object tenant-B’dedir ve actionAuthorized false’tur; server bu ayrı permission kararını request receipt sonrası verir.
- Browser UI
- View=list; action pending
- Atlas action gate
- Record=list; request yok
- Request hazır
Session/token yalnız declared validation aliases’tır; fixed POST envelope data olarak hazırlanır.
- Browser UI
- Save-view request ready
- Atlas action gate
- Record=list; request yok
- Request gate’e vardı
Hazırlanan request server’a ulaştı; credentials’ın bulunması action intent’in onaylandığı anlamına gelmez.
- Browser UI
- Save-view request ready
- Atlas action gate
- Request arrived; record=list
- Local provenance gate
Token/session binding, exact source origin ve metadata policy local olarak ayrı değerlendirilir.
- Browser UI
- Save-view request ready
- Atlas action gate
- Provenance accepted; record=list
- Local action permission
Provenance geçse bile tenant/object/action permission ayrı kontrol edilir; yalnız accepted row state değiştirir.
- Browser UI
- Save-view request ready
- Atlas action gate
- Record=list; denied response ready
- Response UI’da
Seçilen accepted/denied action result browser’a ulaştı. UI hâlâ list’tir; response receipt, sonucunun yorumlanması veya başarılı action ile eşit değildir.
- Browser UI
- Result arrived; view=list
- Atlas action gate
- Record=list; denied response ready
- Local UI sonucu
Provenance geçti, fakat tenant-B object’i için actionAuthorized false olduğu için ayrı action kararı reddedildi. Record ve UI list kaldı; bunu token veya Origin ret nedeni olarak sınıflama.
- Browser UI
- View=list; unchanged
- Atlas action gate
- Record=list; denied response ready
ROLLER · STATE · VERİ AKIŞI
Ambient identity action intent değildir
Atlas’ta Duru reading view’ünü list’ten cards’a kaydeder. Session cookie eligible request’e browser tarafından eklenebilir; bu ambient credential kullanıcı adına taşınır, ama request’in Duru’nun amaçladığı UI işleminden doğduğunu tek başına göstermez. Cookie eligibility domain/path, scheme/Secure, SameSite, request credentials mode ve browser storage policy gibi ayrı koşullara bağlıdır; bütün cross-origin request’lerin cookie taşıdığı genellenmez. HttpOnly JavaScript’in cookie okumasını sınırlar, eligible request’te cookie gönderilmesini durdurmaz. CSRF’nin temel sorusu authenticated context içindeki state change için beklenen request provenance’ın ve action intent bağının nasıl kurulduğudur; server authn ve object/action authz bu sorudan ayrı kalır.
Token, Origin ve metadata farklı evidence taşır
save-reading-view policy’si, session-bound synchronizer token’ın doğrulanmasını ister. Ledger yalnız token-present ve token-bound boolean’larını gösterir; gerçek secret üretmez. Server token’ın authenticated session ile bağlı olduğunu doğrulamalıdır. Signed double-submit kullanılıyorsa imza kadar session binding de önemlidir; token URL veya log’a konmaz. Origin’in exact scheme/host/port karşılaştırması browser source context’ini anlatır; opaque null veya missing origin same-origin kanıtı değildir. Güvenilen target origin server configuration’dan gelir, rastgele forwarded header’dan değil. Fetch Metadata same-origin/same-site/cross-site/none ilişkisini bildirir; invalid veya unavailable alan için compatibility ve fallback policy açık olmalıdır. Atlas policy’si token ve exact origin ister. Metadata yoksa aynı token+origin yolunu kabul eder, known cross-site state change’i reddeder.
SameSite, origin ve business action’ı ayır
SameSite schemeful site ilişkisidir; https://notes.example.org ile https://atlas.example.org aynı site içinde farklı origin olabilir. Strict/Lax cookie bu sibling-origin’i otomatik trusted actor yapmaz. Explicit Lax cross-site top-level safe navigation’a izin verebilir, cross-site fetch veya POST için aynı karar verilmez; bazı browser default-Lax grace davranışları explicit Lax ile eşitlenmez. None Secure gerektirir, third-party policy yine etkili olabilir. GET/HEAD gibi safe method’lar application state değişimine bağlanmamalıdır. Provenance gate geçtikten sonra server Duru’nun tenant/object için save-reading-view yetkisini ayrıca değerlendirir; hassas action için açık confirmation/reauthentication transaction bağını güçlendirebilir, fakat bir header gerçek insanın niyetini matematiksel olarak kanıtlamaz.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Token ve origin
- Normal action niyeti
Normal satır sessionValid true, tokenPresent/tokenBound true ve Atlas sourceOrigin taşıyor. Reading-view-A tenant-A içindeki normal cards isteği; token değeri yalnız secret olmayan alias.
- Request decision ledger
- Normal session/token/origin/action accepted
- Provenance ve yetki
- Henüz değerlendirilmedi
- Reading-view sonucu
- Henüz değerlendirilmedi
- Credential yeterli değil
Token-missing satırı geçerli session ve action permission taşısa da provenance false. Browser’ın credential taşıması trusted UI intent’i veya session-bound validation’ın yerine geçmiyor.
- Request decision ledger
- Normal session/token/origin/action accepted
- Provenance ve yetki
- Valid session / missing token / provenance false
- Reading-view sonucu
- Henüz değerlendirilmedi
- State’i koru
Token-missing için expectedAccepted false ve expectedAfter list. Model action’ı uygulamıyor; session’ın varlığından cards başarısı üretilmiyor.
- Request decision ledger
- Normal session/token/origin/action accepted
- Provenance ve yetki
- Valid session / missing token / provenance false
- Reading-view sonucu
- Token missing / list retained
- Same-site origin farkı
Sibling-origin notes.example.org ve metadata same-site kullanıyor. Token bağlı olsa da exact Atlas origin’ine eşit değil; same-site classification trusted origin’e dönüşmüyor.
- Request decision ledger
- Same-site sibling / exact origin false
- Provenance ve yetki
- Valid session / missing token / provenance false
- Reading-view sonucu
- Token missing / list retained
- Policy’nin dar işi
Exact origin ve bağlı token provenance kararına katılır. Metadata insanın intent’ini kesin kanıtlamaz; CORS read denial da server’ın request almadığı sonucunu sağlamaz.
- Request decision ledger
- Same-site sibling / exact origin false
- Provenance ve yetki
- Provenance gate ≠ human intent proof
- Reading-view sonucu
- Token missing / list retained
- Reddin kapsamı
İki provenance rejection list state’ini korur. Gerçek cookie, token veya action burada çalışmıyor; sonucu session invalid ya da tenant denial diye başka gate’e taşımıyoruz.
- Request decision ledger
- Same-site sibling / exact origin false
- Provenance ve yetki
- Provenance gate ≠ human intent proof
- Reading-view sonucu
- Missing-token/sibling-origin → unchanged list
Action yetkisi
- Provenance olumlu
Permission-denied session, token ve exact origin kontrollerini geçiyor. expectedProvenance true; bu branch token failure değil, ayrı action/object kararına gidiyor.
- Request decision ledger
- Valid provenance / permission review pending
- Provenance ve yetki
- Henüz değerlendirilmedi
- Reading-view sonucu
- Henüz değerlendirilmedi
- Tenant ve action bağı
ObjectTenant tenant-B, Duru’nun context’i tenant-A ve actionAuthorized false. Provenance başarısı bu object’e işlem izni vermiyor.
- Request decision ledger
- Valid provenance / permission review pending
- Provenance ve yetki
- tenant-B ≠ tenant-A / action false
- Reading-view sonucu
- Henüz değerlendirilmedi
- Aynı unchanged sonuç
ExpectedAfter yine list, fakat nedeni token-missing’den farklı. Yalnız visible before/after veya generic status görmek reddin hangi gate’e ait olduğunu açıklamayabilir.
- Request decision ledger
- Valid provenance / permission review pending
- Provenance ve yetki
- tenant-B ≠ tenant-A / action false
- Reading-view sonucu
- Permission denied / list retained
- Cookie eligibility ayrımı
Explicit SameSite tablosunda Lax same-site POST’e izin verebilir, cross-site unsafe POST’e vermez. SameSite cookie kararı action authorization veya exact origin kararı değildir.
- Request decision ledger
- Cookie inclusion ≠ action permission
- Provenance ve yetki
- tenant-B ≠ tenant-A / action false
- Reading-view sonucu
- Permission denied / list retained
- HttpOnly görevini koru
HttpOnly eligible cookie’nin browser tarafından taşınmasını engellemez. Secure, SameSite, credentials ve server action policy farklı soruları yanıtlar; bir flag bütün intent kontrollerini sağlamaz.
- Request decision ledger
- Cookie inclusion ≠ action permission
- Provenance ve yetki
- Separate cookie/provenance/object decisions
- Reading-view sonucu
- Permission denied / list retained
- Etkiyi dar tut
Normal cards, reddedilenler list olarak kalıyor. Bu küçük reading-view action sonucu bütün account veya origin compromise iddiasına genişletilmiyor; permission ve intent birlikte korunuyor.
- Request decision ledger
- Cookie inclusion ≠ action permission
- Provenance ve yetki
- Separate cookie/provenance/object decisions
- Reading-view sonucu
- Bounded reading-view transition / no broad claim
VARSAYIM · SINIR · KONTROL
Session var diye state change’i kabul etmek
Normal cookie-backed UI request’in credential’ı browser’ın taşıdığı state’tir. Bozulan varsayım credential’ın her zaman trusted UI intent’ini de taşıdığıdır. Gerekli risk koşulları ambient credential’ın eligible olması, ilgili state-changing handler’ın bulunması ve provenance/intent kontrolünün yetersizliğidir; scope authenticated kullanıcının sahip olduğu action’larla sınırlıdır. CORS read denial veya SOP’ın response okumasını engellemesi server’ın hiç request almadığını kanıtlamaz. Buradaki missing-token ve sibling-origin satırları inert policy rejection’dır; CSRF request veya payload çalıştırılmaz. Kontrol server-owned token/session ilişkisi ve kaynağın doğru değerlendirilmesidir; UI checkbox veya action adının request’te bulunması kendiliğinden güven kanıtı sayılmaz.
Bir origin veya token kararı fazla yorumlanabilir
Token valid ve exact origin trusted olsa bile object başka tenant’a ait olabilir; artifact permission-denied branch’ı bunu ayırır ve reading-view record’unu değiştirmez. Same-site metadata farklı origin’leri kapsar, none değeri de arbitrary trusted business action demek değildir. Missing header için compatibility exception yazmak kontrolü sessizce kaldırmamalıdır; exceptional clients ayrı authenticated channel/policy isteyebilir. Same-origin script’in endpoint/action seçimini untrusted URL data’dan türetmesi intent bağını ayrıca bozabilir; burada arbitrary endpoint/code üretimi yoktur. Benign expired session, old token/back-button form veya proxy header omission saldırı etiketi taşımadan teşhis edilmelidir. Olası etki ilgili state change’dir; bu lesson bütün account veya origin compromise iddiası üretmez.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Decision controls
- Normal baseline
rows tablosu server action gate’inin verilen validation ve permission girdilerini taşır; sameSite tablosu ayrı cookie-eligibility tahminidir. Cookie gönderimi burada gözlenmez. Bütün Core dalları request arrival’a ulaşır; token-missing ve sibling-origin provenance’da durur, permission-denied ise provenance sonrası ayrı action kararında reddedilir. Yalnız list görünümü bu üç nedeni ayırmaz; gate reason ve aynı action’a bağlı receipt gerekir. Session, token-present/bound, origin ve metadata ayrı alanlar. Normal baseline tenant-A owned object ve izinli action ile provenance/accepted true, after cards verir.
- Decision alanları
- Normal accepted / list → cards
- Correlation review
- Henüz değerlendirilmedi
- State kanıtı
- Henüz değerlendirilmedi
- İki farklı deny nedeni
Token-missing ve sibling-origin provenance false; permission-denied provenance true ama accepted false. Aynı unchanged list sonucu internal reason ve action correlation ile ayrılır.
- Decision alanları
- Normal accepted / list → cards
- Correlation review
- Provenance deny ≠ object/action deny
- State kanıtı
- Henüz değerlendirilmedi
- Secret yerine comparison
Token/cookie raw value gerekmiyor; tokenPresent, tokenBound ve rejection reason yeterli dar kanıt. Secret olmayan validation alias’ı gerçek token gibi log veya runtime girdisine çevirmiyoruz.
- Decision alanları
- Normal accepted / list → cards
- Correlation review
- Provenance deny ≠ object/action deny
- State kanıtı
- Comparison reasons / no raw token
- Metadata fallback
Absent veya invalid metadata için token ve exact-origin fallback’i seçilmiş. Null origin veya null origin string’i reddedilir; unrecognized-value absent gibi değerlendirilir, cross-site known deny kalır.
- Decision alanları
- Fallback scoped / null origin denied
- Correlation review
- Provenance deny ≠ object/action deny
- State kanıtı
- Comparison reasons / no raw token
- SameSite kontrol sınırı
Strict/Lax/None tablosu explicit attribute ve eligible cookie varsayımı taşır. Default grace, redirects ve browser privacy restrictions modellenmez; tablo gerçek cookie gönderimi kanıtı değildir.
- Decision alanları
- Fallback scoped / null origin denied
- Correlation review
- Explicit attributes / finite inclusion predicates
- State kanıtı
- Comparison reasons / no raw token
- Transition sonrası UI
UI success yalnız accepted state transition’a bağlanır. Regression provenance-valid/action-denied ayrımını korur; matrix’in geçmesi gerçek endpoint action çalıştı diye raporlanmaz.
- Decision alanları
- Fallback scoped / null origin denied
- Correlation review
- Explicit attributes / finite inclusion predicates
- State kanıtı
- Reason + accepted + after / runtime separate
Reason eksik
- Yalnız list sonucu
rows tablosu server action gate’inin verilen validation ve permission girdilerini taşır; sameSite tablosu ayrı cookie-eligibility tahminidir. Cookie gönderimi burada gözlenmez. Bütün Core dalları request arrival’a ulaşır; token-missing ve sibling-origin provenance’da durur, permission-denied ise provenance sonrası ayrı action kararında reddedilir. Yalnız list görünümü bu üç nedeni ayırmaz; gate reason ve aynı action’a bağlı receipt gerekir. Review yalnız reading-view’ın list kaldığını görüyor; decision reason ve receipt yok. Token-missing, sibling-origin ve permission-denied aynı görünür state’i üretir.
- Decision alanları
- List unchanged / gate reason missing
- Correlation review
- Henüz değerlendirilmedi
- State kanıtı
- Henüz değerlendirilmedi
- Status’a gate ekleme
Generic status veya client error doğru reason’un yerine geçmez. Eksik token bilgisi yokken tokenBound false yazmak, bu olay için gözlenmeyen provenance kararı üretir.
- Decision alanları
- List unchanged / gate reason missing
- Correlation review
- Status ≠ provenance/object reason
- State kanıtı
- Henüz değerlendirilmedi
- Belirsizliği daralt
After list biliniyor, fakat session/provenance/action gate sonuçları UNKNOWN. Normal accepted row eksik olayın server receipt veya state transition kaydı olarak kullanılamaz.
- Decision alanları
- List unchanged / gate reason missing
- Correlation review
- Status ≠ provenance/object reason
- State kanıtı
- After list known / decision gates UNKNOWN
- Gerekli decision kaydı
Session validity, token comparison, source verification, metadata fallback ve object/action permission aynı action’a bağlanmalı. Raw token veya private body olmadan reason kaydedilebilir.
- Decision alanları
- Needed: action correlation and gate reasons
- Correlation review
- Status ≠ provenance/object reason
- State kanıtı
- After list known / decision gates UNKNOWN
- No-op ile deny farkı
Request hiç gelmediyse server deny iddiası da kurulamaz. Client cancellation veya eski UI görünümü action ledger’ın yerine geçmez; observation point her aşama için belirtilir.
- Decision alanları
- Needed: action correlation and gate reasons
- Correlation review
- Receipt required / no invented server denial
- State kanıtı
- After list known / decision gates UNKNOWN
- Yeni kanıtın sonucu
Yeni inceleme normal ve ayrı rejection kontrollerini korumalı. Bu kayıtta yalnız unchanged list sonucu bildiriliyor; token başarısı veya object denial nedeni eklenmiyor.
- Decision alanları
- Needed: action correlation and gate reasons
- Correlation review
- Receipt required / no invented server denial
- State kanıtı
- Retain list / collect scoped decision evidence
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Decision reason’u identity’den ayrı logla
rows tablosu server action gate’inin verilen validation ve permission girdilerini taşır; sameSite tablosu ayrı cookie-eligibility tahminidir. Cookie gönderimi burada gözlenmez. Bütün Core dalları request arrival’a ulaşır; token-missing ve sibling-origin provenance’da durur, permission-denied ise provenance sonrası ayrı action kararında reddedilir. Yalnız list görünümü bu üç nedeni ayırmaz; gate reason ve aynı action’a bağlı receipt gerekir. Server decision ledger session-valid, token-present/validated/bound, origin-match, metadata classification/fallback, object ownership ve action permission alanlarını ayrı kaydeder. Token/cookie raw value loglanmaz; comparison sonucu ve rejection reason yeterlidir. Normal baseline own-origin valid token ve owned object’tir; old session veya missing metadata hangi gate’e aitse orada sınıflanır. HTTP status tek başına token failure ile object denial’ı ayırmayabilir; internal reason ve action correlation gözlem noktasını tamamlar. UI success yalnız server accepted state transition sonrası verilir. Inert matrix state before=list/after=cards ya da unchanged bilgisini taşır; browser response’unu modellemek real endpoint action’ın koştuğu anlamına gelmez.
Policy compatibility ve action semantics’i test et
Framework’ın maintained CSRF control’unu tercih ederken session rotation, multiple-tab, back navigation ve token lifetime kararını ürün akışına bağla. Atlas regression provenance-valid/action-denied ve same-site/different-origin durumlarını ayrı ister; SameSite tablosu explicit attributes ve assumed credential eligibility ile sınırlıdır. Metadata absent/invalid için source verification+token fallback test edilir; null origin trusted allowlist’e eklenmez. Exact target origin proxy deployment’da trusted configuration’dan gelir ve approved cross-origin business flows generic allowlist’e dönüşmez. GET read endpoint’i mutation yapmaz, action requests explicit method/intent contract taşır. Stronger confirmation hassas işlemlere göre seçilir; bütün requests’e aynı maliyetli challenge konmaz ve CORS ayarı tek CSRF savunması diye sunulmaz.
ŞİMDİ VAKAYA UYGULA
Session ve token doğruysa action otomatik kabul edilir mi?
Duru tenant-A içindeki reading-view-A görünümünü list’ten cards’a değiştirmek istiyor. Normal POST; session, token bağı, exact origin ve action iznini birlikte geçiyor. Eksik token, farklı same-site origin veya tenant-B object’i ise aynı before state’i koruyor; reddin hangi gate’ten geldiğini ayıracağız.
Vakadaki browser policy hangi ilişkiyi kontrol ediyor? Response exposure, destination veya framing kararını server’ın object permission kararıyla karıştırmadan açıkla.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Ambient credentials ve action intent tablosu
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"profile": {
"targetOrigin": "https://atlas.example.org",
"actor": "Duru",
"tenant": "tenant-A",
"action": "save-reading-view",
"method": "POST",
"record": "reading-view-A",
"before": "list",
"desired": "cards",
"token": "session-bound-validation-alias",
"tokenIsActualSecret": false,
"actualRequest": false,
"actualCookie": false,
"actualAction": false
},
"rows": [
{
"case": "normal",
"sessionValid": true,
"tokenPresent": true,
"tokenBound": true,
"sourceOrigin": "https://atlas.example.org",
"metadata": "same-origin",
"actionAuthorized": true,
"objectTenant": "tenant-A",
"expectedProvenance": true,
"expectedAccepted": true,
"expectedAfter": "cards"
},
{
"case": "token-missing",
"sessionValid": true,
"tokenPresent": false,
"tokenBound": false,
"sourceOrigin": "https://atlas.example.org",
"metadata": "same-origin",
"actionAuthorized": true,
"objectTenant": "tenant-A",
"expectedProvenance": false,
"expectedAccepted": false,
"expectedAfter": "list"
},
{
"case": "sibling-origin",
"sessionValid": true,
"tokenPresent": true,
"tokenBound": true,
"sourceOrigin": "https://notes.example.org",
"metadata": "same-site",
"actionAuthorized": true,
"objectTenant": "tenant-A",
"expectedProvenance": false,
"expectedAccepted": false,
"expectedAfter": "list"
},
{
"case": "permission-denied",
"sessionValid": true,
"tokenPresent": true,
"tokenBound": true,
"sourceOrigin": "https://atlas.example.org",
"metadata": "same-origin",
"actionAuthorized": false,
"objectTenant": "tenant-B",
"expectedProvenance": true,
"expectedAccepted": false,
"expectedAfter": "list"
}
],
"provenancePolicy": {
"requireTokenPresentAndBound": true,
"requireExactOrigin": true,
"knownMetadataAllowed": [
"same-origin"
],
"absentMetadata": "token+exact-origin fallback",
"invalidMetadata": "treat as absent then configured fallback",
"nullOriginAllowed": false
},
"fallbackRows": [
{
"origin": "https://atlas.example.org",
"tokenBound": true,
"metadata": null,
"expected": true
},
{
"origin": null,
"tokenBound": true,
"metadata": null,
"expected": false
},
{
"origin": "null",
"tokenBound": true,
"metadata": null,
"expected": false
},
{
"origin": "https://atlas.example.org",
"tokenBound": true,
"metadata": "unrecognized-value",
"expected": true
},
{
"origin": "https://atlas.example.org",
"tokenBound": true,
"metadata": "cross-site",
"expected": false
}
],
"sameSite": {
"profile": "explicit attributes only; eligible host/path/unexpired cookie, HTTPS, no browser partition/storage restrictions, credentials eligible; no redirect chain or default grace",
"rows": [
{
"attribute": "Strict",
"sameSite": true,
"topLevel": false,
"safe": false,
"secure": true,
"credentialsEligible": true,
"expected": true
},
{
"attribute": "Lax",
"sameSite": false,
"topLevel": true,
"safe": true,
"secure": true,
"credentialsEligible": true,
"expected": true
},
{
"attribute": "Lax",
"sameSite": false,
"topLevel": true,
"safe": false,
"secure": true,
"credentialsEligible": true,
"expected": false
},
{
"attribute": "Lax",
"sameSite": true,
"topLevel": false,
"safe": false,
"secure": true,
"credentialsEligible": true,
"expected": true
},
{
"attribute": "None",
"sameSite": false,
"topLevel": false,
"safe": false,
"secure": true,
"credentialsEligible": true,
"expected": true
},
{
"attribute": "None",
"sameSite": false,
"topLevel": false,
"safe": false,
"secure": true,
"credentialsEligible": false,
"expected": false
}
],
"sameSiteMeansSameOrigin": false,
"defaultLaxGraceModeled": false
},
"boundaries": {
"httpOnlyStopsEligibleCookies": false,
"corsDenialProvesNoRequest": false,
"tokenValidGrantsObjectPermission": false,
"metadataProvesHumanIntent": false
}
}- profile
- Harmless reading-view action ve before/desired state; token alias secret değildir.
- rows
- Session, provenance ve action permission ayrı sonuç üretir.
- provenancePolicy
- Exact origin ve session-bound token selected control’udur.
- fallbackRows
- Missing metadata trusted origin varsayımı yaratmaz.
- sameSite
- Explicit attribute/eligibility modelidir; browser cookie testi değildir.
Inert boolean/state tablosu; gerçek cookie, CSRF token veya business action çalıştırılmaz.
İki yanlış kanı
HttpOnly cookie CSRF request’lerine eklenmez.
HttpOnly script reading’i sınırlar; eligible credential attachment ve intent kontrolü ayrıdır.
Valid CSRF token bütün object actions’a yetki verir.
Provenance/session binding ardından object/tenant/action permission yine değerlendirilir.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Session, token ve exact origin koşulları sağlanmış, fakat actionAuthorized=false ve objectTenant=tenant-B. Reading view değişir mi?
- Evet. Bound token bütün object’lere write izni verir.
- Hayır. Provenance kabul edilir; action reddedilir ve list korunur.
Gerekçeli cevabı oku
Hayır. Provenance kabul edilir; action reddedilir ve list korunur. — permission-denied satırında expectedProvenance=true, expectedAccepted=false. CSRF koşullarının geçmesi tenant/action izni vermez.
Sibling origin same-site görünüyor ve token bound. Bu exact-origin policy’si provenance’ı kabul eder mi?
Dersten seçilen artifact alanları; öğretim örneği
- rows[2].sourceOrigin
- https://notes.example.org
- rows[2].metadata
- same-site
- rows[2].tokenBound
- true
- rows[2].expectedProvenance
- false
- provenancePolicy.requireExactOrigin
- true
- Hayır. expectedProvenance=false.
- Evet. Same-site bütün sibling origin’leri aynı güven alanı yapar.
Gerekçeli cevabı oku
Hayır. expectedProvenance=false. — notes.example.org, hedef atlas.example.org ile aynı origin değildir. Bu policy exact origin ister; same-site metadata bunu karşılamaz.
Browser eligible cookie’yi otomatik taşıyabiliyor. Neden session tanınması kullanıcı intent’i değildir? Metadata eksikse bu policy ne yapar?
Gerekçeli cevabı oku
Cookie session’ı tanımaya yardımcı olabilir, fakat kullanıcının bu action’ı istediğini tek başına kanıtlamaz. Bu policy token’ın bulunup session’a bağlı olmasını ve exact origin’i ister. Metadata yoksa yapılandırılmış token+exact-origin fallback uygulanır; null veya eksik origin kabul edilmez. Geçerli provenance sonrasında da object/action izni ayrıca gerekir. HttpOnly eligible cookie gönderimini durdurmaz; CORS ret sonucu request’in hiç gitmediği kanıtı değildir.
□ Session tanınmasını kullanıcı intent’i saymadım.
□ Metadata eksikliğinde tanımlı fallback’i uyguladım; object iznini ayrıca korudum.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- OWASP — CSRF PreventionIntroduction; Synchronizer Token Pattern/transmission; signed double-submit session binding · Fetch Metadata server policy/fallback; SameSite limitations; source/target Origin verification; interaction-based defense
- MDN — Set-CookieAttributes: HttpOnly and SameSite Strict/Lax/None; explicit Lax versus default grace; Secure
- W3C — Fetch Metadata Request Headers§2.1–2.3 Sec-Fetch-Dest/Mode/Site; valid values and ignore invalid; §2.3 source/target relation