OWASP Top 10, web uygulamalarındaki en kritik güvenlik risklerinin derlendiği, güvenlik ekiplerinin standart referansı olan listedir. 2021 versiyonu hâlâ geçerliliğini koruyor ama 2026 itibariyle SSRF, Insecure Design ve Software Supply Chain saldırılarının ağırlığı arttı. Bu yazı 10 kategoriyi, gerçek dünya örnekleriyle ve önleme tekniklerinden oluşan pratik savunmalarla özetler.
A01: Broken Access Control
İlgili rehberler: SSL sertifikası nasıl alınır · JWT güvenlik · SQL injection önleme · Parola hash (BCrypt, Argon2) · DDoS koruma
En yaygın ve en kritik kategori. IDOR (Insecure Direct Object Reference), path traversal, JWT manipülasyonu, elevation of privilege hepsi buraya girer. /api/orders/123 endpoint''inde order_id''nin kullanıcıya ait olup olmadığını kontrol etmiyorsanız — açıksınız.
// YANLIŞ
app.get('/api/orders/:id', async (req, res) => {
const order = await db.orders.findByPk(req.params.id);
res.json(order); // Başkasının siparişini görür!
});
// DOĞRU
app.get('/api/orders/:id', requireAuth, async (req, res) => {
const order = await db.orders.findOne({
where: { id: req.params.id, user_id: req.user.id }
});
if (!order) return res.status(404).json({ error: 'Not found' });
res.json(order);
});
A02: Cryptographic Failures
Eski adıyla "Sensitive Data Exposure". MD5/SHA1 ile hashlenen parolalar, HTTP üzerinden taşınan sensitive veri, cipher text yerine plaintext DB saklama, zayıf TLS (1.0/1.1).
- Parola için bcrypt, argon2 veya scrypt — hiçbir zaman MD5/SHA
- TLS 1.2 minimum, 1.3 tercih
- HSTS header ile downgrade attack engelle
- Sensitive veriyi DB''de AES-256-GCM ile şifrele
A03: Injection
SQL, NoSQL, OS command, LDAP, XSS hepsi injection ailesine aittir. Temel savunma: parameterized queries ve input sanitization.
// YANLIŞ — SQL injection
const q = `SELECT * FROM users WHERE email = '${req.body.email}'`;
// DOĞRU — parametre
const { rows } = await pool.query(
'SELECT * FROM users WHERE email = $1',
[req.body.email]
);
A04: Insecure Design
Mimari seviyede güvenlik düşünülmemişse kod ne kadar temiz olursa olsun açık kalır. Threat modeling, secure design patterns ve defense-in-depth eksikliği bu kategoriyi oluşturur. Örnek: parola sıfırlama için zayıf 4 haneli kod, rate limit olmayan giriş formu, hesap kilidi olmayan kritik işlem.
A05: Security Misconfiguration
- Varsayılan parolalar (admin/admin)
- Detaylı error mesajları (
stack traceproduction''da!) - Gereksiz açık portlar ve servisler
- Out-of-date framework ve library
- Cloud bucket public açık
aws s3 ls --no-sign-request s3://BUCKET ile test edin. Yanlışlıkla public yapılan bucket''lar her yıl milyonlarca dolarlık ihlallere neden oluyor.A06: Vulnerable and Outdated Components
log4j-shell, Spring4Shell, PrototypeJS güncel örnekler. Dependency scanning CI/CD''nin parçası olmalı: npm audit, pip-audit, snyk test, trivy.
# Node.js
npm audit --production
npm audit fix --force
# Python
pip install pip-audit
pip-audit
# Docker image tarama
trivy image myapp:latest
A07: Identification and Authentication Failures
Zayıf parola politikası, session fixation, credential stuffing''e açık login. 2FA zorunluluğu, CAPTCHA, rate limit ve session invalidation temel koruma katmanlarıdır.
A08: Software and Data Integrity Failures
Supply chain attack''lar son 3 yılın en büyük tehditi. SolarWinds, ua-parser-js, event-stream paket kompromizasyonları. Kontroller: paket imzası, lock file commit, dependency pinning, SBOM üretimi.
A09: Security Logging and Monitoring Failures
Saldırı olduğunu farketmezseniz savunamazsınız. Ortalama breach keşif süresi 200+ gün. Kritik event''leri (login failure, privilege change, data export) mutlaka logla ve merkezi SIEM''e gönder.
A10: Server-Side Request Forgery (SSRF)
Uygulamanız kullanıcı input''u ile iç ağa istek atıyorsa SSRF açığı olabilir. Klasik örnek: "URL girin, önizleme yapayım" özelliği — saldırgan http://169.254.169.254/latest/meta-data/ ile AWS credentials''ı sızdırır.
// SSRF koruması: iç IP''leri blokla
const net = require('net');
function isInternalIP(ip) {
const parts = ip.split('.').map(Number);
return parts[0] === 10
|| (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31)
|| (parts[0] === 192 && parts[1] === 168)
|| parts[0] === 127
|| parts[0] === 169; // metadata, link-local
}
// URL fetch öncesi DNS resolve + IP doğrula
const { address } = await dns.promises.lookup(urlHost);
if (isInternalIP(address)) throw new Error('Blocked internal IP');
Savunma Stratejisi
- Defense in depth — her katmanda bağımsız savunma
- Least privilege — her servis/kullanıcı minimum yetki
- Zero trust — iç ağdan gelen isteğe bile güvenme
- Threat modeling — tasarımda tehditleri belirle
- Pentesting — yılda en az 1 kere 3. parti test
- Bug bounty — kritik uygulamalar için açık davet
Web Güvenliği ve Uygulama Savunması
Modern web güvenliği katmanlı savunma (defense-in-depth) ile yapılır: TLS 1.3 ve HSTS ile şifreli iletişim, WAF (Web Application Firewall) ile OWASP Top 10 saldırılarına karşı koruma, BCrypt veya Argon2id ile parola hash'leme, JWT token'larında imza doğrulama (HMAC veya RSA), CSRF token + SameSite cookie ile cross-site istek koruması ve Content Security Policy ile XSS azaltma. SQL injection önleme için prepared statement, brute force için fail2ban veya rate limiting, DDoS koruması için Cloudflare/Anti-DDoS sağlayıcı zorunludur. Güvenlik açığı taraması (Burp Suite, OWASP ZAP) ve düzenli güvenlik denetimi; üretim ortamında veri sızıntısı ve hesap ele geçirme risklerini büyük ölçüde azaltır.
OWASP Top 10 uyumluluk testi, pentest ve kod denetimi için iletişime geçin