---
title: 'Kimlik Doğrulama Gerçekleştirim Hataları'
source: 'https://academia.sh/tr/kurslar/guvenli-kodlama/kimlik-dogrulama-gerceklestirim-hatalari'
course: 'Güvenli Kodlama'
language: tr
updated: '2026-08-17T18:06:42+00:00'
license: 'CC BY-SA 4.0'
---

# Kimlik Doğrulama Gerçekleştirim Hataları

Gerçekleştirim hatasının sızdırılan bilgi cinsinden ölçülmesi: sekiz kimlik doğrulama noktasında ayrık hata mesajı, kayıt yokken atlanan iş ve ilk uyuşmazlıkta çıkan karşılaştırma üç kanal olarak sayılır ve beşi sızdırır, yanıt süresi farkı ham süre yazılmadan bant denetimiyle gösterilir, tek kanalı kapatan önlem beşten yalnız birini kapatır, üç kanalı birden kapatan merkezî doğrulayıcı dokuzuncu noktayı kendiliğinden örter ve dördüncü kanal sayıma katıldığında aynı kalıbın dışarıda bıraktığı nokta ikiye çıkar.

Önceki konu dışarıdan gelen verinin sınırını çizdi ve aynı üç sütunu her nokta kümesinde
yazdı: kaç nokta var, kalıp kaçını örtüyor, kaç nokta dışarıda kalıyor. Bütün o ölçümler tek
bir varsayımın üstünde durdu — isteğin arkasındaki kişinin kim olduğu zaten bilinmektedir.
Veri kurallara uygun olabilir ve yine de yanlış kişiden gelmiş olabilir.

Bu konu o varsayımı kaldırır. Kimlik doğrulamanın hangi akışla yapıldığı burada ele
alınmıyor; akışların türleri ve kimlik bilgisinin nasıl saklandığı Kimlik ve Yetki
kursunun konusudur. Burada ölçülen şey **gerçekleştirimdir**: doğru kimlik bilgisini hiç
bilmeyen birine sunucunun verdiği yanıt, doğru bilgiyi bilmeden de bir şey söylüyor mu?

## Sızdırılan Bilgi Sayılabilir

Bir kimlik doğrulama noktası iki şeyi ayrı ayrı bilir: aranan kayıt var mı, sunulan kimlik
bilgisi doğru mu. Yanıt yalnız ikincisini söylemelidir. Birincisinin dışarıdan ayırt
edilebilmesine **kullanıcı numaralandırma (user enumeration)** denir: saldırgan hiçbir
parolayı bilmeden, hangi abone numaralarının kayıtlı olduğunu öğrenir. Bu bilgi tek başına
erişim vermez; sonraki her denemenin hedef kümesini daraltır.

Numaralandırmayı bir servis üzerinde denemek **yazılı yetki ve tanımlı kapsam olmadan hem
yasadışı hem meslek dışıdır**. Aşağıdaki envanter ve ölçüm, kurgu bölgesel ölçüm ağının
kendi kodu üzerinde koşar; gerçek bir servis, gerçek bir hesap ve gerçek bir parola yoktur.

