REST API'nizi production ortamına almadan önce güvenlik açısından gözden geçirmeniz gereken 10 kritik madde. Bu liste OWASP API Security Top 10'u temel alır ve her teknoloji yığını için geçerlidir.
1. Authentication — Her Endpoint'te Doğrulama
// TYPESCRIPT //
// KÖTÜ — token sadece bazı endpoint'lerde kontrol ediliyorapp.get('/api/users', authMiddleware, userController.list);app.get('/api/users/:id', userController.getById); // Auth unutulmuş!// İYİ — route grubu seviyesinde zorunlu authconst protectedRouter = express.Router();protectedRouter.use(requireAuth); // Tüm route'lar içinprotectedRouter.get('/users', userController.list);protectedRouter.get('/users/:id', userController.getById);protectedRouter.patch('/users/:id', userController.update);app.use('/api', protectedRouter);
# KÖTÜ — sadece giriş yapılmış olması yeterli sayılıyor@app.route('/api/orders/<int:order_id>')@login_requireddef get_order(order_id: int): order = Order.query.get_or_404(order_id) return jsonify(order.to_dict()) # Başkasının siparişi!# İYİ — sahiplik kontrolü@app.route('/api/orders/<int:order_id>')@login_requireddef get_order(order_id: int): order = Order.query.filter_by( id=order_id, user_id=current_user.id # Sadece kendi siparişleri ).first_or_404() return jsonify(order.to_dict())
3. Rate Limiting — Brute Force ve DDoS Koruması
// TYPESCRIPT //
import rateLimit from 'express-rate-limit';import RedisStore from 'rate-limit-redis';// Giriş endpoint'i — çok sıkıconst loginLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 dakika max: 5, message: { error: 'Çok fazla giriş denemesi.' }, standardHeaders: true, store: new RedisStore({ client: redis }), skipSuccessfulRequests: true,});// Genel API — makul limitconst apiLimiter = rateLimit({ windowMs: 60 * 1000, // 1 dakika max: 100, keyGenerator: (req) => req.user?.id ?? req.ip, // User bazlı});app.post('/auth/login', loginLimiter, authController.login);app.use('/api', apiLimiter);
4. Input Validation — Her Girdiye Güvensiz Bak
// PHP //
// Laravel'de Form Request ile validationclass CreateUserRequest extends FormRequest{ public function rules(): array { return [ 'name' => 'required|string|min:2|max:100|regex:/^[\pL\s]+$/u', 'email' => 'required|email:rfc,dns|unique:users,email|max:255', 'password' => 'required|string|min:12|confirmed|not_in:' . implode(',', $this->commonPasswords()), 'role' => 'required|in:user,moderator', // Admin rolünü giriş sırasında verme! ]; }}
// KÖTÜ — tüm model direkt dönüyorapp.get('/users/:id', async (req, res) => { const user = await User.findByPk(req.params.id); res.json(user); // passwordHash, resetToken, internalNotes dahil!});// İYİ — sadece gerekli alanlarconst UserPublicSchema = z.object({ id: z.string(), name: z.string(), avatarUrl: z.string().nullable(), createdAt: z.date(),});app.get('/users/:id', async (req, res) => { const user = await User.findByPk(req.params.id); if (!user) return res.status(404).json({ error: 'Bulunamadı.' }); res.json(UserPublicSchema.parse(user));});
7. SQL Injection — Parametreli Sorgu Zorunlu
// PYTHON //
# Her zaman parametreli sorgu veya ORM kullanın# ORM (Django, SQLAlchemy, Prisma) otomatik koruması var# Ham SQL gerekiyorsa — parametreliconn.execute( "SELECT * FROM products WHERE category_id = %s AND price < %s", (category_id, max_price) # Parametre ayrı — injection imkansız)# Hiçbir zaman f-string veya format() kullanmayın# YASAK: f"SELECT * FROM users WHERE name = '{name}'"
import cors from 'cors';const allowedOrigins = (process.env.ALLOWED_ORIGINS ?? '').split(',').filter(Boolean);app.use(cors({ origin: (origin, callback) => { if (!origin || allowedOrigins.includes(origin)) { callback(null, true); } else { callback(new Error(`CORS hatası: ${origin} izin listesinde değil.`)); } }, credentials: true, methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],}));
10. Bağımlılık Güvenliği
Hızlı Kontrol Tablosu
Madde
Kontrol
Durum
Her endpoint'te auth
authMiddleware global
✓
Nesne sahipliği kontrolü
user_id === current_user.id
✓
Rate limiting
login: 5/15dk, api: 100/dk
✓
Input validation
Zod / Form Request
✓
HTTPS + güvenlik başlıkları
helmet / HSTS
✓
Hassas alan filtreleme
DTO / Schema
✓
Parametreli sorgu
ORM veya prepared stmt
✓
Stack trace gizleme
production error handler
✓
CORS whitelist
env'den origin listesi
✓
Bağımlılık güvenliği
CI'da npm audit
✓
Sonuç
Bu 10 madde, en yaygın API güvenlik açıklarını kapatır. Bunlar temel; ileri seviyede JWT saldırıları, business logic bypass, timing saldırıları ve API versioning güvenliği gibi konular ayrı bir derse değer.