İçeriğe geç
academia.sh

Ders 11 / 12

Bulut Saldırı Kalıpları

On üç kalıbın aynı grafik üzerinde kalem-yol-kayıt-denetim dörtlüsüyle sayılması: kalıpların sekizi yönetim düzlemi kaydına düşen bir adımla açılıyor, üçü yalnız sağlayıcıda duran bir adımla, biri hiçbir kayda düşmeyen bir adımla. En büyük katkıyı veren kalıp — örneğe bağlı kimliğin oturum doğrulaması olmadan verilmesi — tek başına yarıçapı 6'dan 23'e çıkarıyor ve kayıtsız sınıftadır. Denetim sırası bedeli belirliyor: birim faydaya göre bir denetim ve iki bedel, en ucuzdan başlayarak sekiz denetim ve sekiz bedel aynı yarıçapı veriyor.

İçindekiler

Buraya kadarki dört ders tek tek kalemleri ölçtü: bir kaydın görmediği adım, dağıtımdan sonra doğan bir sapma, bir konağı paylaşan komşu, ömrünü aşan bir belirteç. Her biri kendi bağlamında sayıldı ama aralarındaki bağ yazılmadı. Bu ders o bağı kalıp düzeyinde toplar ve her kalıbı dört alanla yazar: hangi kalem yanlış, hangi adım açılıyor, o adım hangi kayda düşüyor, hangi denetim kapatıyor.

Kalıplar model olarak anlatılır. Hiçbir sızma adımı, çağrı dizisi, uç nokta yolu, istek biçimi ya da kimlik bilgisi toplama yöntemi yazılmaz; koşan kod yalnızca grafik yürüyüşü ve denetim değerlendirmesidir. Bir bulut ortamında bu kalıplardan herhangi birini sınamak, yazılı yetki ve tanımlı kapsam olmadan yapıldığında hem yasadışı hem de meslek dışıdır. Ölçüm bölgesel ölçüm ağı üzerindedir ve kurgudur.

BT25. Her kalıp bir yanlış kaleme, o kalem bir kenara karşılık gelir; kalem kapalıysa kenar yürünemez. BT26. Kalıbın “açtığı adım”, kenarın adım türüdür; kayıt sınıfı birinci dersin sınıflamasından gelir. BT27. Kalıbın katkısı, o kalem tek başına kapatıldığında yarıçapın düştüğü kalem sayısıdır. BT28. Her kalıbın bir kapatan denetimi vardır; denetim, kalıbın işleyebilmesi için sağlanması gereken ön koşul sayısını değiştirir (model girdisi). BT29. Denetimin bedeli, durdurduğu meşru iş sayısıdır (kurgu birim). BT30. Sıralama iki ölçütle yapılır: birim bedel başına en çok kalem indiren denetim, ya da yalnızca en ucuz denetim.

Kalıp Düzeyinde Katalog

// kalip.mjs — bulut saldiri kaliplari KALIP DUZEYINDE: hangi kalem yanlissa hangi kenar aciliyor,
// o kenar hangi kayit sinifina dusuyor, kapatildiginda yaricap kaca iniyor. MODELDIR.
// Hicbir sizma adimi, cagri dizisi, uc nokta yolu ya da istek bicimi yazilmaz.
const bol = (s) => s.trim().split("\n").map((l) => l.trim().split("|"));