```js
// kimlik/nokta.mjs — abone portalinin kimlik dogrulama noktalari (model): gercek bir servis,
// gercek bir hesap ve gercek bir parola yok. Rastgelelik yok, is miktari sabittir.
import { createHash } from "node:crypto";

// KH1: bir nokta kullanici varligini uc ayri kanaldan sizdirabilir — hata mesaji ayrik mi,
// kayit yokken yapilan is farkli mi, karsilastirma ilk uyusmazlikta cikiyor mu. Dorduncu alan
// `kilit` envanterde sayilmayan bir kanaldir; dersin son bolumunde sayima katilir.
export const NOKTA = [
  { ad: "portal-giris",           mesaj: "tek",   is: "sabit",       kars: "sabit",       kilit: "ayrik" },
  { ad: "portal-sifirlama",       mesaj: "ayrik", is: "erken-donus", kars: "sabit",       kilit: "tek" },
  { ad: "portal-eposta-degistir", mesaj: "ayrik", is: "sabit",       kars: "sabit",       kilit: "tek" },
  { ad: "saha-uygulamasi-giris",  mesaj: "tek",   is: "sabit",       kars: "sabit",       kilit: "tek" },
  { ad: "sayac-alim-anahtari",    mesaj: "tek",   is: "erken-donus", kars: "erken-cikis", kilit: "tek" },
  { ad: "fatura-sorgu",           mesaj: "ayrik", is: "erken-donus", kars: "erken-cikis", kilit: "tek" },
  { ad: "ikinci-etmen-kodu",      mesaj: "tek",   is: "sabit",       kars: "sabit",       kilit: "ayrik" },
  { ad: "rapor-ucu-anahtari",     mesaj: "tek",   is: "sabit",       kars: "erken-cikis", kilit: "tek" },
];

// KH2: is birimi sabit adimli bir karma dongusudur; ham sure degil, adim sayisi yazilir.
export const ARAMA = 2000, DOGRULAMA = 20000;
const dongu = (tohum, adim) => {
  let s = tohum;
  for (let i = 0; i < adim; i++) s = createHash("sha256").update(s).digest("hex");
  return s;
};
const KAYIT = new Set(["a-4471", "a-5120", "a-6033"]);

// Kusurlu gerceklestirim: kayit yoksa dogrulama isi hic yapilmaz, mesaj da ayrilir.
export function kusurlu(abone, sunulan) {
  dongu(abone, ARAMA);
  if (!KAYIT.has(abone)) return { mesaj: "abone bulunamadi", adim: ARAMA };
  dongu(sunulan, DOGRULAMA);
  return { mesaj: "parola hatali", adim: ARAMA + DOGRULAMA };
}

// Kalipli gerceklestirim: kayit yoksa da ayni is yapilir, mesaj tektir.
export function kalipli(abone, sunulan) {
  dongu(abone, ARAMA);
  const bulundu = KAYIT.has(abone);
  dongu(bulundu ? sunulan : "yer-tutucu-karsilastirma-tohumu", DOGRULAMA);
  return { mesaj: "abone numarasi ya da parola hatali", adim: ARAMA + DOGRULAMA };
}
```

```js
// kimlik/kapsama.mjs — kac nokta var, kalip kacini ortuyor, kac nokta disarida kaliyor.
import { NOKTA, kusurlu, kalipli } from "./nokta.mjs";
const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));

// KH3: bir nokta uc kanaldan en az biri aciksa kullanici varligini sizdiriyor sayilir.
const UC = ["mesaj", "is", "kars"];
const kanal = (n, kapali = [], liste = UC) => liste.filter((k) =>
  !kapali.includes(k) && n[k] !== "tek" && n[k] !== "sabit");
const A = [-24, 7, 14, 15, 8, 12];
console.log(`1. ${NOKTA.length} kimlik dogrulama noktasi ve acik kanallari`);
yaz(A, "nokta", "mesaj", "kayit yokken", "karsilastirma", "kanal", "sizdiriyor");
for (const n of NOKTA)
  yaz(A, n.ad, n.mesaj, n.is, n.kars, kanal(n).length, kanal(n).length ? "EVET" : "hayir");
const sizan = (kume, kapali, liste) => kume.filter((n) => kanal(n, kapali, liste).length).length;
console.log(`sizdiran nokta: ${sizan(NOKTA, [])} / ${NOKTA.length}`);

// KH4: sure ham olarak yazilmaz. Beklenen oran adim sayisindan turetilir; olculen deger
// yalniz bant denetiminden gecer ve evet/hayir yazilir.
const ortanca = (d) => d.slice().sort((a, b) => a - b)[d.length >> 1];
const olc = (f, abone) => {
  const d = [];
  for (let i = 0; i < 15; i++) {
    const t = process.hrtime.bigint();
    f(abone, "sunulan-deger");
    d.push(Number(process.hrtime.bigint() - t));
  }
  return ortanca(d);
};
const B = [-12, 11, 11, 15, 14, 9, 15];
console.log("\n2. yanit suresi farki (ham sure yazilmaz; beklenen oran adim sayisindan gelir)");
yaz(B, "gercekleme", "adim yok", "adim var", "beklenen oran", "bant", "bantta", "varlik siziyor");
for (const [ad, f] of [["kusurlu", kusurlu], ["kalipli", kalipli]]) {
  const yok = f("a-0000", "x").adim, evet = f("a-4471", "x").adim;
  const beklenen = evet / yok, alt = beklenen / 2, ust = beklenen * 2;
  const olculen = olc(f, "a-4471") / olc(f, "a-0000");
  yaz(B, ad, yok, evet, beklenen.toFixed(2), `${alt.toFixed(2)}..${ust.toFixed(2)}`,
    olculen >= alt && olculen <= ust ? "evet" : "HAYIR", beklenen > 1.5 ? "EVET" : "hayir");
}

// 3. kapsama: hangi onlem kac noktayi kendiliginden kapatiyor
const YENI = { ad: "saha-cihaz-eslesme", mesaj: "ayrik", is: "erken-donus", kars: "erken-cikis" };
const genis = [...NOKTA, YENI];
const C = [-34, 7, 11, 11];
console.log("\n3. onlem kac noktayi kapatiyor");
yaz(C, "onlem", "nokta", "sizdiran", "disarida %");
for (const [ad, k, kapali] of [
  ["bugunku dagitik durum", NOKTA, []],
  ["yalniz sabit sureli karsilastirma", NOKTA, ["kars"]],
  ["yalniz tek hata mesaji", NOKTA, ["mesaj"]],
  ["merkezi dogrulayici (uc kanal)", NOKTA, ["mesaj", "is", "kars"]],
  ["yeni nokta eklendi, dagitik", genis, []],
  ["yeni nokta eklendi, merkezi kalip", genis, ["mesaj", "is", "kars"]],
]) yaz(C, ad, k.length, sizan(k, kapali), ((sizan(k, kapali) / k.length) * 100).toFixed(1));

// 4. envanterin kendisi eksikse: kilit yaniti dorduncu kanal olarak sayima katilir
const DORT = [...UC, "kilit"];
console.log("\n4. dorduncu kanal sayima katilinca");
yaz(C, "sayim", "nokta", "sizdiran", "disarida %");
for (const [ad, liste, kapali] of [
  ["uc kanal, merkezi dogrulayici", UC, UC],
  ["dort kanal, merkezi dogrulayici", DORT, UC],
  ["dort kanal, kilit yaniti da tek", DORT, DORT],
]) yaz(C, ad, NOKTA.length, sizan(NOKTA, kapali, liste),
  ((sizan(NOKTA, kapali, liste) / NOKTA.length) * 100).toFixed(1));
```

