---
title: 'Dış Bildirim Kanalı'
source: 'https://academia.sh/tr/kurslar/uygulama-tespit-ve-uyumluluk/dis-bildirim-kanali'
course: 'Tespit, Müdahale ve Uyumluluk'
language: tr
updated: '2026-08-17T18:06:41+00:00'
license: 'CC BY-SA 4.0'
---

# Dış Bildirim Kanalı

180 günde gelen 340 bildirimin 91'i benzersiz; 190'ı yinelenen, 59'u kapsam dışı, yani kuyruğun yüzde 73'ü yeni açık taşımıyor. Günde iki kalemlik ilk bakış kapasitesinde kuyruk 104 kaleme çıkıyor ve ortalama bekleme 31,2 gün oluyor. Dört kayıt şemasıyla koşturulduğunda doğrulama 28,6 günden 25,8 güne iniyor ama bildirimden düzeltmeye 85,7 günden 89,9 güne çıkıyor. İstismar sorusuna kesin cevap 15'ten 20'ye çıkıp en geniş şemada 13'e iniyor; aynı sayıyı 24'e çıkaran şey ek alan değil, ilk bakış kapasitesinin 2'den 5'e çıkarılması.

Buraya kadar bütün kayıtlar ve uyarılar kurumun kendi içinden geldi. Bir uygulamanın açığı çoğu
zaman başka bir yerden duyulur: dışarıdan bakan biri onu bulur ve bildirir. **Dış bildirim kanalı
ve ödül programı**, bu bildirimlerin girdiği yapıdır. Bildiren tarafın süreci Güvenlik Araçları ve
Sızma Testi kursunda ölçülmüştü; burada tekrarlanmaz, girdi olur. Bu ders akışı **işleten** tarafı
ölçer ve birimi gündür: bildirimden doğrulamaya kaç gün, doğrulamadan düzeltmeye kaç gün, gelen
bildirimin kaçı yinelenen.

- **UM22.** Bildirim akışı **kurgudur**: 180 günde 340 bildirim, 120 açık, beş bulgu sınıfı.
  Sayılar tohumu görünen bir üreteçten gelir.
- **UM23.** Aynı açık birden çok kez bildirilir. Bir açığın ilk bildirimi **benzersiz**,
  sonrakiler **yinelenendir**; hiçbir açığa düşmeyen bildirim **kapsam dışıdır**.
- **UM24.** **İlk bakış kuyruğu** geliş sırasıyla işler; kapasiteyi bildirimin türü değil
  **sayısı** tüketir.
- **UM25.** Doğrulama iki yoldan yapılır: gereken alanlar tek bir eşlenebilir kümedeyse
  **kayıttan** bir günde, değilse **elle yeniden üretimle** sınıfa göre üç ile dokuz gün arasında.
- **UM26.** Her bildirim ikinci bir soru doğurur: **bu açık daha önce kullanıldı mı.** Kayıt
  doğrulama gününden `saklama` gün geriye uzanır ve kuyrukta geçen süre bu pencereden düşer.
  Üç sonuç vardır: **kesin**, **kısmi** (yalnız pencere kadar geriye bakılabilmiştir) ve
  **cevapsız** (alan yoktur).
- **UM27.** Şemalar ve saklama günleri önceki derslerin modelinden **veri** olarak gelir. Ödül
  **kurgu birimdir**; süreler bu sayfada yapılmış bir ölçüm değildir.

## Gelen Bildirim, Yinelenen ve İlk Bakış Kuyruğu

