SİBER GÜVENLİK // OWASPD::03 ORTA
18m READCOMPLETION: 96%ID::SEC-101

OWASP TOP 10: SQL INJECTION VE XSS

En kritik web güvenlik açıkları ve mitigasyon stratejileri

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 yetkilendirme
public 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 hashlib
hashed = hashlib.md5(password.encode()).hexdigest()  # ASLA YAPMAYIN
 
# DOĞRU — bcrypt ile güvenli hashleme
import bcrypt
hashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt(rounds=12))
 
# Doğrulama
is_valid = bcrypt.checkpw(input_password.encode(), hashed)
AlgoritmaKullanımDurum
MD5Şifre hashlemeYASAK
SHA-1İmzalamaGüncel değil
bcrypt / argon2idŞifre hashlemeÖNERİLEN
AES-256-GCMVeri ş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 sorgu
username = 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 sqlite3
conn = 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ır
var user = await db.Users
    .Where(u => u.Username == username)  // Güvenli
    .FirstOrDefaultAsync();
 
// Ham sorgu gerekiyorsa — parametreleri her zaman ayrı geçin
var 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 token
const sessionId = `user_${userId}_${Date.now()}`; // Tahmin edilebilir!
 
// DOĞRU — Kriptografik random token
import 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çık
APP_DEBUG=true  // Stack trace'ler saldırgana bilgi sızdırır
 
// DOĞRU — .env dosyası ayarları
APP_ENV=production
APP_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 denetimi
npm audit
 
# pip güvenlik denetimi
pip-audit
 
# Composer güvenlik denetimi
composer audit
 
# Otomatik güncelleme için Dependabot (GitHub)
# .github/dependabot.yml dosyası oluşturun

Savunma Derinliği İlkesi

Güvenlik kontrol listesi:

  • Parametreli sorgu veya ORM kullanın (SQLi)
  • Her endpointte yetkilendirme kontrolü yapın (IDOR)
  • Şifreleri argon2id veya bcrypt ile hashleyin
  • HTTPS zorunlu kılın (HSTS header)
  • Rate limiting uygulayın (Brute force)
  • Güvenlik başlıklarını ekleyin (CSP, X-Frame-Options)
  • Bağımlılıkları düzenli güncelleyin
  • Hata mesajlarında stack trace göstermeyin

Sonuç

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.