Skip to content

Bölüm 11 / 11

Kendi başına yapabilir misin?

Hat sonu yeterlilik kontrolü: gerçekçi görev + kontrol listesi.

15 dakikalık okuma

On ders boyunca güvenliği bir düşünme biçimi olarak kurdun: tehdit modeli, taşıma güvenliği, kimlik ve yetki, oturum ve jeton, delegasyon, çerçeve içindeki karşılıkları, zafiyet sınıfları ve sır disiplini. Şimdi kanıt zamanı: kimlik doğrulamalı bir API'yi baştan sona, kararlarını gerekçelendirerek kuracaksın — oturum mu jeton mu sorusuna yazılı bir cevapla, CSRF ve CORS yapılandırmasıyla, IDOR'a karşı negatif testlerle, güvenlik başlıklarıyla ve depoda tek bir sır bulunmayan bir yapılandırmayla. Bu görev bir alıştırma değil, hattın sınavıdır. Kural değişmedi: görevi derslere bakmadan tamamlayamıyorsan hat bitmemiştir.

01Bu hat sana ne kazandırmış olmalı

  • Güvenliği risk yönetimi olarak konuşmak: olasılık × etki, önlemin kendi maliyeti, "yeterince güvenli" kararı; güven sınırı çizmek ve saldırı yüzeyi listelemek; STRIDE ile tehdit çıkarmak ve ekiplerin atladığı R/D satırlarını zorlamak.
  • Tasarım ilkelerini karar anında kullanmak: en az yetki (patlama yarıçapı), derinlemesine savunma, güvenli varsayılan, güvenli çökme, tam aracılık, açık tasarım, psikolojik kabul edilebilirlik.
  • Değişmez kuralı uygulamak: istemciden gelen hiçbir şeye güvenilmez — doğrulama sunucuda tekrarlanır, kimlik istekten değil oturumdan okunur, gövde alan beyaz listesiyle bağlanır.
  • TLS'i üç garantisi ve üç garanti-değili ile anlatmak; el sıkışma, ileri gizlilik, sertifika zinciri ve dört doğrulama; HSTS; TLS sonlandırma arkasında X-Forwarded-* disiplini ve "doğrulamayı kapat" ödününün bedeli.
  • Parolayı doğru saklamak: neden hızlı hash yanlış, tuz/biber, Argon2id/bcrypt, maliyeti ölçerek seçmek; ve Node'da hash'in libuv havuzunu doldurması.
  • Kullanıcı numaralandırmayı üç kanaldan birden kapatmak (mesaj, zamanlama, yan uçlar); sabit zamanlı karşılaştırma; iki boyutlu oran sınırı ve hesap kilitlemenin neden DoS'a dönüştüğü.
  • Yetkilendirmede modelden önce nesne düzeyi kontrolü düşünmek: IDOR'un üç kuralı; ve "guard/menü UX'tir, karar API'dedir".
  • Çerezi sertleştirmek (HttpOnly/Secure/ SameSite/__Host-), oturum kimliğini CSPRNG ile üretmek, iki zaman aşımı, oturum sabitlemeye karşı girişte yenileme.
  • CSRF'yi mekanizmasıyla anlatmak, CORS'un neden engellemediğini bilmek, SameSite'ın dört yetersizliğini saymak ve senkronize jeton desenini kurmak; ve "XSS varsa CSRF savunması anlamsızdır".
  • JWT'yi doğrulama listesiyle kullanmak (algoritma beyaz listesi, iss, aud, saat kayması), alg=none ve algoritma karıştırmayı anlatmak, iptal problemini dört kalıpla çözmek, yenileme dönüşümü + yeniden kullanım tespiti kurmak.
  • Jetonun nerede saklanacağına gerekçeli karar vermek (localStorage ↔ httpOnly çerez ↔ BFF) ve JWT'yi ne zaman kullanmayacağını söylemek.
  • OAuth2'yi rolleri, kanalları ve akışlarıyla kurmak: authorization code + PKCE; state/code_verifier/nonce ayrımı; implicit ve ROPC'nin neden öldüğü; kapsam yetki değildir.
  • OIDC ile kimliği çözmek: id_token ve aud = client_id; üç jetonun işlerini karıştırmamak; iss+sub ile eşleme ve email_verified tuzağı; SSO ve çıkışın iki oturumu.
  • ASP.NET Core'da hepsini koda dökmek: şema, ara yazılım sırası, FallbackPolicy ile güvenli varsayılan, politika + handler, kaynak tabanlı yetkilendirme; ClockSkew, MapInboundClaims ve RoleClaimType tuzakları.
  • OWASP kategorilerini mekanizmayla anlatmak: A01'in biçimleri, parametreli sorgunun neden kategorik olarak üstün olduğu, XSS'in üç türü ve bağlama göre kodlama, CSP, güvenlik başlıkları, SSRF ve dosya yükleme.
  • Sırları yönetmek: katman katman doğru yer, ortam değişkeninin sızma yolları, kasa ve yönetilen kimlik, kesintisiz döndürme, ve "sızmış sır artık sır değildir".

