📌 Hızlı Özet:
OWASP Top 10, yalnizca banka uygulamalari icin degil; Astro ile uretilen icerik siteleri ve yaninda calisan kucuk API’ler icin de gecerli bir tehdit haritasidir. Bu yazida Pusula USV yazilim ekibinde de kullandigimiz yaklasimla, riskleri “liste ezberlemek” yerine tehdit modeli + savuma katmani olarak ele aliyorum: kimlik/yetki, enjeksiyon, yanlis yapilandirma, bagimlilik ve loglama.


Neden statik site + kucuk API birlikte dusunulmeli?

Astro SSG ile uretilen bir teknik blog, ilk bakista “sunucu yok, saldiri yok” gibi gorunur. Gercekte ise site neredeyse her zaman baska bir yuzeye baglidir: iletisim formu, yorum/newsletter endpoint’i, Cloudflare Worker, basit bir Python FastAPI veya admin icerik paneli. Benim pratikte gordugum en yaygin hata, statik katmani guvenli sayip API’yi “gecici script” gibi birakmaktir.

OWASP Top 10 (2021 ve sonrasi guncellemeler) bu yuzeyi kategorize eder. Amacimiz her maddeyi ezberlemek degil; kendi mimarimizde hangi maddenin gercekten acik oldugunu bulmak. Asagida Astro + kucuk API senaryosuna gore yeniden siraladim.

Tehdit modeli: once neyi koruyoruz?

Guvenlik calismasina “XSS’i nasil engellerim?” diye baslamak yanlistir. Once su sorulari netlestirin:

  1. Hangi veri hassas? (kullanici e-posta, oturum cookie, API anahtari, telemetri token’i)
  2. Kim erisebilir? (anonim ziyaretci, editor, admin, CI pipeline)
  3. Guven siniri nerede? (Cloudflare edge, origin API, veritabani, ucuncu parti CDN)

Pusula tarafında otonom arac telemetri panelleri icin ayni sorulari soruyoruz: sensör verisi “gizli” olmayabilir ama komut kanali ve baglanti kimlik bilgileri kesinlikle gizli. Web’de de icerik herkese acik olabilir; admin yazma yetkisi degildir.

A01 — Broken Access Control (kirik erisim kontrolu)

Kucuk API’lerde en sik gordugum acik, IDOR/BOLA tipidir: /api/posts/42 yerine /api/posts/43 cagirinca baskasinin taslak yazisini okumak. Statik sitede yayinlanan slug’lar public olabilir; ama draft, preview token veya “unpublished” kaynaklar public olmamalidir.

Pratik savunma:

  • Kaynak erisimini “kimlik + sahiplik” ile dogrulayin. post_id tek basina yetmez; owner_id == session.user_id veya rol kontrolu zorunlu olsun.
  • Preview URL’lerini tahmin edilemez, kisa omurlu token ile koruyun.
  • Admin route’larini ayri origin veya Cloudflare Access arkasina alin.

Ornek zihin modeli: “URL’deki ID guvenilir girdi degildir.” Bu cumleyi kod incelemesinde checklist olarak tutuyorum.

A02 — Cryptographic Failures

TLS’i Cloudflare’e birakmak yetmez. Cookie’lerde Secure, HttpOnly, SameSite ayarlari; API anahtarlarinin repoda olmamasi; sifre hash’inde modern algoritma (Argon2/bcrypt) gerekir. Statik sitede bile newsletter abonelik token’ini acik log’a yazmak yaygindir.

Dikkat: “her seyi sifrele” diyerek performans vaadi vermiyorum. Dogru hedef, hassas veriyi dusunerek siniflandirmak ve gereksiz yerde saklamamak.

A03 — Injection (SQLi, komut, template)

Kucuk Python/Node API’lerde string birlestirmeli SQL hâlâ karsima cikiyor. Parametrik sorgu zorunlu:

# Guvenli: parametre baglama
cur.execute(
    "SELECT id, slug, title FROM posts WHERE slug = %s AND published = true",
    (slug,),
)

Astro icerik katmaninda Markdown dosyalari guvenilir kabul edilebilir; ama kullanici yorumu veya CMS’ten gelen HTML’i oldugu gibi set:html ile basmak XSS’e acar. Markdown render ciktisini sanitize edin; rich text icin allowlist kullanin.

Komut enjeksiyonu: build script’lerinde kullanici girdisini os.system ile calistirmayin. CI’da da ayni kural gecerli.

A04 / A05 — Guvenli tasarim ve yanlis yapilandirma

Guvenli tasarim, “sonradan WAF ekleriz” demek degildir. Ornekler:

  • Rate limit: form ve login endpoint’lerinde IP + fingerprint siniri
  • Default sifre / acik debug: production’da Astro preview server veya FastAPI docs (/docs) acik kalmasin
  • CORS: Access-Control-Allow-Origin: * + cookie’li oturum = felaket
  • Hata mesajlari: stack trace ziyaretciye gitmesin

Cloudflare Pages + Worker kullaniyorsaniz, ortam degiskenlerini secret olarak tanimlayin; client bundle’a PUBLIC_ ile sızdirmayin.