```js
// bildirim.mjs — dis bildirim kanali ve odul programi, akisi isleten taraftan olculur:
// kac bildirim geliyor, kaci yinelenen, ilk bakisa kadar kac gun geciyor. MODELDIR.
export const TOHUM = 20260611, ACIK = 120, BILDIRIM = 340, DONEM = 180, TRIAJ = 2;
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };
const r = uretec(TOHUM);

// gorunurluk: acigin kac kez bildirilecegi. alan: istismar sorusunun istedigi kayit alani.
export const SINIF = [
  { ad: "yapilandirma", pay: 0.26, gorunurluk: 3.4, elle: 3, duzelt: 2, odul: 8,
    alan: ["yol", "durum"] },
  { ad: "girdi dogrulama", pay: 0.21, gorunurluk: 2.2, elle: 5, duzelt: 3, odul: 15,
    alan: ["iz", "yol", "yontem"] },
  { ad: "yetki atlama", pay: 0.20, gorunurluk: 1.0, elle: 8, duzelt: 6, odul: 40,
    alan: ["aktor", "eylem", "yetki_karari"] },
  { ad: "veri sizintisi", pay: 0.18, gorunurluk: 1.4, elle: 9, duzelt: 8, odul: 55,
    alan: ["aktor", "eylem", "nesne"] },
  { ad: "oturum yonetimi", pay: 0.15, gorunurluk: 0.8, elle: 7, duzelt: 5, odul: 30,
    alan: ["oturum", "eylem"] },
];
const sinifSec = (u) => { let t = 0;
  for (const s of SINIF) { t += s.pay; if (u < t) return s; } return SINIF.at(-1); };

// Acik = bildirimin arkasindaki gercek kalem; ayni acik gorunurlugu oraninda cok bildirilir.
export const ACIKLAR = Array.from({ length: ACIK }, () => {
  const s = sinifSec(r());
  return { sinif: s.ad, agirlik: s.gorunurluk * (0.3 + 1.4 * r()),
    yas: Math.round(8 + 340 * r() ** 1.6) };
});
const TOP = ACIKLAR.reduce((t, a) => t + a.agirlik, 0);
const acikSec = (u) => { let t = 0;
  for (let i = 0; i < ACIK; i++) { t += ACIKLAR[i].agirlik / TOP; if (u < t) return i; }
  return ACIK - 1; };

// Kanal acilinca hacim one yigilir: gelis gunu DONEM * u^2.2. Yuzde 18 kapsam disidir.
export const BILDIRIMLER = Array.from({ length: BILDIRIM }, (_, i) => ({
  i, gun: Math.floor(DONEM * r() ** 2.2), acik: r() < 0.18 ? null : acikSec(r()),
})).sort((a, b) => a.gun - b.gun);
const gorulen = new Set();
for (const b of BILDIRIMLER) {
  b.tur = b.acik === null ? "kapsam disi" : gorulen.has(b.acik) ? "yinelenen" : "benzersiz";
  gorulen.add(b.acik);
}
export const say = (x) => BILDIRIMLER.filter((b) => b.tur === x).length;

// Ilk bakis kuyrugu: gunde `hiz` kalem, gelis sirasiyla; kapasiteyi tur degil sayi tuketir.
export function triaj(hiz = TRIAJ, yaz = false) {
  const kuyruk = [], bakis = new Array(BILDIRIM);
  let zirve = 0, j = 0;
  for (let g = 0; j < BILDIRIM || kuyruk.length; g++) {
    while (j < BILDIRIM && BILDIRIMLER[j].gun === g) kuyruk.push(BILDIRIMLER[j++]);
    zirve = Math.max(zirve, kuyruk.length);
    for (let k = 0; k < hiz && kuyruk.length; k++) {
      const b = kuyruk.shift();
      bakis[b.i] = g;
      if (yaz) b.bakis = g;
    }
  }
  return { zirve, son: Math.max(...bakis),
    bekleme: BILDIRIMLER.reduce((t, b) => t + (bakis[b.i] - b.gun), 0) / BILDIRIM };
}

export 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 bos = say("yinelenen") + say("kapsam disi");
  console.log(`model (tohum ${TOHUM}): ${DONEM} gunde ${BILDIRIM} bildirim, ${ACIK} acik, ` +
    `ilk 30 gunde ${BILDIRIMLER.filter((b) => b.gun < 30).length} bildirim`);
  console.log(`benzersiz ${say("benzersiz")}, yinelenen ${say("yinelenen")}, kapsam disi ` +
    `${say("kapsam disi")}: yuzde ${((bos / BILDIRIM) * 100).toFixed(0)}'i yeni acik degil`);
  const y = gen([18, 10, 11, 11, 10]);
  console.log("\n" + y(["sinif", "bildirim", "benzersiz", "yinelenen", "ort. yas"]));
  for (const s of SINIF) {
    const l = BILDIRIMLER.filter((b) => b.acik !== null && ACIKLAR[b.acik].sinif === s.ad);
    const be = l.filter((b) => b.tur === "benzersiz");
    console.log(y([s.ad, l.length, be.length, l.length - be.length,
      (be.reduce((a, b) => a + ACIKLAR[b.acik].yas, 0) / be.length).toFixed(0)]));
  }
  const z = gen([10, 9, 15, 12]);
  console.log("\n" + z(["kapasite", "zirve", "ort. bekleme", "son bakis"]));
  for (const hiz of [1, 2, 3, 5]) {
    const t = triaj(hiz);
    console.log(z([`${hiz}/gun`, t.zirve, t.bekleme.toFixed(1), t.son]));
  }
}
```

```
model (tohum 20260611): 180 gunde 340 bildirim, 120 acik, ilk 30 gunde 149 bildirim
benzersiz 91, yinelenen 190, kapsam disi 59: yuzde 73'i yeni acik degil

