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=noneve 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/nonceayrımı; implicit ve ROPC'nin neden öldüğü; kapsam yetki değildir. - OIDC ile kimliği çözmek:
id_tokenveaud = client_id; üç jetonun işlerini karıştırmamak;iss+subile eşleme veemail_verifiedtuzağı; SSO ve çıkışın iki oturumu. - ASP.NET Core'da hepsini koda dökmek: şema, ara yazılım sırası,
FallbackPolicyile güvenli varsayılan, politika + handler, kaynak tabanlı yetkilendirme;ClockSkew,MapInboundClaimsveRoleClaimTypetuzakları. - 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üm | Yapı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).