A06 — Vulnerable and Outdated Components

Astro, rehype eklentileri, React island’lari, Python paketleri… Bagimlilik yuzeyi kucuk projede bile buyur. Pratik rutin:

  • Haftalik npm audit / pip-audit (veya Dependabot)
  • Major surum atlamadan once changelog okuma
  • Kullanilmayan island/framework bagimliligini silme (Astro’nun avantajı burada)

Herkes “zero CVE” iddiasi satamaz; hedef, bilinen kritik aciklari hizli kapatmak ve attack surface’i kucultmektir.

A07 — Identification and Authentication Failures

Kucuk sitelerde sifreli “admin paneli” siklikla zayif kalir: tek parola, paylasilan hesap, MFA yok. Onerim:

  • Mumkunse sifre yerine Cloudflare Access / OAuth
  • Session suresini kisa tutun; logout’ta sunucu tarafinda invalidate edin
  • Brute-force icin kilit + rate limit

USV ekibinde telemetri dashboard girisinde de ayni mantik: ortak sifre = ortak risk. Herkes kendi kimligiyle girmeli.

A08 — Software and Data Integrity Failures

CI/CD’den gelen artifact’e guvenmek, unsigned script calistirmak, CDN uzerinden integrity olmadan ucuncu parti JS yuklemek bu kategoriye girer. AdSense veya analytics script’leri icin:

  • Sadece guvenilen domain’lerden yukleyin
  • Mumkunse Subresource Integrity (SRI)
  • Build pipeline’da secret scan (.env commit’ini engelleyin)

A09 — Security Logging and Monitoring Failures

Guvenlik log’u “her seyi kaydet” demek degildir. Kaydedin:

  • Basarisiz login / yetkisiz erisim denemeleri
  • Rate limit asimi
  • Admin yazma islemleri (kim, ne zaman, hangi kaynak)

Kaydetmeyin: sifre, tam kart numarasi, ham token. Alert yoksa log sadece disk doldurur. Kucuk projede bile haftalik “supheli 401/403 artisi” bakisi yeterlidir.

A10 — SSRF ve sunucu tarafi istekler

Kucuk API’lerde “URL al, preview uret” veya “webhook cagir” ozellikleri SSRF kapisi acar. Kullanici URL’sini sunucu fetch ile cagiriyorsa:

  • Private IP / metadata endpoint engeli (127.0.0.1, 169.254.169.254, RFC1918)
  • Allowlist scheme (https only)
  • Redirect sayisi siniri

Astro SSG build sirasinda harici API cekiyorsaniz, build makinesinin ag erisimini de dusunun; zehirli URL build’i zehirleyebilir.

XSS’e ozel: Astro icerik sitelerinde pratik

Markdown iceriklerinde HTML izin veriyorsaniz, yazar hesabi ele gecince site XSS yayar. Politika:

  1. Icerik allowlist (baslik, paragraf, kod, link; script/iframe yok)
  2. CSP header (Cloudflare veya _headers ile): inline script’i minimize edin
  3. Kullanici girdisini asla guvenmeyin; editor bile insan hatasi yapar

CSP’yi ilk gunde cok sikı baslatip siteyi kirmak yerine, report-only ile baslayip kademeli sikılastirmayi tercih ediyorum. Bu bir “garanti skor” degil; olculebilir iyilestirme dongusudur.

Kucuk API icin minimum guvenlik iskeleti

Bir FastAPI veya Worker API’sinde benim minimum checklist’im:

  1. Tum yazma islemlerinde authn + authz
  2. Girdi dogrulama (Pydantic / Zod)
  3. Parametrik DB erisimi
  4. Rate limiting
  5. Guvenli cookie/header varsayilanlari
  6. Secret’larin ortam degiskeninde tutulmasi
  7. Production’da debug kapali
  8. Temel erisim log’u

Bu liste “enterprise WAF” degildir; tek basina yeterli de olmayabilir. Ama scaffold tipindeki genel soylemlerden daha ise yarar: somut ve sirali.

Test etmeden “guvendik” demeyin

Kod yazmak yetmez. En azindan:

  • Manuel IDOR denemesi (baska kullanici ID’si)
  • Form’a <script>alert(1)</script> ve SQL meta karakterleri
  • CORS’u tarayici DevTools ile dogrulama
  • Secret’larin client bundle’da olmadigini grep / build artifact kontrolu

Otomatik SAST eklemek guzeldir; ama kucuk projede once bu manuel smoke testler hayat kurtarir. Teknofest takvimine yetisen ekiplerde gordugum gercek: “guvenligi sonraya birakmak” her zaman sonraya kalir.

Son soz

OWASP Top 10 bir korku listesi degil, onceliklendirme aracıdır. Astro + kucuk API dunyasinda asil riskler genelde erisim kontrolu, enjeksiyon, yanlis yapilandirma ve bagimliliktir. Mutlak “hacklenmez site” vaadi vermiyorum; verebilecegim sey, tehdit modeline dayali katmanli savunma ve duzenli gozden gecirme aliskanligidir. Yazilim muhendisliginde guvenlik, ozellik listesinin son satiri degil; tasarim kararinin bir parcasi olmali.