sinif               bildirim  benzersiz  yinelenen  ort. yas
yapilandirma             163         35        128       151
girdi dogrulama           44         20         24       120
yetki atlama              35         17         18       153
veri sizintisi            24         11         13       136
oturum yonetimi           15          8          7       108

kapasite      zirve   ort. bekleme   son bakis
1/gun           174          116.1         339
2/gun           104           31.2         177
3/gun            70           10.4         177
5/gun            49            2.3         177
```

Üç yüz kırk bildirimin doksan biri yeni bir açık taşıyor. Kalan 249 kalem — 190 yinelenen ve 59
kapsam dışı — kuyruğun yüzde 73'üdür. Bu oran kanalın kalitesizliğinden değil **yapısından**
gelir: kanal herkese açıktır, aynı açığı gören herkes bildirir ve kimin daha önce bildirdiği
dışarıdan görünmez.

Sınıf tablosu yığılmanın nerede olduğunu yazıyor. Yapılandırma sınıfı 163 bildirim üretir ve
bunların ancak 35'i yeni bir açıktır; oturum yönetimi sınıfında 15 bildirim, 8 benzersiz açık
vardır. **Bir bulgu sınıfının kanaldaki payı, o sınıfın kurumda kaç açık bıraktığını değil,
dışarıdan ne kadar kolay görüldüğünü ölçer.** Kuyruğun bileşimi kurumun açık dağılımının değil,
dış görünürlük dağılımının fotoğrafıdır.

Son sütun bu dersin ikinci yarısını hazırlıyor. Bildirilen açıkların ortalama yaşı 108 ile 153
gün arasındadır: bir açık bildirildiğinde çoktan aylardır oradadır. "Bu açık daha önce kullanıldı
mı" sorusu yüz günden uzun bir geçmişe bakmayı gerektirir; önceki derslerin saklama penceresi ise
45 ile 65 gün arasındaydı.

Kuyruk tablosu üçüncü sayıyı veriyor. Günde iki kalemlik ilk bakış kapasitesinde kuyruk 104
kaleme çıkar ve bir bildirim ortalama 31,2 gün bekler. Kapasite bire indiğinde son bildirime 339.
günde bakılır: dönem 180 gündür, yani kanal kendi dönemine yetişemez. Yığılmanın nedeni ortalama
hacim değildir; ilk 30 günde 149 bildirim gelir, dönem toplamının yüzde 44'ü ilk altıda birlik
dilimdedir. **Kanalın açılması bir yük eğrisi doğurur; kapasite ortalama gelişe göre seçildiğinde
zirvede tıkanır ve tıkanma tek seferlik değil kalıcıdır.**

## Doğrulama, İstismar Sorusu ve Düzeltme Kuyruğu

```js
// dogrulama.mjs — benzersiz bildirimler dort kayit semasiyla kosturulur: dogrulama
// kayittan mi elle mi, istismar sorusu cevaplaniyor mu, duzeltme ne zaman. MODELDIR.
import { BILDIRIMLER, ACIKLAR, SINIF, triaj, say, gen, BILDIRIM } from "./bildirim.mjs";