// Kenar: kaynak|hedef|adim turu|sure(dk)|kenari mumkun kilan yanlis kalem ("-" ise mesru)
export const KENAR = bol(`
  portal-hizmet-hesabi|portal-ornegi|ag-baglantisi|3|-
  portal-hizmet-hesabi|okuma-rolu|rol-ustlenme|4|-
  portal-ornegi|portal-ornek-kimligi|ornek-kimligi-alma|2|ornek-kimligi-oturumsuz
  portal-ornek-kimligi|abone-veritabani|veritabani-sorgusu|6|-
  portal-ornek-kimligi|sir-deposu|sir-okuma|4|portal-kimligine-sir-okuma
  sir-deposu|toplama-is-yuku-kimligi|sir-okuma|3|sirda-uzun-omurlu-kimlik
  toplama-is-yuku-kimligi|sayac-ham-kova|nesne-okuma|5|-
  toplama-is-yuku-kimligi|olcum-kuyrugu|kuyruk-tuketimi|4|-
  toplama-is-yuku-kimligi|izleme-rolu|rol-ustlenme|4|is-yukune-rol-ustlenme
  izleme-rolu|olcum-panosu|kaynak-listeleme|3|-
  portal-ornek-kimligi|fatura-toplu-is-rolu|rol-ustlenme|3|portal-kimligine-toplu-is-rolu
  fatura-toplu-is-rolu|fatura-arsiv-kovasi|nesne-okuma|6|-
  fatura-toplu-is-rolu|anahtar-yonetimi|anahtar-cozme|4|anahtar-kullanimi-kosulsuz
  anahtar-yonetimi|musteri-anahtari|anahtar-cozme|2|anahtar-politikasinda-kosul-yok
  fatura-toplu-is-rolu|yedekleme-rolu|rol-ustlenme|3|zincirli-rol-ustlenme
  yedekleme-rolu|yedek-kovasi|nesne-okuma|7|-
  yedekleme-rolu|dagitim-rolu|rol-ustlenme|4|yedekleme-rolune-dagitim
  dagitim-rolu|sablon-deposu|nesne-okuma|5|sablon-deposu-yazmaya-acik
  dagitim-rolu|yapilandirma-kovasi|nesne-okuma|4|-
  dagitim-rolu|is-yuku-ornegi|ornek-ici-calisma|9|dagitim-rolu-ornek-baslatabiliyor
  okuma-rolu|rapor-kovasi|nesne-okuma|4|-
  okuma-rolu|gunluk-kovasi|nesne-okuma|5|gunluk-kovasi-okumaya-acik
  okuma-rolu|yapilandirma-kovasi|nesne-okuma|6|yapilandirma-kovasi-genis-okuma`)
  .map(([k, h, t, d, y]) => ({ k, h, t, d: +d, y }));

// Adim turunun kaydi kiracinin eline geciyor mu (birinci dersin siniflamasi).
const KAYIT = { "rol-ustlenme": "yonetim", "kaynak-listeleme": "yonetim", "sir-okuma": "yonetim",
  "anahtar-cozme": "yonetim", "veritabani-sorgusu": "uygulama", "ornek-ici-calisma": "ajansiz",
  "nesne-okuma": "saglayicida", "kuyruk-tuketimi": "saglayicida",
  "ornek-kimligi-alma": "kayitsiz", "ag-baglantisi": "kayitsiz" };

// Kalip: ad|tetikleyen yanlis kalem|kapatan denetim|denetim oncesi adim|denetim sonrasi adim
// Adim sayilari, kalibin isleyebilmesi icin saglanmasi gereken on kosul sayisidir. MODEL girdisi.
export const KALIP = bol(`
  meta-veri-servisinden-kimlik|ornek-kimligi-oturumsuz|oturum-basina-dogrulama|1|3
  sir-deposuna-genis-erisim|portal-kimligine-sir-okuma|sir-erisimini-kapsamla-sinirla|1|2
  sirdan-uzun-omurlu-kimlik|sirda-uzun-omurlu-kimlik|sirda-yalniz-kisa-omurlu-kimlik|1|3
  is-yukunden-rol-ustlenme|is-yukune-rol-ustlenme|is-yuku-kimligini-roldan-ayir|1|2
  yatay-rol-gecisi|portal-kimligine-toplu-is-rolu|kimlige-gore-rol-daraltma|1|2
  kosulsuz-anahtar-kullanimi|anahtar-kullanimi-kosulsuz|anahtar-kullanimina-kosul|1|2
  kosulsuz-anahtar-cozme|anahtar-politikasinda-kosul-yok|anahtar-politikasina-kosul|1|2
  rol-zinciri|zincirli-rol-ustlenme|zincir-derinligi-siniri|1|3
  yedeklemeden-dagitima|yedekleme-rolune-dagitim|yedekleme-rolunden-dagitimi-al|1|2
  sablon-deposuna-yazma|sablon-deposu-yazmaya-acik|sablon-deposunu-salt-okur-yap|1|2
  dagitimdan-yeni-ornek|dagitim-rolu-ornek-baslatabiliyor|dagitim-rolunden-ornek-yetkisi|1|2
  yapilandirma-okuma|yapilandirma-kovasi-genis-okuma|kova-politikasini-daraltma|1|2
  gunluk-okuma|gunluk-kovasi-okumaya-acik|gunluk-kovasini-kapatma|1|2`)
  .map(([ad, kalem, denetim, once, sonra]) => ({ ad, kalem, denetim, once: +once, sonra: +sonra }));