02Görev — Başvuru API'sini güvenli kur

6. hatta tasarladığın, 5. hatta ASP.NET Core ile (ya da 12. hatta Node ile) yazdığın başvuru API'sini bu kez güvenlik gereksinimleriyle kuracaksın. İstemci olarak 10 veya 11. hattaki arayüzü kullan; yoksa iki sayfalık bir SPA yeter. Kurulum gerçek olsun: HTTPS, bir veritabanı, en az iki kullanıcı hesabı ve en az iki rol.

BölümYapılacak
1. Tehdit modeli Bir sayfalık belge: kutu-ok çizimi, güven sınırları, uç envanteri (kimlik gerekiyor mu · hangi veriye dokunuyor · girdiyi nereye gönderiyor). Giriş ve dosya indirme uçlarına STRIDE uygula; her tehdide azalt / devret / kabul et / ortadan kaldır kararı ver. En az iki maddede bilinçli "kabul et" kararı ver ve gerekçesini yaz.
2. Karar notu Yarım sayfa: oturum mu jeton mu? Seçimini istemci türü, iptal gereksinimi, alan adı yapısı ve ölçekleme üzerinden gerekçelendir. Jeton seçtiysen nerede saklanacağını ve iptalin nasıl çözüleceğini yaz; oturum seçtiysen deponun nerede olduğunu ve iki zaman aşımını yaz.
3. Kimlik doğrulama Kayıt + giriş + çıkış. Parola Argon2id ya da bcrypt ile, maliyeti ölçülmüş (100-250 ms). Numaralandırmayı üç kanalda kapat: aynı mesaj, aynı kod, sahte özet ile eşitlenmiş süre; sıfırlama ucu her zaman aynı cevabı versin. Giriş ve sıfırlama uçlarına iki boyutlu oran sınırı koy (IP + hesap).
4. Oturum / jeton Kararına göre kur. Çerez kullanıyorsan: __Host- öneki, HttpOnly, Secure, SameSite=Lax, hareketsizlik + mutlak süre, girişte kimlik yenileme. Jeton kullanıyorsan: doğrulama listesinin tamamı (algoritma beyaz listesi, iss, aud, ClockSkew 30 sn), kısa ömür + yenileme dönüşümü, ve parola değişiminde tüm oturumları düşüren bir mekanizma (sürüm iddiası ya da güvenlik damgası).
5. Yetkilendirme En az iki rol ve en az bir politika (rol yetmeyen bir kural). Kimlik parametresi alan her uçta nesne düzeyi kontrol: sahiplik koşulunu sorguya yaz ve kaynak tabanlı politika ile ikinci katmanı kur. Yetkisiz durumda 403 mü 404 mü döndüğüne karar ver ve gerekçesini koda yorum olarak değil, karar notuna yaz. Güvenli varsayılanı kur: FallbackPolicy (ya da Node'da eşdeğeri bir kapı) ve herkese açık uçları açıkça işaretle.
6. CSRF ve CORS Çerez kullanıyorsan senkronize jeton desenini kur ve sabit zamanlı karşılaştır. CORS'u beyaz listeyle yapılandır; gelen Origin'i yansıtan yapılandırmayı bilerek bir kez dene, ikinci bir kökenden kimlikli veri çekilebildiğini gör ve düzelt.
7. Enjeksiyon ve XSS Tüm sorgular parametreli; dinamik sıralama/filtreleme varsa beyaz liste. Bir alanı zengin metin olarak kabul et ve sunucuda temizleyiciden geçir. Arayüzde bir çıktıyı bilerek kodlamadan bas, XSS'i çalıştır, sonra düzelt.
8. Başlıklar ve CSP Content-Security-Policy (önce Report-Only, sonra nonce ile zorunlu), Strict-Transport-Security, X-Content-Type-Options, Referrer-Policy, frame-ancestors 'none', kimlikli yanıtlarda Cache-Control: no-store. Sürüm sızdıran başlıkları kaldır.
9. Dosya yükleme Sunucu tarafında yeni ad, içerik imzasıyla tür doğrulama + beyaz liste, web kökü dışında saklama, Content-Disposition: attachment + nosniff, boyut sınırı. İndirme ucunda yetki kontrolü (tahmin edilemez ad tek başına yeterli değildir).
10. Sırlar Depoda tek bir sır bulunmayacak. Geliştirmede user secrets ya da .gitignore'lu .env + değer içermeyen bir örnek dosya; eksik sırda açılışta hızlı çök. Loglarda redaksiyon listesi. Veritabanı kullanıcısını en az yetkiye indir ve DROP TABLE denemesinin reddedildiğini göster.
11. Negatif testler En az altı otomatik test: (a) kimliksiz istek 401; (b) yetkisiz rol 403; (c) başkasının kaydına erişim reddedilir; (d) CSRF jetonu olmayan durum değiştiren istek reddedilir (ya da jeton mimarisinde: yanlış aud'lu jeton reddedilir); (e) süresi dolmuş jeton/oturum reddedilir; (f) kütle atama denemesi ("rol":"yonetici") yok sayılır. Bu testler bu hattın asıl teslimatıdır.

Kanıt: testlerin geçtiği çıktıyı, curl -sI ile alınmış güvenlik başlıkları listesini ve bcrypt/Argon2 maliyet ölçümünü kaydet. Bir de yarım sayfalık kabul edilen riskler listesi bırak — 1. dersteki "bilinçli kabul et kararı da bu mesleğin parçasıdır" cümlesinin karşılığı budur.

03Kontrol listesi

Her satırı kendine sorarak işaretle; "evet" diyemediğin satırın dersine dön.

Yardımsız yapabiliyor musun?Takılırsan dön
Risk = olasılık × etki ile karar vermek; güven sınırı çizmek; saldırı yüzeyi listelemek; STRIDE uygulamak; en az yetki / derinlemesine savunma / güvenli varsayılan / güvenli çökme ilkelerini örnekle anlatmak 1. ders
TLS'in üç garantisi ve vermediği üç şey; ileri gizlilik; sertifika zinciri ve dört doğrulama; HSTS ve SSL stripping; X-Forwarded-For'a hangi koşulda güvenilir 2. ders
401/403/404 kararı; parola saklama ve maliyet ölçümü; Node'da hash'in libuv havuzunu doldurması; numaralandırmanın üç kanalı; iki boyutlu oran sınırı; IDOR'un üç kuralı 3. ders
Çerez öznitelikleri ve __Host-; oturum kimliği üretimi ve depo seçimi; iki zaman aşımı; oturum sabitleme; CSRF mekanizması ve CORS'un neden engellemediği; SameSite'ın dört yetersizliği 4. ders
JWT'nin üç parçası ve base64'ün şifreleme olmadığı; HS256↔RS256 kararı; alg=none ve algoritma karıştırma; doğrulama listesi ve aud; iptal problemi ve dört kalıp; yenileme dönüşümü; saklama kararı 5. ders
OAuth2 rolleri ve ön/arka kanal; authorization code + PKCE; state ile PKCE farkı; implicit ve ROPC'nin ölümü; redirect_uri tam eşleşmesi; kapsam yetki değildir; JWKS'in üç üretim ayrıntısı 6. ders
OIDC'nin OAuth2'ye eklediği; id_token ve aud = client_id; nonce; üç jetonun ayrı işleri; iss+sub ile eşleme ve email_verified tuzağı; SSO ve iki oturumlu çıkış 7. ders
ClaimsPrincipal modeli; şema seçimi ve Authority; ara yazılım sırası ve bozulma belirtileri; FallbackPolicy ile güvenli varsayılan; politika + handler ve Succeed/Fail kuralı; kaynak tabanlı yetkilendirme; ClockSkew / MapInboundClaims / RoleClaimType 8. ders
A01'in biçimleri; parametreli sorgunun neden kategorik olarak üstün olduğu ve ORM'in yalancı güvenliği; kör enjeksiyon; XSS üç tür ve bağlama göre kodlama; CSP ve unsafe-inline; güvenlik başlıkları; SSRF ve metadata servisi; dosya yükleme kontrolleri 9. ders
Sır ↔ yapılandırma ayrımı; user secrets ve sağlayıcı zinciri; ortam değişkeninin sızma yolları; dosya olarak bağlama; kasa ve yönetilen kimlik; kesintisiz döndürmenin dört adımı; sızıntıda ilk yapılacak iş 10. ders

04Sözlü provası

Bir web uygulamasının güvenliğini nasıl ele alırsınız? Nereden başlarsınız, hangi ilkelerle karar verirsiniz?

Güvenliği bir özellik değil kısıt olarak ele alırım: garanti etmeye çalıştığım şey olumsuz bir cümledir ("yetkisiz kimse başkasının belgesini okuyamaz"), o yüzden kabul kriterlerine yazılmazsa var olmaz. Karar çerçevem risk = olasılık × etki, artı önlemin kendi maliyeti — geliştirme süresi, çalışma zamanı, kullanıcı sürtünmesi; aşırı sürtünme üreten önlem atlatılır ve atlatılan önlem yok hükmündedir. Somut olarak işe güven sınırlarını çizerek başlarım: tarayıcı → API, API → veritabanı, API → dış servis, yükleme → dosya sistemi, yapılandırma → süreç. Her sınırda veri doğrulanır. Sonra saldırı yüzeyini listelerim: tüm uçlar, özellikle giriş/kayıt/parola sıfırlama, dosya yükleme-indirme, yönetim panelleri, zamanlanmış işler, webhook alıcıları, bağımlılıklar ve sırlar. Ardından STRIDE ile her akışa altı tehdit türünü sorarım ve ekiplerin kendiliğinden atladığı R (inkâr) ile D (hizmet engelleme) satırlarını bilerek zorlarım. Her tehdide dört karardan biri: azalt, devret, kabul et, ortadan kaldır — hepsine "azalt" yazmam, bilinçli kabul kararı da bu işin parçasıdır. Uygulama tarafında dört ilkeye yaslanırım: en az yetki (saldırıyı önlemez, patlama yarıçapını küçültür), derinlemesine savunma (bir katmanın bir gün başarısız olacağını varsayarım), güvenli varsayılan (yeni uç aksi belirtilmedikçe kapalı) ve güvenli çökme (yetki değerlendirmesi hata verirse cevap "hayır"dır; catch { return true; } gördüğüm yerde durup düzeltirim). Değişmez kuralım şu: istemciden gelen hiçbir şeye güvenmem — Angular guard'ı, devre dışı buton, gizli menü kullanıcı deneyimidir; doğrulamayı sunucuda tekrarlarım, kimliği istekten değil doğrulanmış oturumdan okurum, gövdeyi alan beyaz listesiyle bağlarım. Ve en değerli tek pratik olarak negatif testi söylerim: "yetkisiz kullanıcı 403 alır" testi, o kontrolü altı ay sonra bir refactor'da silen kişiyi yakalayan tek şeydir.

Kullanıcı girişini ve oturum yönetimini nasıl kurarsınız? Parolayı nasıl saklarsınız, oturum mu JWT mi seçersiniz?

Parola: geri döndürülebilir saklamam. SHA-256 yanlıştır, çünkü hızlı olmak için tasarlanmıştır ve GPU saniyede milyarlarcasını hesaplar. Argon2id ya da bcrypt kullanırım; tuz kullanıcı başına rastgeledir ve gizli olması gerekmez, işi her hesabı ayrı bir problem yapmak ve gökkuşağı tablolarını geçersiz kılmaktır; istersem veritabanı dışında duran bir biber eklerim. Maliyeti ezberden değil ölçerek seçerim: kendi üretim donanımımda tek doğrulama 100-250 ms. Parametre yapılandırmadan gelir ve kullanıcı girişinde özet yeni parametrelerle yeniden üretilir. Node'daysam bir ayrıntı daha söylerim: hash libuv iş parçacığı havuzunda çalışır, havuz varsayılan dörttür — giriş ucunu oran sınırsız bırakırsam CPU düşükken gecikme uçar, yani giriş ucu bir DoS yüzeyidir. Numaralandırma: "kullanıcı yok" ile "parola yanlış" ayrımını hiçbir kanaldan sızdırmam — aynı mesaj, aynı durum kodu ve aynı süre: kullanıcı bulunamadığında da önceden üretilmiş sahte bir özete karşı doğrulama çalıştırırım; sıfırlama ucu her zaman "eğer bu adres kayıtlıysa bağlantı gönderildi" der. Sınırı iki boyutlu koyarım — hesap başına ve IP başına — çünkü parola serpme saldırısını hesap bazlı sınır hiç görmez; hesap kilitleme yerine üstel gecikme ve kademeli sürtünme tercih ederim, kilitleme kendi kendine DoS'a döner. Oturum mu JWT mi: tek alan adlı klasik bir web uygulamasında sunucu tarafı oturum seçerim — daha küçük, anında iptal edilebilir, saklama yeri tartışması yok. Çerezi __Host- önekiyle, HttpOnly, Secure, SameSite=Lax veririm; Domain yazmam, yazarsam çerez tüm alt alanlara gider. Oturum kimliğini CSPRNG ile üretir, paylaşımlı bir depoda tutarım (bellek içi oturum cluster'da her kopyada ayrıdır) ve iki zaman aşımı koyarım — mutlak süre yoksa çalınan oturum sonsuz yaşar. Girişte oturum kimliğini yenilerim, yoksa oturum sabitleme olur. JWT'yi gerçek bir gerekçe varsa seçerim: çok sayıda bağımsız doğrulayıcı, mobil, çapraz alan, federasyon.

JWT'yi nasıl doğrularsınız ve iptal problemini nasıl çözersiniz? OAuth2 ile OIDC arasındaki farkı ve akış seçiminizi anlatın.

Doğrulama bir kontrol listesidir: imza — JWKS'ten alınan anahtarla ve sunucunun dayattığı algoritma beyaz listesiyle; iss; aud; exp/nbf saat kaymasıyla; jeton türü. Algoritmayı jetondan okuyan kod alg=none ve algoritma karıştırmaya açıktır — ikincisinde saldırgan başlığı HS256 yapıp jetonu herkese açık olan RSA anahtarını HMAC sırrı gibi kullanarak imzalar. aud'u atlayan kod başka bir API için verilmiş jetonu kabul eder; en sık atlanan kontrol budur. .NET'te ClockSkew varsayılanının 5 dakika olduğunu bilir, 30 saniyeye çekerim. Bir de decode ile verify'ı karıştırmam — ilki imzayı kontrol etmez. İptal problemi: JWT kendi kendini doğruladığı için verildikten sonra geri alınamaz; çıkış, hesap askıya alma, rol düşürme exp gelene kadar işlemez. Dört kalıbı sayarım: kısa ömür + sunucuda kayıtlı yenileme jetonu, kara liste, sürüm iddiası ve introspection. Pratikte dengeli bileşim kısa ömürlü erişim jetonu + kayıtlı yenileme + kritik olaylarda sürüm iddiasıdır; yenilemede dönüşüm ve yeniden kullanım tespiti uygularım — geçersiz bir yenileme jetonu tekrar sunulursa tüm aileyi iptal ederim. Saklama sorusunda tek doğru yoktur, risk yer değiştirir: localStorage'da XSS jetonu dışarı çıkarır, httpOnly çerezde CSRF gelir, BFF deseninde jeton tarayıcıya hiç inmez ve bugünün varsayılanı odur. OAuth2 ↔ OIDC: OAuth2 bir delegasyon protokolüdür — uygulamanın, parolamı görmeden, sınırlı kapsamda ve süreli olarak verime erişmesini sağlar; erişim jetonu taşıyıcı bir kimlik bilgisidir ve kimin verdiğinin kanıtı yoktur, dolayısıyla onunla oturum açmak jeton değiştirme saldırısına açıktır. OIDC bu boşluğu id_token ile kapatır: aud'u benim client_id'm olan, nonce ile isteğime bağlanmış imzalı bir kimlik belgesi. Akış: her istemci türü için authorization code + PKCE; ön kanaldan jeton değil kod taşınır, kodu code_verifier ile arka kanalda çeviririm. state CSRF'ye, PKCE kod ele geçirmeye, nonce jeton tekrarına bakar — üçü farklı saldırılardır. Implicit jetonu ön kanalda döndürdüğü için, ROPC parolayı uygulamaya yazdırdığı için terk edildi. Makineden makineye işlerde client credentials kullanırım ve o jetonda kullanıcı olmadığını unutmam. Son olarak kapsam yetkilendirme değildir: basvuru.oku jetonu gelse de kaynak sunucu "bu kullanıcı bu kaydın sahibi mi" sorusunu ayrıca sorar.

Yetkilendirmeyi nerede ve nasıl yaparsınız? SQL injection ve XSS'i nasıl önlersiniz, sırları nasıl yönetirsiniz?

Yetkilendirme API'de yapılır. Arayüzdeki router guard'ı, gizli menü ve devre dışı buton kullanıcı deneyimidir; karar sunucudadır ve her servis kendi kararını verir — BFF kimliği taşısa da iç servisler "nasılsa kontrol etmiştir" demez. Modelden önce gelen şey nesne düzeyi kontroldür: en yaygın kritik zafiyet IDOR'dur ve sebebi rolün kontrol edilip sahipliğin unutulmasıdır. Üç kuralım var: kimliği istekten değil doğrulanmış oturumdan okurum; sahiplik koşulunu sorgunun kendisine yazarım (böylece unutulacak adım kalmaz); tahmin edilemez kimlik (UUID) yüzeyi küçültür ama tek başına önlem değildir. ASP.NET Core'da bunun çerçeve karşılığı kaynak tabanlı yetkilendirmedir: [Authorize] istek işlenmeden önce çalışır ve o anda ortada kaynak yoktur, bu yüzden IDOR'u kapatamaz; IAuthorizationService ile kaynağı yükledikten sonra karar veririm. Güvenli varsayılan için FallbackPolicy kurarım — nitelik yazmayı unutmak ucu açık değil kapalı bırakır; ara yazılım sırasını da bilirim, çünkü UseAuthorization unutulduğunda [Authorize] sessizce yok sayılır. SQL injection: kök sebep veri ile komutun aynı kanaldan gitmesidir; parametreli sorgu kanalları ayırır ve bu yüzden kaçış karakterinden kategorik olarak güçlüdür. "ORM kullanıyorum" cümlesi yetmez: ham SQL API'leri, dinamik sıralama ve saklı yordam içi dinamik SQL açık kapılardır — parametre olamayan şeyleri (tablo/sütun adı, ASC/DESC) beyaz listeyle koyarım. Hata mesajını gizlemek de yetmez, kör enjeksiyon boolean ve zaman farkıyla çalışır. XSS: asıl savunma bağlama göre çıktı kodlamasıdır ve çerçeveler bunu varsayılan yapar; açıklar dangerouslySetInnerHTML, bypassSecurityTrust, @Html.Raw, düz innerHTML gibi kaçış kapılarından girer — zengin metin gerekiyorsa sunucuda olgun bir temizleyici kullanırım, düzenli ifadeyle etiket temizlemem. İkinci hat CSP'dir: XSS'i önlemez ama işe yaramasını engeller; unsafe-inline yerine nonce kullanır, mevcut sisteme Report-Only ile sokarım. Sırlar: depoda tek bir sır bulunmaz; geliştirmede user secrets ya da .gitignore'lu .env, üretimde kasa + yönetilen kimlik — "kasaya bağlanmak için de sır gerekmez mi" paradoksunu bu çözer. Ortam değişkeninin kasa olmadığını bilirim: /proc/<pid>/environ, docker inspect, alt süreç mirası, hata izleme araçlarının çökme raporuna ortamı eklemesi. Bu yüzden üretimde sırrı dosya olarak bağlarım; hem ortamda görünmez hem döndürüldüğünde yeniden başlatmadan okunabilir. Döndürmeyi iki anahtar dönemiyle kesintisiz yaparım (JWT'de kid + JWKS, sertifikada ACME + reload). Ve sızıntıda ilk iş geçmişi temizlemek değil, sırrı iptal etmektir: sızmış bir sır artık sır değildir.

05Karar

Görevi yardımsız bitirdiysen

Bu düğümü "tamamladım" işaretle — Hat 13 kapanır ve İlan A'nın "Yazılım güvenliği, JWT, OAuth2" maddesi tamamen karşılanır; İlan B'nin "HTTP, JSON/XML, JWT, OAuth2" maddesi de bu hattın kimlik dörtlüsüyle birlikte tamamlanmış olur. Elindeki asıl kazanç bir liste değil, bir refleks: artık yazdığın her uçta "bu kararı kim veriyor, hangi sınırı geçiyor, unutulursa ne olur" sorusunu kendiliğinden soruyorsun. Bu hatta üç senet birden ödendi: CORS'un neden güvenlik önlemi olmadığı, sırların ortam değişkeninde nasıl durduğu ve jetonun neden tarayıcıda değil BFF'te tutulduğu. Sıradaki durak Hat 14 · Bilgi Güvenliği: bu hat uygulama güvenliğiydi; oradaki konu kurumsal güvenliktir — CIA üçlüsü, kriptografi ve PKI temelleri (2. dersteki sertifika zincirinin altındaki matematik), risk yönetimi metodolojisi, ağ güvenliği, olay müdahalesi, KVKK ve kamu mevzuatı. Yazılı sınavın açık kapsamı büyük ölçüde oradadır.

Takıldıysan

Takıldığın maddeyi tablodan dersine eşle, dersi ve mini alıştırmasını yeniden çalış, 24 saat sonra görevi düzeltmeden, sıfırdan yap. Bu hatta en sık takılan altı yer: yetkilendirme yazıldı sanılıyor ama uçlar açık (8. ders — UseAuthorization eksik ya da FallbackPolicy kurulmamış), rol kontrol ediliyor ama başkasının kaydı okunabiliyor (3. ders — IDOR: sahiplik sorguda değil), "CORS ayarladım, CSRF'den korunuyorum" sanılıyor (4. ders — CORS yanıtın okunmasını kısıtlar, isteğin gitmesini değil), süresi dolmuş jeton hâlâ çalışıyor (5. ders — ClockSkew varsayılanı 5 dakika) ya da başka bir API'nin jetonu kabul ediliyor (aynı ders — aud doğrulanmıyor), kullanıcı "çıkış yaptım ama hâlâ giriyorum" diyor (7. ders — sağlayıcı oturumu kapatılmadı) ve parola değiştirildiği hâlde saldırganın oturumu açık kalıyor (5. ders — iptal mekanizması yok).