const K1 = ["zaman", "iz", "aktor", "eylem", "sonuc", "yol", "yontem", "durum", "istemci_ip"];
const K2 = ["zaman", "tablo", "nesne", "islem"];
const EK = ["yetki_karari", "surum", "oturum", "once_deger"];
export const SEMA = [
  { ad: "taban", saklama: 65, kat: 1.00, ek: 0, kume: [K1, K2] },
  { ad: "+iz", saklama: 64, kat: 1.02, ek: 1, kume: [[...K1, ...K2]] },
  { ad: "+karar+surum", saklama: 62, kat: 1.04, ek: 3,
    kume: [[...K1, ...K2, ...EK.slice(0, 2)]] },
  { ad: "+oturum+deger", saklama: 45, kat: 1.45, ek: 5, kume: [[...K1, ...K2, ...EK]] },
];
export const KAPASITE = 2;   // duzeltme icin gunde ayrilan gun-is
const varMi = (sema, a) => sema.kume.some((c) => a.every((x) => c.includes(x)));

// Dogrulama kayittan 1 gun, kayitsiz sinifin elle yeniden uretim gunudur. Istismar
// sorusunda kayit `saklama` gun geriye uzanir; kuyrukta gecen `sure` pencereden duser.
export function kos(sema, hiz = 2) {
  triaj(hiz, true);
  const kalem = BILDIRIMLER.filter((b) => b.tur === "benzersiz").map((b) => {
    const a = ACIKLAR[b.acik], s = SINIF.find((x) => x.ad === a.sinif);
    const kayittan = varMi(sema, s.alan);
    const sure = b.bakis - b.gun + (kayittan ? 1 : s.elle);
    return { b, s, kayittan, sure, dogrulama: b.gun + sure,
      istismar: !kayittan ? "cevapsiz" : a.yas <= sema.saklama - sure ? "kesin" : "kismi" };
  }).sort((x, y) => x.dogrulama - y.dogrulama);

  // Duzeltme kuyrugu: gunde KAPASITE gun-is havuza eklenir, sirayi odulu yuksek alir.
  const bekleyen = [];
  let j = 0, havuz = 0;
  for (let g = kalem[0].dogrulama; j < kalem.length || bekleyen.length; g++) {
    while (j < kalem.length && kalem[j].dogrulama <= g) bekleyen.push(kalem[j++]);
    havuz = bekleyen.length ? havuz + KAPASITE : KAPASITE;
    bekleyen.sort((x, y) => y.s.odul - x.s.odul);
    while (bekleyen.length && havuz >= bekleyen[0].s.duzelt)
      { const k = bekleyen.shift(); havuz -= k.s.duzelt; k.duzeltme = g; }
  }
  const n = kalem.length, top = (f) => kalem.reduce((t, k) => t + f(k), 0);
  const sayi = (x) => kalem.filter((k) => k.istismar === x).length;
  return { n, kalem, kayittan: kalem.filter((k) => k.kayittan).length,
    dogrulamaGun: top((k) => k.sure) / n, toplamGun: top((k) => k.duzeltme - k.b.gun) / n,
    duzeltmeGun: top((k) => k.duzeltme - k.dogrulama) / n, odul: top((k) => k.s.odul),
    kesin: sayi("kesin"), kismi: sayi("kismi"), cevapsiz: sayi("cevapsiz") };
}