export const KALEMLER = KALIP.map((k) => k.kalem);
export const BASLANGIC = "portal-hizmet-hesabi";

// Acik kalem kumesiyle yuruyus: ulasilan kalem ve yurunen kenarlar.
export function yuru(acik) {
  const varis = { [BASLANGIC]: 0 }, adim = [];
  for (;;) {
    let en = null;
    for (const e of KENAR) {
      if (!(e.k in varis) || e.h in varis) continue;
      if (e.y !== "-" && !acik.has(e.y)) continue;
      const t = varis[e.k] + e.d;
      if (en === null || t < en.t) en = { e, t };
    }
    if (en === null) return { kalem: Object.keys(varis).length, adim };
    varis[en.e.h] = en.t; adim.push(en.e);
  }
}

const gen = (B) => (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))
  .join("");

if (import.meta.url === `file://${process.argv[1]}`) {
  const tum = new Set(KALEMLER), tam = yuru(tum);
  console.log(`${KALIP.length} kalip, ${KENAR.length} kenar; hepsi acikken yaricap ` +
    `${tam.kalem}/28, yurunen adim ${tam.adim.length}`);
  const yz = gen([30, 21, 14, 12, 8]);
  console.log("\n" + yz(["kalip", "acilan adim", "kayit", "yaricap", "katki"]));
  const sirali = KALIP.map((p) => {
    const a = new Set(KALEMLER); a.delete(p.kalem);
    const kenar = KENAR.find((e) => e.y === p.kalem);
    return { ...p, tur: kenar.t, kayit: KAYIT[kenar.t], yaricap: yuru(a).kalem };
  }).sort((a, b) => a.yaricap - b.yaricap);
  for (const p of sirali)
    console.log(yz([p.ad, p.tur, p.kayit, `${tam.kalem} -> ${p.yaricap}`, tam.kalem - p.yaricap]));

  const gorunen = sirali.filter((p) => p.kayit === "yonetim").length;
  console.log(`\n${KALIP.length} kalibin ${gorunen} tanesi yonetim duzlemi kaydina dusen bir ` +
    `adimla acilir, ${sirali.filter((p) => p.kayit === "saglayicida").length} tanesi yalniz ` +
    `saglayicida duran bir adimla, ${sirali.filter((p) => p.kayit === "kayitsiz").length} tanesi ` +
    `hicbir kayda dusmeyen bir adimla`);
  const en = sirali[0];
  console.log(`en buyuk katkiyi ${en.ad} kalibi veriyor: tek basina ${en.yaricap} -> ` +
    `${tam.kalem}, yani ${tam.kalem - en.yaricap} kalem, ve acilan adim ${en.kayit} sinifinda`);
  console.log(`o kalibi kapatan denetim (${en.denetim}) gereken on kosulu ${en.once} -> ` +
    `${en.sonra} yapiyor: kimligi isteyen yazilimin ayrica oturum duzeyinde dogrulanmis olmasi ` +
    `gerekir`);
}
13 kalip, 23 kenar; hepsi acikken yaricap 23/28, yurunen adim 22

