Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

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?

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Amaçlı action

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

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

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

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

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

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

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

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

  1. Evet. Bound token bütün object’lere write izni verir.
  2. 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
  1. Hayır. expectedProvenance=false.
  2. 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