```
1. 8 kimlik dogrulama noktasi ve acik kanallari
nokta                     mesaj  kayit yokken  karsilastirma   kanal  sizdiriyor
portal-giris                tek         sabit          sabit       0       hayir
portal-sifirlama          ayrik   erken-donus          sabit       2        EVET
portal-eposta-degistir    ayrik         sabit          sabit       1        EVET
saha-uygulamasi-giris       tek         sabit          sabit       0       hayir
sayac-alim-anahtari         tek   erken-donus    erken-cikis       2        EVET
fatura-sorgu              ayrik   erken-donus    erken-cikis       3        EVET
ikinci-etmen-kodu           tek         sabit          sabit       0       hayir
rapor-ucu-anahtari          tek         sabit    erken-cikis       1        EVET
sizdiran nokta: 5 / 8

2. yanit suresi farki (ham sure yazilmaz; beklenen oran adim sayisindan gelir)
gercekleme     adim yok   adim var  beklenen oran          bant   bantta varlik siziyor
kusurlu            2000      22000          11.00   5.50..22.00     evet           EVET
kalipli           22000      22000           1.00    0.50..2.00     evet          hayir

3. onlem kac noktayi kapatiyor
onlem                               nokta   sizdiran disarida %
bugunku dagitik durum                   8          5       62.5
yalniz sabit sureli karsilastirma       8          4       50.0
yalniz tek hata mesaji                  8          4       50.0
merkezi dogrulayici (uc kanal)          8          0        0.0
yeni nokta eklendi, dagitik             9          6       66.7
yeni nokta eklendi, merkezi kalip       9          0        0.0

4. dorduncu kanal sayima katilinca
sayim                               nokta   sizdiran disarida %
uc kanal, merkezi dogrulayici           8          0        0.0
dort kanal, merkezi dogrulayici         8          2       25.0
dort kanal, kilit yaniti da tek         8          0        0.0
```

Sayılar **ölçüm** sınıfındadır; girdileri KH1–KH4'tür.

## Beş Nokta ve Üç Kanal

Birinci tablo envanteri açar. Sekiz noktanın **beşi** kullanıcı varlığını sızdırıyor ve
sızıntının kaç kanaldan geldiği noktadan noktaya değişiyor.

`portal-eposta-degistir` yalnız mesajdan sızdırır: kayıt yokken farklı bir metin döner, iş
miktarı aynıdır. `rapor-ucu-anahtari` tam tersidir; mesajı tektir ve kayıt yokken de aynı
işi yapar, ama anahtar karşılaştırması ilk uyuşmayan bayta gelince çıkar. `fatura-sorgu` üç
kanalı birden açık tutar.

Bu dağılım, envanterin niçin nokta nokta çıkarıldığını gösterir. "Hata mesajları tektir"
cümlesi bir kapsama iddiasıdır ve tabloda karşılığı vardır: mesaj sütununda `tek` yazan beş
nokta. Ama o beş noktanın ikisi başka bir kanaldan sızdırmayı sürdürüyor. Kanal sayısı bir
noktanın ne kadar açık olduğunu değil, **kaç ayrı yerde düzeltme gerektiğini** söyler.