kalip                                   acilan adim         kayit     yaricap   katki
meta-veri-servisinden-kimlik     ornek-kimligi-alma      kayitsiz     23 -> 6      17
yatay-rol-gecisi                       rol-ustlenme       yonetim    23 -> 14       9
sir-deposuna-genis-erisim                 sir-okuma       yonetim    23 -> 17       6
sirdan-uzun-omurlu-kimlik                 sir-okuma       yonetim    23 -> 18       5
rol-zinciri                            rol-ustlenme       yonetim    23 -> 18       5
yedeklemeden-dagitima                  rol-ustlenme       yonetim    23 -> 20       3
is-yukunden-rol-ustlenme               rol-ustlenme       yonetim    23 -> 21       2
kosulsuz-anahtar-kullanimi            anahtar-cozme       yonetim    23 -> 21       2
kosulsuz-anahtar-cozme                anahtar-cozme       yonetim    23 -> 22       1
sablon-deposuna-yazma                   nesne-okuma   saglayicida    23 -> 22       1
dagitimdan-yeni-ornek             ornek-ici-calisma       ajansiz    23 -> 22       1
gunluk-okuma                            nesne-okuma   saglayicida    23 -> 22       1
yapilandirma-okuma                      nesne-okuma   saglayicida    23 -> 23       0

13 kalibin 8 tanesi yonetim duzlemi kaydina dusen bir adimla acilir, 3 tanesi yalniz saglayicida duran bir adimla, 1 tanesi hicbir kayda dusmeyen bir adimla
en buyuk katkiyi meta-veri-servisinden-kimlik kalibi veriyor: tek basina 6 -> 23, yani 17 kalem, ve acilan adim kayitsiz sinifinda
o kalibi kapatan denetim (oturum-basina-dogrulama) gereken on kosulu 1 -> 3 yapiyor: kimligi isteyen yazilimin ayrica oturum duzeyinde dogrulanmis olmasi gerekir

Tablo tek bir sıralamayla okunmalı: katkı sütunu. On üç kalıbın biri yarıçapı on yedi kalem büyütüyor, biri dokuz, biri altı; kalan onunun toplamı bunların hiçbirine yaklaşmıyor. En alttaki kalıp — yapılandırma kovasının geniş okumaya açık olması — yarıçapı hiç değiştirmiyor, çünkü o kova zaten dağıtım rolünden meşru bir kenarla ulaşılabilir durumda. Kalıbın var olması onu bir risk kalemi yapmıyor; onu ölçen şey, kapatıldığında kaç kalem eksiliyor sorusudur. Aynı ölçüt listenin ortasını da ayırıyor: iki kalıp beşer kalem getiriyor ama farklı adım türlerinden açıldıkları için tek bir denetimle birlikte kapanmıyorlar.

Kayıt sütunu ikinci bir sıralama veriyor ve birinciyle ters düşüyor. On üç kalıbın sekizi yönetim düzlemi kaydına düşen bir adımla açılıyor: rol üstlenme, sır okuma, anahtar çözme. Üçü yalnız sağlayıcıda duran bir adımla, biri hiç kayıt bırakmayan bir adımla, biri de kayıt ajanı bulunmayan bir örnekte. Kayda düşen sekiz kalıbın toplam katkısı yirmi sekiz kalemdir; kayda düşmeyen tek kalıbın katkısı on yedidir.

Kaydın Görmediği Kalıp

O tek kalıp adıyla anlatılmalıdır, çünkü hem en büyük katkıyı veriyor hem de hiçbir kayda düşmüyor: örneğe bağlı kimliğin örnek meta veri servisinden alınması.