if (import.meta.url === `file://${process.argv[1]}`) {
  const y = gen([16, 9, 10, 12, 12, 8, 8, 10]);
  console.log(y(["sema", "saklama", "kayittan", "dogrulama", "duzeltme", "kesin", "kismi",
    "cevapsiz"]));
  const sonuc = SEMA.map((s) => {
    const o = kos(s);
    console.log(y([s.ad, `${s.saklama} gun`, `${o.kayittan}/${o.n}`,
      `${o.dogrulamaGun.toFixed(1)} gun`, `${o.duzeltmeGun.toFixed(1)} gun`,
      o.kesin, o.kismi, o.cevapsiz]));
    return o;
  });
  const [a, , c, d] = sonuc, h5 = SEMA.map((s) => kos(s, 5));
  const el = a.kalem.filter((k) => !k.kayittan), o = (l) => l.reduce((t, k) => t + k.s.odul, 0);
  console.log(`\nbildirimden duzeltmeye ${a.toplamGun.toFixed(1)} gunden ` +
    `${d.toplamGun.toFixed(1)} gune cikiyor; kesin cevap ${SEMA[2].ad} semasinda ` +
    `${c.kesin} ile en yuksek, ${SEMA[3].ad} semasinda ${d.kesin}`);
  console.log(`kapasite 2'den 5'e cikinca kesin cevap ${sonuc.map((x) => x.kesin).join("/")} ` +
    `yerine ${h5.map((x) => x.kesin).join("/")}: alan eklenmeden ` +
    `${h5[3].kesin - d.kesin} bildirim daha kesin cevap aliyor`);
  console.log(`elle dogrulanan ${el.length} bildirimin odulu ${o(el)} kurgu birim, ` +
    `kayittan dogrulanan ${a.n - el.length} bildirimin ${a.odul - o(el)}`);
}
```

```
sema              saklama  kayittan   dogrulama    duzeltme   kesin   kismi  cevapsiz
taban              65 gun     55/91    28.6 gun    57.1 gun      15      40        36
+iz                64 gun     66/91    27.6 gun    60.8 gun      18      48        25
+karar+surum       62 gun     83/91    26.3 gun    63.6 gun      20      63         8
+oturum+deger      45 gun     91/91    25.8 gun    64.2 gun      13      78         0

