Ders 17 / 22
İstek Sahteciliği
İstek sahteciliğinin iki yönünün ayrı zincir olarak ölçülmesi: tarayıcı yönünde beş adımın önkoşullarının kurban, tarayıcı ve sunucu arasında bölünmesi, sunucu yönünde bedelin üçüncü adımda yüzde kırkının gerçekleşmesi, on bir uçta ikisinin hiç kırılamaması, tek katmanın kaldırılmasının kırk beş işlemlik fark üretmesi ve iki yönün bedelinin ayrı birimlerde ölçülmesi.
İçindekiler
Önceki derste kurbanın tarayıcısında kod çalışıyordu. Aynı tarayıcının, hiçbir kod çalıştırmadan yapabileceği daha sessiz bir şey daha vardır: bir isteği kurbanın kimliğiyle göndermek. İstek sahteciliği bu sınıftır ve iki yönü vardır.
Birinci yönde sahtelenen şey kurbanın kimliğidir: istek kurbanın tarayıcısından çıkar ve oturum kalemini kendiliğinden yanında taşır. İkinci yönde sahtelenen şey sunucunun ağ konumudur: istek sunucudan çıkar ve dışarıdan erişilemeyen bir iç uca ulaşır. İki yön aynı sınıf adıyla anılır çünkü ikisinde de bir isteği başkasının yetkisiyle göndermek söz konusudur; ama zincirleri, önkoşul sahipleri ve bedel birimleri ayrıdır.
İki Zincir, İki Önkoşul Sahibi
Tarayıcı yönü, beş adım. (1) Kurbanın hedefte açık bir oturumu vardır — önkoşul: oturum kalemi tarayıcıda duruyor ve süresi dolmamış. (2) Kurban, saldıranın belirlediği bir sayfaya ulaşır — önkoşul: bir teslim kanalı var. (3) O sayfadan hedefe bir istek çıkar ve oturum kalemi isteğe kendiliğinden eklenir — önkoşul: aynı-site ilkesi bu isteği dışarıda bırakmıyor. (4) Uç isteği kabul eder — önkoşul: uç isteğin kaynağını kanıtlayan bir kalem istemiyor. (5) İşlem kalıcı olur — önkoşul: işlem tek adımda tamamlanıyor.
Sunucu yönü, beş adım. (1) Bir uç, dışarıdan verilen bir adrese istek gönderir — önkoşul: hedef adres istek alanından geliyor. (2) Adres çözümlemesi iç ağdaki bir adrese düşer — önkoşul: çözümleme sonrası bir denetim yok. (3) İstek iç uca ulaşır — önkoşul: iç uç ağ katmanında erişilebilir. (4) İç uç isteği kimlik sormadan yanıtlar — önkoşul: iç uçlar konum temelli güveniyor. (5) Yanıt çağırana geri döner — önkoşul: yanıt gövdesi ya da hata farkı dışarıya yansıyor.
İlk zincirin ilk iki adımının önkoşulu kurbanın elindedir; savunmanın orada tutunacak yeri yoktur. İkinci zincirde hiçbir adımın önkoşulu kurbana ait değildir — üçü savunanın kendi altyapısında, biri iç serviste. Bu, iki yönün savunma sorumluluğunun neden farklı yerlere düştüğünü açıklar.
TS14: iki yön ayrı zincirdir; sahip, adımın önkoşulunu elinde tutan taraftır. TS15:
her katman tek bir yönde tek bir adımı kırar. TS16: bedelin birimi yöne göre değişir ve iki
birim toplanmaz. TS17: egri[i], i. adım tamamlandığında bedelin ne kadarının
gerçekleştiğini verir.
// isf/yon.mjs — istek sahteciliginin iki yonu, adim dizileri ve katmanlar (model). // Gercek bir uc, gercek bir adres ve hicbir istek govdesi yok. export const YON = { tarayici: { adim: ["acik-oturum", "teslim", "kendiliginden-eklenme", "ucun-kabulu", "kalicilik"], sahip: ["kurban", "kurban", "tarayici", "sunucu", "sunucu"], birim: "islem", egri: [0, 0, 0, 0, 1], }, sunucu: { adim: ["adres-disaridan", "cozumleme", "ic-uca-ulasma", "kimliksiz-yanit", "geri-yansima"], sahip: ["sunucu", "ag", "ag", "ic-servis", "sunucu"], birim: "ic uc", egri: [0, 0, 0.4, 0.8, 1], }, }; export const KATMAN = [ { ad: "ayni-site-cerez", yon: "tarayici", kirar: 3, mesru: 2 }, { ad: "istek-belirteci", yon: "tarayici", kirar: 4, mesru: 5 }, { ad: "kaynak-denetimi", yon: "tarayici", kirar: 4, mesru: 3 }, { ad: "yeniden-dogrulama", yon: "tarayici", kirar: 5, mesru: 11 }, { ad: "cikis-izin-listesi", yon: "sunucu", kirar: 1, mesru: 4 }, { ad: "cozumleme-denetimi", yon: "sunucu", kirar: 2, mesru: 1 }, { ad: "ag-bolutleme", yon: "sunucu", kirar: 3, mesru: 8 }, { ad: "ic-uc-kimligi", yon: "sunucu", kirar: 4, mesru: 6 }, { ad: "sade-yanit", yon: "sunucu", kirar: 5, mesru: 2 }, ]; // Kurgu olcum aginin on bir ucu: yon, dagitilmis katmanlar ve yone ozgu bedel. export const UC = [ ["abone-portali.tarife-degis", "tarayici", ["ayni-site-cerez", "istek-belirteci"], 60], ["abone-portali.adres-guncelle", "tarayici", ["ayni-site-cerez"], 45], ["abone-portali.itiraz-ac", "tarayici", ["istek-belirteci", "kaynak-denetimi"], 30], ["saha-uygulamasi.is-emri-kapat", "tarayici", ["ayni-site-cerez", "yeniden-dogrulama"], 120], ["yonetim.esik-ayari", "tarayici", [], 8], ["yonetim.kullanici-yetkisi", "tarayici", ["istek-belirteci", "yeniden-dogrulama"], 4], ["fatura-uretimi.sablon-getir", "sunucu", ["cikis-izin-listesi", "cozumleme-denetimi"], 9], ["toplayici.geri-bildirim-ucu", "sunucu", ["cozumleme-denetimi", "ag-bolutleme"], 14], ["is-emri.harita-onizleme", "sunucu", ["sade-yanit"], 14], ["rapor.dis-kaynak-cek", "sunucu", [], 17], ["sube-ucu.baglanti-sinama", "sunucu", ["ag-bolutleme", "ic-uc-kimligi", "sade-yanit"], 6], ]; export const yaz = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
// isf/olcum.mjs — iki yon on bir uc uzerinde kosturulur: ilk kirilan halka, denetimsiz // adim ve gec kirmanin yone ozgu birimdeki bedeli. Rastgelelik yok. import { YON, KATMAN, UC, yaz } from "./yon.mjs"; const ilkKirilan = (y, d) => Math.min(...KATMAN .filter((k) => k.yon === y && d.includes(k.ad)).map((k) => k.kirar), Infinity); // n. adimda kirilan zincirde gerceklesmis bedel orani const oran = (y, n) => (n === Infinity ? 1 : YON[y].egri[n - 2] ?? 0); console.log(`2 yon, ${KATMAN.length} katman, ${UC.length} kurgu uc\n`); console.log("1. iki yonun adim dizisi"); for (const [ad, z] of Object.entries(YON)) { console.log(`${ad} yonu — ${z.adim.length} adim, bedel birimi "${z.birim}", ` + `${KATMAN.filter((k) => k.yon === ad).length} katman`); z.adim.forEach((a, i) => console.log(` ${i + 1}. ${a.padEnd(24)}onkosul sahibi: ` + `${z.sahip[i].padEnd(11)}tamamlaninca bedelin %${(z.egri[i] * 100).toFixed(0)}'i`)); } const B = [-31, -10, 8, 13, 12, 8, 14]; console.log("\n2. uc basina zincir"); yaz(B, "uc", "yon", "katman", "ilk kirilan", "denetimsiz", "bedel", "gerceklesen"); const durum = UC.map(([ad, y, d, b]) => { const h = ilkKirilan(y, d); const kirilan = new Set(KATMAN.filter((k) => k.yon === y && d.includes(k.ad)).map((k) => k.kirar)); return { ad, y, d, b, h, denetimsiz: YON[y].adim.length - kirilan.size, ger: b * oran(y, h) }; }); for (const u of durum) yaz(B, u.ad, u.y, u.d.length, u.h === Infinity ? "kirilmiyor" : `${u.h}. adim`, u.denetimsiz, u.b, u.ger.toFixed(1)); for (const y of Object.keys(YON)) { const k = durum.filter((u) => u.y === y); console.log(`${y} yonu: ${k.length} uc, toplam bedel ` + `${k.reduce((t, u) => t + u.b, 0)} ${YON[y].birim}, gerceklesen ` + `${k.reduce((t, u) => t + u.ger, 0).toFixed(1)}; kirilmayan uc ` + `${k.filter((u) => u.h === Infinity).length}`); } const C = [-20, -10, 9, 8, 15, 18]; console.log("\n3. bir katman butun uclardan kaldirilirsa"); yaz(C, "katman", "yon", "dagitim", "mesru", "kirilmaz olan", "gerceklesen fark"); for (const k of KATMAN) { const kume = durum.filter((u) => u.y === k.yon); let yeniAcik = 0, fark = 0; for (const u of kume) { const h2 = ilkKirilan(k.yon, u.d.filter((x) => x !== k.ad)); if (u.h !== Infinity && h2 === Infinity) yeniAcik++; fark += u.b * oran(k.yon, h2) - u.ger; } yaz(C, k.ad, k.yon, kume.filter((u) => u.d.includes(k.ad)).length, k.mesru, yeniAcik, `+${fark.toFixed(1)}`); } const D = [-8, 13, 13, 13, 13]; console.log("\n4. bedel egrisinin bicimi"); yaz(D, "adim", "tarayici %", "sunucu %", "tarayici uc", "sunucu uc"); for (let n = 1; n <= 5; n++) yaz(D, `${n}.`, (YON.tarayici.egri[n - 1] * 100).toFixed(0), (YON.sunucu.egri[n - 1] * 100).toFixed(0), durum.filter((u) => u.y === "tarayici" && u.h === n).length, durum.filter((u) => u.y === "sunucu" && u.h === n).length); console.log(`tarayici yonunde bedel yalnizca son adimda gerceklesir: dorduncu adimda kirmak ` + `bedeli sifirda tutar`); console.log(`sunucu yonunde ucuncu adim bedelin %40'ini uretir: gec kirmak bedeli sifirlamaz`);
2 yon, 9 katman, 11 kurgu uc 1. iki yonun adim dizisi tarayici yonu — 5 adim, bedel birimi "islem", 4 katman 1. acik-oturum onkosul sahibi: kurban tamamlaninca bedelin %0'i 2. teslim onkosul sahibi: kurban tamamlaninca bedelin %0'i 3. kendiliginden-eklenme onkosul sahibi: tarayici tamamlaninca bedelin %0'i 4. ucun-kabulu onkosul sahibi: sunucu tamamlaninca bedelin %0'i 5. kalicilik onkosul sahibi: sunucu tamamlaninca bedelin %100'i sunucu yonu — 5 adim, bedel birimi "ic uc", 5 katman 1. adres-disaridan onkosul sahibi: sunucu tamamlaninca bedelin %0'i 2. cozumleme onkosul sahibi: ag tamamlaninca bedelin %0'i 3. ic-uca-ulasma onkosul sahibi: ag tamamlaninca bedelin %40'i 4. kimliksiz-yanit onkosul sahibi: ic-servis tamamlaninca bedelin %80'i 5. geri-yansima onkosul sahibi: sunucu tamamlaninca bedelin %100'i 2. uc basina zincir uc yon katman ilk kirilan denetimsiz bedel gerceklesen abone-portali.tarife-degis tarayici 2 3. adim 3 60 0.0 abone-portali.adres-guncelle tarayici 1 3. adim 4 45 0.0 abone-portali.itiraz-ac tarayici 2 4. adim 4 30 0.0 saha-uygulamasi.is-emri-kapat tarayici 2 3. adim 3 120 0.0 yonetim.esik-ayari tarayici 0 kirilmiyor 5 8 8.0 yonetim.kullanici-yetkisi tarayici 2 4. adim 3 4 0.0 fatura-uretimi.sablon-getir sunucu 2 1. adim 3 9 0.0 toplayici.geri-bildirim-ucu sunucu 2 2. adim 3 14 0.0 is-emri.harita-onizleme sunucu 1 5. adim 4 14 11.2 rapor.dis-kaynak-cek sunucu 0 kirilmiyor 5 17 17.0 sube-ucu.baglanti-sinama sunucu 3 3. adim 2 6 0.0 tarayici yonu: 6 uc, toplam bedel 267 islem, gerceklesen 8.0; kirilmayan uc 1 sunucu yonu: 5 uc, toplam bedel 60 ic uc, gerceklesen 28.2; kirilmayan uc 1 3. bir katman butun uclardan kaldirilirsa katman yon dagitim mesru kirilmaz olan gerceklesen fark ayni-site-cerez tarayici 3 2 1 +45.0 istek-belirteci tarayici 3 5 0 +0.0 kaynak-denetimi tarayici 1 3 0 +0.0 yeniden-dogrulama tarayici 2 11 0 +0.0 cikis-izin-listesi sunucu 1 4 0 +0.0 cozumleme-denetimi sunucu 2 1 0 +0.0 ag-bolutleme sunucu 2 8 0 +2.4 ic-uc-kimligi sunucu 1 6 0 +0.0 sade-yanit sunucu 2 2 1 +2.8 4. bedel egrisinin bicimi adim tarayici % sunucu % tarayici uc sunucu uc 1. 0 0 0 1 2. 0 0 0 1 3. 0 40 3 1 4. 0 80 2 0 5. 100 100 0 1 tarayici yonunde bedel yalnizca son adimda gerceklesir: dorduncu adimda kirmak bedeli sifirda tutar sunucu yonunde ucuncu adim bedelin %40'ini uretir: gec kirmak bedeli sifirlamaz
Önkoşulun Sahibi
Birinci çıktı iki zinciri adım adım açar ve her adımın önkoşulunu kimin elinde tuttuğunu yazar. Tarayıcı yönünde iki adımın sahibi kurban, biri tarayıcı, ikisi sunucudur. Savunanın doğrudan karar verebildiği adım sayısı beşte ikidir; kalan üçünde ancak dolaylı bir etkisi olur.
Sunucu yönünde tablo tersine döner: iki adımın sahibi sunucunun kendisi, ikisi ağ, biri iç servistir. Hiçbir adımın önkoşulu kurbana ait değildir. Bu yön bir kullanıcı hatasına bağlı değildir; tamamen kurumun kendi yapılandırmasında geçer. Aynı sınıf adı altında toplanan iki zincirin savunma sorumluluğu bu yüzden farklı ekiplere düşer.
Uç Başına Kırılma
İkinci çıktı on bir ucu ölçer. Tarayıcı yönündeki altı uçtan üçü üçüncü adımda, ikisi dördüncü adımda kırılıyor; biri hiç kırılmıyor. Sunucu yönündeki beş uçtan biri birinci, biri ikinci, biri üçüncü, biri beşinci adımda kırılıyor; biri hiç kırılmıyor.
gerceklesen sütunu farkı somutlaştırır. Tarayıcı yönünde toplam bedel 267 işlemdir ve
gerçekleşen yalnız 8 — çünkü kırılan beş uçta zincir beşinci adıma varmadan durur ve
tarayıcı yönünde bedel yalnız son adımda oluşur. Sunucu yönünde toplam bedel 60 iç uçtur ve
gerçekleşen 28,2; kırılamayan uç 17’nin tamamını, beşinci adımda kırılan uç 14’ün 11,2’sini
üretir.
denetimsiz sütunu ikinci bir okuma verir. En çok katmanı olan uç sube-ucu.baglanti-sinama
üçüncü adımda kırılıyor ve beş adımının yalnız ikisi denetimsiz; en az katmanı olan iki uçta
beş adımın beşi de denetimsiz. Arada duran uçlarda katman sayısı ile denetimsiz adım sayısı
birebir tamamlayıcı değildir, çünkü iki katman aynı adımı kırabilir: abone-portali.itiraz-ac
iki katman taşır ama ikisi de dördüncü adımı kırar, bu yüzden denetimsiz adım sayısı dörttür.
İki katmanın aynı adıma düşmesi ikinci bir halka kazandırmaz.
İki toplam yan yana yazılabilir ama toplanamaz. Biri günlük işlem, öteki erişilen iç uç sayısıdır. Bir savunma raporu “iki uçta koruma yok” dediğinde iki farklı büyüklükten söz etmiş olur: biri günde 8 kurgu işlemi etkiler, öteki 17 iç uca erişim açar.
Bir Katmanın Kaldırılması
Üçüncü çıktı duyarlılık ölçümüdür: her katman bütün uçlardan kaldırılır ve gerçekleşen bedel farkı yazılır. Dokuz katmandan altısının farkı sıfırdır — kaldırıldıklarında kırılma noktası geriye kayar ama bedel değişmez, çünkü arkalarında başka bir katman durur.
Fark üretenler üç tanedir. ayni-site-cerez kaldırılırsa bir uç kırılmaz hâle gelir ve
gerçekleşen bedel 45 işlem artar; meşru işe bedeli 2 ile en ucuz katmandır. sade-yanit
2,8, ag-bolutleme 2,4 fark üretir. Buna karşılık meşru işe bedeli 11 olan yeniden-dogrulama
kaldırıldığında fark sıfırdır: en pahalı katman, bu dağıtımda hiçbir şey eklemiyor.
Bu, katman seçiminin listeden değil dağıtımdan okunması gerektiğini gösterir. Bir katmanın değeri kendi gücünde değil, bulunduğu uçlarda ondan önce kıran başka bir katmanın olup olmadığındadır.
Ölçümün ters yönü de aynı sayıdan okunur. Farkı sıfır çıkan altı katmanın hiçbiri gereksiz değildir; yalnız bu dağıtımda yedek durumdadırlar. Önlerindeki katman bir uçtan kalktığı anda fark üretmeye başlarlar. Bir katmanın kaldırılıp kaldırılamayacağı sorusu bu yüzden tek başına sorulamaz: yanıt, aynı uçta duran öteki katmanların hangi adımları tuttuğuna bağlıdır ve dağıtım her değiştiğinde yeniden hesaplanması gerekir.
Bedel Eğrisinin Biçimi
Dördüncü çıktı iki yönün asıl farkını verir. Tarayıcı yönünde bedel eğrisi dört adım boyunca sıfırdır ve beşinci adımda birden %100’e çıkar. Dördüncü adımda kırmak ile birinci adımda kırmak aynı sonucu verir: bedel sıfır. Bu yönde “geç kırma” diye bir şey neredeyse yoktur; zincir ya tamamlanır ya tamamlanmaz.
Sunucu yönünde eğri kademelidir: üçüncü adım tamamlandığında bedelin %40’ı, dördüncüde %80’i gerçekleşmiştir. Beşinci adımda kırmak — yani yanıtın dışarı yansımasını engellemek — bedelin yalnız %20’sini önler. İç uçlara ulaşılmış, hangi servislerin yaşadığı öğrenilmiştir; yanıtın geri dönmemesi bunu geri almaz.
Aynı sınıf adı altındaki iki zincirde erken kırmanın kazancı aynı değildir. Tarayıcı yönünde son halkadan önceki her nokta eşit değerdedir; sunucu yönünde her adım bir öncekinden pahalıdır ve savunmanın ikinci adımdan geç kalmaması gerekir.
Özet
- İstek sahteciliğinin iki yönü ayrı zincirlerdir: birinde kurbanın kimliği, ötekinde sunucunun ağ konumu kullanılır. İkisi de beş adımdır ama önkoşul sahipleri farklıdır.
- Tarayıcı yönünde beş adımın 2’sinin önkoşulu kurbanın elindedir; sunucu yönünde hiçbir adımın önkoşulu kurbana ait değildir ve zincirin tamamı kurumun kendi yapılandırmasında geçer.
- On bir uçtan 2’sinde hiçbir halka kırılmıyor: biri günde 8 kurgu işlem, öteki 17 iç uç. İki sayı ayrı birimdedir ve toplanmaz.
- Dokuz katmandan 6’sının kaldırılması gerçekleşen bedeli değiştirmiyor; en ucuz katmanın (meşru bedel 2) kaldırılması 45 işlemlik fark üretiyor, en pahalı katmanın (meşru bedel 11) kaldırılması 0.
- Bedel eğrileri farklıdır: tarayıcı yönünde bedel yalnız beşinci adımda gerçekleşir, sunucu yönünde üçüncü adımda %40’ı, dördüncüde %80’i gerçekleşmiş olur. Geç kırmak yalnız ikinci yönde gerçek bir kayıp bırakır.
Sonraki Adım
Bu dersin sunucu yönünde istek bir adrese gidiyordu ve adresin dışarıdan gelmesi zincirin ilk halkasıydı. Aynı yapı, adres yerine bir dosya yolu olduğunda başka bir sınıfa dönüşür: uç bir kalem adı alır, onu bir kök dizine ekler ve sonucu okur. Sonraki ders o zinciri sayar — yol bileşeninin nereden geldiği, birleştirmeden sonra hangi denetimin kaldığı, süreç kimliğinin okuyabildiği kalem sayısının bedeli nasıl belirlediği ve dolaylı bir tanıtıcı eşlemesinin zinciri kaçıncı adımda kırdığı.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.