Kalıbın açtığı yol tek bir tasarım kararından doğar. Bir örneğe kimlik verildiğinde, o kimliği isteyen yazılımın kim olduğu değil, nerede koştuğu sorulur. Kimlik, örnek üzerinde çalışıyor olmanın karşılığıdır. Bunun sonucu şudur: örneğin üzerine ilgisiz bir kusurla ulaşmış herhangi bir yazılım da, o örnekte meşru olarak koşan uygulama kadar kimlik sahibidir. Bir web katmanındaki hata, bir bağımlılıktan gelen kod ya da bir hata ayıklama aracı — hepsi aynı kimliği ister ve alır. Grafikte bu, yürüyüşün ikinci adımıdır ve tek başına on yedi kalem kazandırır.

İkinci sonuç tespit tarafındadır. Kimliğin verilmesi kiracının hesabında bir yönetim düzlemi çağrısı değildir; örneğin kendi içinde geçer. Kiracının okuyabildiği hiçbir kayda düşmez. Yarıçabı en çok büyüten adım, aynı zamanda kayıtta hiç görünmeyen adımdır — birinci dersteki kör önek tam olarak bu adımdan doğuyordu.

Kapatan denetim, kimliği veren tarafın soruyu değiştirmesidir: kimlik, oturum düzeyinde doğrulanmış bir isteyene verilir. Modelde bu, kalıbın ön koşulunu birden üçe çıkarır — örnek üzerinde kod çalıştırmak artık yetmez, isteyen yazılımın başlatılırken kendisine verilmiş bir oturum kanıtını da taşıması gerekir. Sonradan örneğe ulaşan yazılımda bu kanıt yoktur.

Denetim Sırası

Katkı sütunu tek başına bir sıra vermez, çünkü denetimlerin bedeli eşit değildir. Aşağıdaki dosya aynı on üç denetimi iki ayrı ölçütle sıraya koyar ve her adımda yarıçapı yeniden koşturur: birincisi her adımda birim bedel başına en çok kalem indireni seçer, ikincisi yalnızca en ucuz olanı. İkinci ölçüt uydurma bir karşılaştırma değildir; kısıtlı bir bütçeyle çalışan bir ekibin doğal sırasıdır — önce kimseyi durdurmayan kalemler kapatılır.

// oncelik.mjs — denetimlerin hangi sirayla kapatildigi yaricapin ne kadar hizli dustugunu
// belirler. MODELDIR.
import { KALIP, KALEMLER, yuru } from "./kalip.mjs";

// Denetimin durdurdugu mesru is sayisi (kurgu birim, MODEL girdisi).
const BEDEL = Object.fromEntries(`
  oturum-basina-dogrulama|2          sir-erisimini-kapsamla-sinirla|1
  sirda-yalniz-kisa-omurlu-kimlik|2  is-yuku-kimligini-roldan-ayir|1
  kimlige-gore-rol-daraltma|2        anahtar-kullanimina-kosul|1
  anahtar-politikasina-kosul|1       zincir-derinligi-siniri|3
  yedekleme-rolunden-dagitimi-al|1   sablon-deposunu-salt-okur-yap|2
  dagitim-rolunden-ornek-yetkisi|1   kova-politikasini-daraltma|1
  gunluk-kovasini-kapatma|1`.trim().replace(/\s{2,}/g, "\n").split("\n")
  .map((l) => { const [a, b] = l.trim().split("|"); return [a, +b]; }));

const yaricap = (kapali) => yuru(new Set(KALEMLER.filter((y) =>
  !KALIP.some((p) => p.kalem === y && kapali.has(p.denetim))))).kalem;

