Back to Blog

Security Basics

February 17, 20263 min
Web SecurityAuthentication SecurityAPI Security
Security Basics

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