Envanterde noktaların hepsinin bir giriş ekranı olmadığına dikkat etmek gerekir.
`sayac-alim-anahtari` ve `rapor-ucu-anahtari` insan görmeyen uçlardır; kimlik bilgisi bir
anahtardır, kimlik doğrulama yine de yapılır ve aynı üç kanal yine açıktır. Kimlik doğrulama
noktası sayılırken "kullanıcı girişi" aranırsa envanter eksik çıkar. Ölçüt tek cümledir: bir
noktada sunulan bir değer bilinen bir kayıtla karşılaştırılıyorsa, o nokta envantere girer.

## Süre Yazılmaz, Bant Denetlenir

İkinci tablo bu dersin ölçüm kalıbıdır. Yanıt süresi farkı gerçek bir sızıntı kanalıdır ama
ham milisaniye bir ölçüm değildir: makineye, yüke ve o anki iş yüküne bağlıdır, aynı kodda
iki koşumda iki farklı sayı verir ve iki sayının karşılaştırılabilir olup olmadığı
bilinmez.

Ölçüm şöyle kurulur. Beklenen değer **girdiden türetilir**: kusurlu gerçekleştirim kayıt
yokken 2.000 adım, kayıt varken 22.000 adım yapar; beklenen oran 11,00'dir. Bant bu değerin
yarısı ile iki katı arasındadır. Ölçülen süre oranı yalnız bu banda düşüp düşmediğiyle
raporlanır — sayı çıktıya yazılmaz, `evet` yazılır. Kalıplı gerçekleştirimde iki yol da
22.000 adımdır, beklenen oran 1,00'dir ve ölçülen değer 0,50–2,00 bandındadır.

Son sütun kararı verir. Beklenen oran 1'e yakınsa süre farkından çıkarılabilecek bir bilgi
yoktur; 11 ise vardır. Bu ayrım koşumdan koşuma değişmez, çünkü ham süreye değil adım
sayısına dayanır. Ölçülen değerin işi yalnız modelin gerçekten böyle davrandığını
doğrulamaktır.

**Sabit süreli karşılaştırma (constant-time comparison)** bu kanalın yalnız bir parçasını
kapatır: karşılaştırmanın kendi içindeki erken çıkışı. Kayıt bulunamadığında doğrulama
işinin hiç yapılmaması ondan önce gelir ve sabit süreli karşılaştırma oraya dokunmaz.
İkinci tablodaki 11,00 oranı sabit süreli karşılaştırmayla 11,00 kalır.

## Tek Kanalı Kapatan Önlem Ne Kapatıyor

Üçüncü tablo kapsamayı sayar. Bugünkü dağıtık durumda sekiz noktanın beşi sızdırıyor;
dışarıda kalan oran **%62,5**.

Yalnız sabit süreli karşılaştırma uygulanırsa sızdıran nokta sayısı 5'ten **4'e** iner. Tek
kapanan nokta `rapor-ucu-anahtari`'dır, çünkü onun tek açık kanalı karşılaştırmaydı. Yalnız
tek hata mesajı uygulandığında da sonuç aynıdır: 5'ten 4'e. İki önlem farklı noktaları
kapatır ama her ikisinin kapsaması birdir. Bir sızıntı sınıfını üç kanaldan yalnız biriyle
ölçen bir denetim, işin beşte dördünü açık bırakır.

Üç kanalı birlikte kapatan **merkezî doğrulayıcı** sızdıran nokta sayısını sıfıra indirir.
Kalıbın içeriği tek cümledir: kayıt bulunsa da bulunmasa da aynı iş yapılır, aynı mesaj
döner, karşılaştırma sabit sürelidir. Bu kalıp bir kural listesi değil, tek bir işlevdir;
noktalar onu çağırır.

Aradaki fark, kuralın nerede yazıldığıdır. Dağıtık savunmada "hata mesajları ayrılmasın"
kuralı sekiz ayrı yerde uygulanmak zorundadır ve doğru uygulandığı ancak sekiz yer tek tek
okunarak bilinir. Merkezî kalıpta aynı kural bir yerde uygulanır; okunacak yer birdir,
sınanacak yer birdir. Kapsama sayısının anlamı da budur: 8'de 8 kapsama, sekiz doğru
gerçekleştirim değil, **bir** doğru gerçekleştirim ve sekiz çağrıdır.