// Iki siralama: "birim" her adimda bedel basina en cok kalem indireni secer,
// "ucuz" ise yalnizca en ucuz denetimi secer.
function sirala(olcut) {
  const kapali = new Set(), sira = [];
  let simdi = yaricap(kapali), bedel = 0;
  while (kapali.size < KALIP.length) {
    let en = null;
    for (const p of KALIP) {
      if (kapali.has(p.denetim)) continue;
      const dus = simdi - yaricap(new Set([...kapali, p.denetim]));
      const puan = olcut === "birim" ? dus / BEDEL[p.denetim] : -BEDEL[p.denetim];
      if (en === null || puan > en.puan) en = { p, dus, puan };
    }
    kapali.add(en.p.denetim); bedel += BEDEL[en.p.denetim]; simdi -= en.dus;
    sira.push({ denetim: en.p.denetim, dus: en.dus, bedel, yaricap: simdi });
  }
  return sira;
}

const gen = (B) => (h) => h.map((v, j) => j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))
  .join("");
const yz = gen([6, 32, 9, 8, 32, 9, 8]);

const A = sirala("birim"), B = sirala("ucuz");
console.log(yz(["adim", "birim faydaya gore", "yaricap", "bedel", "en ucuzdan baslayarak",
  "yaricap", "bedel"]));
for (const i of [0, 1, 2, 3, 6, 9, 12])
  console.log(yz([i + 1, A[i].denetim, `${A[i].yaricap}/28`, A[i].bedel,
    B[i].denetim, `${B[i].yaricap}/28`, B[i].bedel]));

const ilk = (s, y) => s.findIndex((x) => x.yaricap <= y);
console.log(`\nyaricapi 10'un altina indirmek: birim faydaya gore ${ilk(A, 10) + 1} denetim ve ` +
  `${A[ilk(A, 10)].bedel} bedel; en ucuzdan baslayarak ${ilk(B, 10) + 1} denetim ve ` +
  `${B[ilk(B, 10)].bedel} bedel`);
console.log(`ilk denetim tek basina yaricapi 23 -> ${A[0].yaricap} indiriyor ve ` +
  `${A[0].bedel} bedel istiyor; kalan ${KALIP.length - 1} denetim ` +
  `${A.at(-1).bedel - A[0].bedel} bedelle ${A[0].yaricap - A.at(-1).yaricap} kalem indiriyor`);
const sifir = A.filter((s) => s.dus === 0);
console.log(`${sifir.length} denetim hicbir kalem indirmiyor ve toplam ` +
  `${sifir.reduce((t, s) => t + BEDEL[s.denetim], 0)} bedel istiyor; on ucunun tamami ` +
  `kapatildiginda yaricap ${A.at(-1).yaricap}/28 ve toplam bedel ${A.at(-1).bedel}`);
adim                birim faydaya gore  yaricap   bedel           en ucuzdan baslayarak  yaricap   bedel
1              oturum-basina-dogrulama     6/28       2  sir-erisimini-kapsamla-sinirla    17/28       1
2           kova-politikasini-daraltma     5/28       3   is-yuku-kimligini-roldan-ayir    17/28       2
3              gunluk-kovasini-kapatma     4/28       4       anahtar-kullanimina-kosul    15/28       3
4       sir-erisimini-kapsamla-sinirla     4/28       5      anahtar-politikasina-kosul    15/28       4
7            kimlige-gore-rol-daraltma     4/28      10      kova-politikasini-daraltma    11/28       7
10             zincir-derinligi-siniri     4/28      15 sirda-yalniz-kisa-omurlu-kimlik     4/28      12
13      dagitim-rolunden-ornek-yetkisi     4/28      19         zincir-derinligi-siniri     4/28      19

yaricapi 10'un altina indirmek: birim faydaya gore 1 denetim ve 2 bedel; en ucuzdan baslayarak 8 denetim ve 8 bedel
ilk denetim tek basina yaricapi 23 -> 6 indiriyor ve 2 bedel istiyor; kalan 12 denetim 17 bedelle 2 kalem indiriyor
10 denetim hicbir kalem indirmiyor ve toplam 15 bedel istiyor; on ucunun tamami kapatildiginda yaricap 4/28 ve toplam bedel 19