bildirimden duzeltmeye 85.7 gunden 89.9 gune cikiyor; kesin cevap +karar+surum semasinda 20 ile en yuksek, +oturum+deger semasinda 13
kapasite 2'den 5'e cikinca kesin cevap 15/18/20/13 yerine 18/21/24/24: alan eklenmeden 11 bildirim daha kesin cevap aliyor
elle dogrulanan 36 bildirimin odulu 1525 kurgu birim, kayittan dogrulanan 55 bildirimin 580
```

Doğrulama sütunu kayıt tasarımının zaferi gibi durur: kayıttan doğrulanan bildirim 55'ten 91'e
çıkar, ortalama doğrulama 28,6 günden 25,8 güne iner. Kazanç 2,8 gündür. Aynı şemalar önceki
derste müdahaleyi 4,17 kat kısaltmıştı; burada oran 1,11'dir, çünkü sürenin baskın terimi
doğrulama işi değil **kuyruk beklemesidir**. **Bir işin süresini kısaltan kayıt alanı, o iş bir
kuyruğun arkasındaysa toplam süreyi ancak kuyruğun bıraktığı kadar kısaltır.**

Düzeltme sütunu ters yöne gider: 57,1 günden 64,2 güne çıkar, bildirimden düzeltmeye geçen toplam
süre de 85,7'den 89,9 güne. Doğrulama hızlandıkça kalemler düzeltme kuyruğuna daha erken girer,
kuyruk kapasitesi ise sabittir; **kazanılan gün bir sonraki kuyruğa taşınır ve orada beklenir.**
Darboğaz kayıt tasarımı değil, günde iki gün-işlik düzeltme kapasitesidir.

Son üç sütun bu kursun ölçü birimini yazıyor. Cevapsız soru şema genişledikçe 36'dan sıfıra iner:
en geniş şemada 91 bildirimin hepsi için istismar sorusu **sorulabilir**. Ama kesin cevap 15'ten
20'ye çıktıktan sonra 13'e, taban şemanın da altına düşer. En geniş şema hiçbir soruyu cevapsız
bırakmaz ve en az kesin cevap verir.

Mekanizma UM26'dadır: kesin cevabın koşulu, açığın yaşının **saklama eksi geçen süre** kadar
pencereye sığmasıdır. En geniş şemada saklama 45, ortalama süre 25,8 gündür; geriye yaklaşık 19
günlük bir pencere kalır, oysa bildirilen açıkların ortalama yaşı 108 ile 153 gün arasındadır.
**Kuyrukta geçen her gün saklama penceresinden düşer.** Hacimle saklamayı takas eden tasarımın dış
bildirim akışındaki faturası budur: 5 ek alan, 1,45 kat günlük hacim ve 20 gün daha kısa saklama
karşılığında kesin cevap iki birim **azalır**.

Üçüncü çıktı satırı aynı sayıyı ikinci bir kolla oynatıyor. İlk bakış kapasitesi ikiden beşe
çıkarıldığında kesin cevap dizisi 15/18/20/13 yerine 18/21/24/24 olur; en geniş şemadaki bu artış
**hiçbir kayıt alanı eklenmeden, hiçbir hacim ödenmeden** kazanılır. **İlk bakış kapasitesi bir
hizmet düzeyi kararı gibi görünür; ölçüldüğünde bir kayıt kararı olduğu çıkar.**

Ödül tarafı bedelin son sütununu yazıyor. Taban şemada elle doğrulanan 36 bildirimin ödül toplamı
1 525 kurgu birim, kayıttan doğrulanan 55 bildiriminki 580 birimdir. Ödülü yüksek sınıflar kayıttan
doğrulanamayanlardır; ucuz ve çok bildirilen yapılandırma sınıfı bir günde kapanır. **Doğrulama
yükü ile ödül bütçesi aynı yöne gider: en pahalı bulgular en yavaş doğrulananlardır.** Ödül almayan
249 kalem ise ilk bakış kapasitesinin yüzde 73'ünü tüketir; ödül programının asıl maliyeti ödenen
birimde değil, ödenmeyen kalemlerin tuttuğu sıradadır.

## Özet

- Dış bildirim kanalı bir tespit hattı değil bir kuyruktur: modelde 340 bildirimin 91'i yeni bir
  açık taşır, 190'ı yinelenen, 59'u kapsam dışıdır.
- Kuyruğun bileşimi kurumun açık dağılımını değil dış görünürlük dağılımını yansıtır: yapılandırma
  sınıfı 163 bildirimle kanalın yarısını doldurur, arkasında yalnız 35 açık vardır.
- Kapasite ortalama gelişe göre seçilemez: ilk 30 günde 149 bildirim gelir, günde iki kalemlik
  kapasitede kuyruk 104 kaleme çıkar ve ortalama bekleme 31,2 gün olur.
- Kayıt alanı eklemek doğrulamayı 28,6 günden 25,8 güne indirir, ama bildirimden düzeltmeye geçen
  süre 85,7 günden 89,9 güne çıkar: kazanılan gün sabit kapasiteli düzeltme kuyruğuna taşınır.
- Kuyrukta geçen gün saklama penceresinden düşer; en geniş şema cevapsız soruyu sıfıra indirirken
  kesin cevabı 20'den 13'e, taban şemanın 15'inin de altına düşürür.
- Bedel iki kolda ölçülür: 5 ek alan, 1,45 kat hacim ve 20 gün kısa saklama kesin cevabı
  azaltırken, ilk bakış kapasitesinin ikiden beşe çıkması aynı sayıyı alan eklemeden 24'e taşır.

## Sonraki Adım

Bu konu boyunca kayıt tasarlandı, uyarı eşiği seçildi, bir ihlal müdahale edildi, kısa ömürlü iş
yüklerinin izi ölçüldü ve dış bildirim akışı kuruldu. Her ders aynı soruyu sordu: olaydan sonra
sorulacak soruların kaçı cevaplanabiliyor ve cevaplanabilir kılmak neye mal oluyor. Geriye bir
soru kalıyor ve onu kurumun kendisi sormuyor: bütün bu pratiğin **yapıldığını** dışarıdan bakan
birine ne gösterecek. Sonraki konu bunu ölçer — bir denetim kontrol maddesinin mühendislik
karşılığı kaç pratiğe düşüyor, kaçının kanıtı hatta otomatik üretiliyor ve kaçı olaydan sonra elle
toplanıyor.