Son iki satır bu kursun üçüncü sorusunu yanıtlar. Envantere dokuzuncu bir nokta —
`saha-cihaz-eslesme` — eklendiğinde dağıtık durumda sızdıran nokta 5'ten 6'ya çıkar ve
dışarıda kalan oran %66,7'ye yükselir. Merkezî kalıpta aynı nokta hiçbir ek iş yapılmadan
kapsanır ve sızdıran nokta sayısı 0 kalır. Fark kalıbın gücünde değil, **yeni noktanın
savunmayı çağırmak zorunda olmasındadır**: dağıtık savunmada her yeni nokta bir açık adayı,
merkezî kalıpta yalnız bir çağrıdır.

## Envanterin Kendisi Eksik Olabilir

Üçüncü tablonun son satırı sıfır yazıyor ve bu sayı yanıltıcıdır. Sıfır, "hiçbir nokta
sızdırmıyor" demez; **sayılan üç kanalda hiçbir nokta sızdırmıyor** der. Kapsama ölçüsü
sayılan kanal kümesine bağlıdır.

Dördüncü tablo envantere dördüncü bir kanal katar: art arda başarısız denemeden sonra hesabın
kilitlendiğini bildiren yanıt. Bu yanıt, kilitlenebilen bir hesabın **var olduğunu** söyler;
kayıtlı olmayan bir abone numarası hiçbir zaman kilitlenmez. Üç kanallı sayımda merkezî
doğrulayıcı sıfır veriyordu; dört kanallı sayımda aynı doğrulayıcı **2 noktada** sızdırıyor —
dışarıda kalan oran %25. Kilit kararı doğrulayıcının kendisinde değil, ondan sonra gelen
sayaç katmanında verilir; kalıp o katmanı çağırmadığı için oraya dokunmaz.

Son satır kalıbın nasıl genişletildiğini gösterir: kilit yanıtı da tek biçime çekildiğinde
sayı yeniden sıfırlanır. Buradaki ders kalıbın yetersizliği değil, **ölçünün sınırıdır**.
Kapsama yüzdesi bir savunmanın gücünü değil, envanterde sayılan kanal sayısına göre
konumunu verir. Yeni bir kanal keşfedildiğinde bütün geçmiş kapsama sayıları yeniden
hesaplanır; kalıbın değeri, bu hesabın tek bir yerde yapılabilmesidir.

## Özet

- Kimlik doğrulama gerçekleştirimi, doğru kimlik bilgisi hiç bilinmeden de bilgi sızdırabilir;
  sızan bilgi kullanıcı varlığıdır ve nokta sayısıyla ölçülür.
- Sekiz noktalık envanterde üç kanal sayıldı — ayrık hata mesajı, kayıt yokken atlanan iş,
  ilk uyuşmazlıkta çıkan karşılaştırma — ve beş nokta en az bir kanaldan sızdırdı.
- Yanıt süresi farkı ham süreyle değil bant denetimiyle yazılır: beklenen oran adım
  sayısından türetilir, ölçülen değer yalnız bandın içinde olup olmadığıyla raporlanır.
- Sabit süreli karşılaştırma üç kanaldan yalnız birini kapatır; beş sızdıran noktanın dördü
  açık kalır. Tek hata mesajı da tek başına dördü açık bırakır.
- Üç kanalı birden kapatan merkezî doğrulayıcı sıfır sızdıran nokta verir ve dokuzuncu nokta
  eklendiğinde onu ek iş olmadan kapsar; dağıtık durumda aynı nokta dışarıda kalanı 6'ya
  çıkarır.
- Kapsama sayısı sayılan kanal kümesine bağlıdır: kilit yanıtı dördüncü kanal olarak
  eklendiğinde aynı merkezî doğrulayıcının dışarıda bıraktığı nokta 0'dan 2'ye çıkar.

## Sonraki Adım

Bu ders kimliğin **belirlendiği** anı ölçtü. Doğrulama başarılı olduğunda ise ortaya yeni
bir nesne çıkar: sonraki isteklerde kimliği yeniden sormamak için üretilen oturum kimliği.
O kimliğin ne zaman üretildiği, doğrulama başarılı olduğunda değişip değişmediği ve
kullanıcı çıkış yaptığında sunucu tarafında gerçekten geçersiz kılınıp kılınmadığı ayrı
kararlardır — ve bu kararların her biri bir akışta ayrı ayrı verilir. Sonraki ders akış
kümesini çıkarır: kaç akış oturum kimliği üretiyor, kaçı üretirken eskisini yenilemiyor ve
sunucu tarafında geçersiz kılma olmadığında çıkıştan sonra kaç oturum yaşamaya devam ediyor.