Sıralamanın Bedeli

İki sütun aynı on üç denetimi aynı grafiğe uyguluyor ve aynı yere varıyor: on üçünün tamamı kapatıldığında yarıçap 4, toplam bedel 19. Fark yolda. Birim faydaya göre sıralamada ilk denetim yarıçapı 23’ten 6’ya indiriyor ve iki bedel istiyor; kalan on iki denetim on yedi bedel harcayıp yalnızca iki kalem daha indiriyor. En ucuzdan başlayan sıralamada aynı yarıçap sekiz denetim ve sekiz bedel sonra geliyor.

Buradan iki cümle çıkıyor. Birincisi: denetim sayısı bir ölçü değildir. İkinci sütunun dördüncü adımında dört denetim kapatılmış ve yarıçap hâlâ 15’tir; birinci sütunun birinci adımında bir denetim kapatılmış ve yarıçap 6’dır. “Kaç denetim uygulandı” sorusu, “yarıçap kaça indi” sorusunun yerine geçemez. İkincisi: on üç denetimin onu bu grafikte hiçbir kalem indirmiyor ve toplam on beş bedel istiyor. Bunların hepsi tek tek savunulabilir kalemlerdir — anahtar politikasına koşul eklemek, şablon deposunu salt okunur yapmak, zincir derinliğini sınırlamak — ama bu grafikte katkıları sıfırdır, çünkü kapattıkları kenarların hedefine başka bir kenardan da ulaşılıyor.

Bu, o denetimlerin gereksiz olduğu anlamına gelmez; ölçünün grafiğe bağlı olduğu anlamına gelir. Grafik değiştiğinde — bir kenar meşrulaştığında, bir kalem eklendiğinde — sıfır katkılı denetim birdenbire en yüksek katkılı olabilir. Bu yüzden sıralama bir kez yapılıp bırakılmaz; her yapılandırma değişikliğinde yeniden koşturulur.

Özet

  • On üç kalıp aynı grafikte kalem, açılan adım, kayıt sınıfı ve kapatan denetim dörtlüsüyle yazıldı; katkılar 17, 9, 6, 5, 5 ile başlayıp sıfıra iniyor.
  • Kalıpların sekizi yönetim düzlemi kaydına düşen bir adımla açılıyor, üçü yalnız sağlayıcıda duran bir adımla, biri hiçbir kayda düşmeyen bir adımla, biri ajansız bir örnekte.
  • En büyük katkıyı veren kalıp — örneğe bağlı kimliğin nerede koşulduğuna bakılarak verilmesi — tek başına on yedi kalem getiriyor ve kayıtsız sınıfta; kayıtta hiç görünmüyor.
  • O kalıbı kapatan denetim soruyu değiştirir: kimlik, oturum düzeyinde doğrulanmış bir isteyene verilir ve kalıbın ön koşulu birden üçe çıkar.
  • Bir kalıp yarıçapı hiç değiştirmiyor, çünkü hedefine meşru bir kenardan da ulaşılıyor; on üç denetimin onu bu grafikte sıfır kalem indiriyor ve on beş bedel istiyor.
  • Sıralama bedeli belirliyor: birim faydaya göre bir denetim ve iki bedel, en ucuzdan başlayarak sekiz denetim ve sekiz bedel aynı yarıçapı veriyor.

Sonraki Adım

Kalıplar sayıldı, kayıtları sınıflandı ve kapatan denetimler sıraya kondu. Geriye bir soru kalıyor: bu kalıplardan biri gerçekten işlediğinde ne toplanabiliyor. Önceki derslerde kanıtın bir bölümünün toplanamadığı görüldü; sonraki ders bunu konak imajıyla karşılaştırarak sayar — konakta toplanabilen kaç kalem bulutta toplanamıyor, yalıtım hangi düzlemden yapılıyor ve anlık görüntünün kanıt değeri nedir.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat