Security Basics
Security bir “özellik” değil, yazılımın temel gereksinimidir. Uygulama ne kadar hızlı veya ölçeklenebilir olursa olsun, veriyi koruyamıyorsa başarısızdır.
Bu bölümde temel web güvenlik risklerini ve bunlara karşı alınabilecek önlemleri ele alıyoruz.
1) SQL Injection
Nedir?
SQL Injection, kullanıcının input alanına SQL kodu enjekte ederek veritabanı sorgusunu manipüle etmesidir.
Tehlikeli kullanım:
db.query(`SELECT * FROM users WHERE email='${email}'`);
Saldırgan input:
email = ' OR 1=1 --
Bu durumda sorgu tüm kullanıcıları dönebilir.
Çözüm
- ORM kullanmak
- Parametrized queries kullanmak
- Input validation yapmak
Güvenli yaklaşım:
User.findOne({ where: { email } });
Başarılı bir injection saldırısı:
- Yetkisiz veri erişimi
- Şifre, kredi kartı, kişisel veri sızıntısı
- Veri silme veya değiştirme
2) Broken Authentication
Authentication sürecinin yanlış veya eksik uygulanmasıdır.
Authentication sorusu: “Sen kimsin?”
Broken Authentication problemi: “Söylediğin kimliği gerçekten doğrulamıyoruz.”
Yaygın Sebepler
- Zayıf şifre politikası
- Brute-force koruması olmaması
- Süresiz JWT
- Logout sonrası token iptal edilmemesi
- MFA’nın eksik uygulanması
Session Fixation
Kötü akış:
- Kullanıcı siteye girer → session_id=abc
- Login olur
- Session ID değişmez
Eğer saldırgan abc değerini biliyorsa login sonrası da yetkilidir.
Doğru yaklaşım: Login sonrası session rotate edilmelidir.
JWT Güvenlik Hataları
Riskli token:
{
"userId": 42
}
Eğer:
- exp yok
- iat yok
- logout blacklist yok
Token çalındığında süresiz erişim sağlar.
Güvenli JWT Kuralları
- Short-lived access token
- Secure, HttpOnly refresh token
- exp, iat, aud, iss alanları
- Logout’ta refresh token iptali
Password Reset Açıkları
Riskli reset link:
/reset?token=123
Eğer token:
- Kısa
- Süresiz
- Tekrar kullanılabilir
ise hesap ele geçirilir.
Güvenli reset:
- Tek kullanımlık
- 5–15 dk geçerli
- Hashlenmiş token
3) Password Security
Hashing vs Encryption
Hashing:
- Tek yönlüdür
- Geri döndürülemez
- Şifreler için kullanılır
- Örnek: bcrypt, Argon2
Encryption:
- Çift yönlüdür
- Anahtar ile geri açılabilir
- Mesajlaşma veya hassas veri için kullanılır
- Örnek: AES, RSA
Salting
Hash öncesi rastgele veri eklenir. Aynı şifreler farklı hash üretir.
4) Security Headers
Node.js’te genellikle Helmet ile uygulanır.
XSS (Cross-Site Scripting)
Saldırganın sitende zararlı JS çalıştırmasıdır.
Korunma:
- Content Security Policy (CSP)
- Input sanitization
- Output escaping
CSRF (Cross-Site Request Forgery)
Kullanıcının haberi olmadan onun adına işlem yapılmasıdır.
Korunma:
- CSRF token
- SameSite=Strict cookie
- Double submit cookie pattern
5) API Güvenliği
Rate Limiting
- Brute force engeller
- DoS saldırısını azaltır
- Endpoint başına limit koyulmalı
Input Validation
Kural: “Kullanıcıdan gelen her veri potansiyel olarak zehirlidir.”
- Joi / Zod gibi kütüphaneler kullanılmalı
- Tip, uzunluk, format doğrulanmalı
CORS
CORS bir browser güvenlik mekanizmasıdır.
Amaç: Tarayıcının kötü niyetli siteler tarafından saldırı aracı olarak kullanılmasını engellemek.
CORS, Postman veya server-to-server istekleri engellemez.
Örnek yapılandırma:
const cors = require('cors');
const allowedOrigins = ['http://localhost:3001'];
app.use(cors({
origin: allowedOrigins,
credentials: true,
methods: ['GET', 'POST'],
allowedHeaders: ['Content-Type', 'Authorization']
}));
6) Kimlik ve Secret Yönetimi
- JWT secret kod içinde tutulmaz
- .env dosyasında saklanır
- Repo’ya push edilmez
- Refresh token HttpOnly cookie’de saklanır
- Token rotation uygulanmalıdır
Güvenlik Kontrol Listesi
- Güçlü şifre politikası
- Rate limiting
- Session rotation
- JWT expiration
- CSRF koruması
- CSP header
- Input validation
- Tek kullanımlık reset token
- Secret yönetimi