OWASP (Open Web Application Security Project) Top 10, web uygulamalarında en sık karşılaşılan güvenlik risklerini belgeleyen referans listesidir. 2021 baskısına göre her geliştirici bu 10 riski anlayıp kod yazarken önlem almalıdır.
A01: Broken Access Control
En yaygın ve tehlikeli açık türüdür. Kullanıcı, erişim yetkisi olmayan kaynaklara ulaşabilir.
// PHP //
// ZAYIF KOD — Sadece ID ile yetkilendirmepublic function show($id) { $document = Document::find($id); return response()->json($document); // Kimin olduğunu kontrol etmedi!}// DOĞRU KOD — Sahiplik kontrolüpublic function show($id) { $document = Document::findOrFail($id); if ($document->user_id !== auth()->id()) { abort(403, 'Bu belgeye erişim yetkiniz yok.'); } return response()->json($document);}
A02: Cryptographic Failures
Hassas verilerin şifrelenmemesi veya zayıf şifreleme kullanımı.
// PYTHON //
# ZAYIF — MD5 ile şifre hashlemek (kırılabilir)import hashlibhashed = hashlib.md5(password.encode()).hexdigest() # ASLA YAPMAYIN# DOĞRU — bcrypt ile güvenli hashlemeimport bcrypthashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt(rounds=12))# Doğrulamais_valid = bcrypt.checkpw(input_password.encode(), hashed)
Algoritma
Kullanım
Durum
MD5
Şifre hashleme
YASAK
SHA-1
İmzalama
Güncel değil
bcrypt / argon2id
Şifre hashleme
ÖNERİLEN
AES-256-GCM
Veri şifreleme
ÖNERİLEN
A03: SQL Injection
Kullanıcı girdisinin doğrudan SQL sorgusuna eklenmesi, saldırganın veritabanını manipüle etmesine olanak verir.
// PYTHON //
# ZAYIF — String concatenation ile sorguusername = request.form['username']query = f"SELECT * FROM users WHERE username = '{username}'"# Giriş: ' OR '1'='1 → Tüm kullanıcılar listelenir!# DOĞRU — Parametreli sorgu (Prepared Statement)import sqlite3conn = sqlite3.connect('app.db')cursor = conn.cursor()username = request.form['username']cursor.execute( "SELECT * FROM users WHERE username = ?", (username,) # Parametre ayrı — hiçbir zaman SQL'e enjekte edilmez)
// CSHARP //
// C# — Entity Framework ile SQLi'dan korunma// ORM, parametreli sorguları otomatik kullanırvar user = await db.Users .Where(u => u.Username == username) // Güvenli .FirstOrDefaultAsync();// Ham sorgu gerekiyorsa — parametreleri her zaman ayrı geçinvar results = await db.Database .SqlQuery<User>($"SELECT * FROM Users WHERE Id = {id}") .ToListAsync(); // EF Core 7+ interpolation otomatik parameterize eder
A07: Identification and Authentication Failures
Zayıf kimlik doğrulama mekanizmaları.
// TYPESCRIPT //
// ZAYIF — Tahmin edilebilir session ID, şifresiz tokenconst sessionId = `user_${userId}_${Date.now()}`; // Tahmin edilebilir!// DOĞRU — Kriptografik random tokenimport crypto from 'crypto';function generateSecureToken(): string { return crypto.randomBytes(32).toString('hex'); // 256-bit entropi}// Rate limiting — brute force korumasıimport rateLimit from 'express-rate-limit';const loginLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 dakika max: 5, // Max 5 başarısız deneme message: 'Çok fazla giriş denemesi. 15 dakika bekleyin.', skipSuccessfulRequests: true,});app.post('/login', loginLimiter, authController.login);
A05: Security Misconfiguration
// PHP //
// ZAYIF — Production'da debug modu açıkAPP_DEBUG=true // Stack trace'ler saldırgana bilgi sızdırır// DOĞRU — .env dosyası ayarlarıAPP_ENV=productionAPP_DEBUG=false// Güvenli HTTP başlıklarıheader('X-Content-Type-Options: nosniff');header('X-Frame-Options: DENY');header('Content-Security-Policy: default-src \'self\'');header('Referrer-Policy: strict-origin-when-cross-origin');
A06: Vulnerable and Outdated Components
// BASH //
# npm güvenlik denetiminpm audit# pip güvenlik denetimipip-audit# Composer güvenlik denetimicomposer audit# Otomatik güncelleme için Dependabot (GitHub)# .github/dependabot.yml dosyası oluşturun
OWASP Top 10, başlangıç seviyesi değil, her profesyonelin bilmesi gereken minimum güvenlik standardıdır. Bu derste ele aldığımız açıkların büyük çoğunluğu framework'lerin güvenli API'lerini doğru kullanmakla engellenebilir.