3.6 KiB
3.6 KiB
Trip Create Security - Quick Reference
🚀 Hızlı Başlangıç
Frontend'de Kullanım
import { tripsApiSafe } from '@/db/api';
// ✅ DOĞRU
const trip = await tripsApiSafe.create({
title: "İstanbul Gezisi",
destination: "İstanbul",
start_date: "2026-03-01",
end_date: "2026-03-10"
});
// ❌ YANLIŞ
const trip = await tripsApi.create({ ... }); // Güvensiz!
🔒 Güvenlik Özellikleri
| Özellik | Açıklama | Hata Mesajı |
|---|---|---|
| Auth Mandatory | Giriş zorunlu | "Seyahat oluşturmak için giriş yapmalısınız." |
| Rate Limiting | 5 trip/saat | "Saatlik limit aşıldı. X dakika sonra tekrar deneyin." |
| Title Validation | 3-200 karakter | "Seyahat başlığı en az 3 karakter olmalıdır." |
| Date Validation | Geçerli tarih | "Bitiş tarihi başlangıç tarihinden önce olamaz." |
| Location Validation | Geçerli koordinat | "Enlem değeri -90 ile 90 arasında olmalıdır." |
📋 Validation Kuralları
Başlık (title)
- ✅ Min: 3 karakter
- ✅ Max: 200 karakter
- ✅ Zorunlu
Açıklama (description)
- ✅ Max: 2000 karakter
- ✅ Opsiyonel
Tarihler (start_date, end_date)
- ✅ Geçerli ISO format (YYYY-MM-DD)
- ✅ end_date >= start_date
- ✅ Max süre: 365 gün
Konum (start_lat, start_lng)
- ✅ Enlem: -90 ile 90 arası
- ✅ Boylam: -180 ile 180 arası
İlgi Alanları (interests)
- ✅ Max: 20 adet
- ✅ Her biri max 50 karakter
🧪 Test Komutları
# Lint kontrolü
npm run lint
# Type check
npm run type-check
# Build
npm run build
📊 Rate Limiter Utility
import { rateLimiter } from '@/utils/rateLimiter';
// Limit kontrolü
rateLimiter.check('trip_create_user123', 5, 3600000);
// Kalan istek sayısı
const remaining = rateLimiter.remaining('trip_create_user123', 5);
// Sıfırlanma zamanı
const resetTime = rateLimiter.resetTime('trip_create_user123');
// Manuel sıfırlama (test için)
rateLimiter.reset('trip_create_user123');
🔍 Security Logs
// Log formatı
[SECURITY AUDIT] 2026-02-08T10:30:00.000Z | Event: TRIP_CREATE_SUCCESS | User: user-uuid | Details: { ... }
// Log olayları
- TRIP_CREATE_FAILED // Yetkisiz erişim
- TRIP_CREATE_RATE_LIMITED // Rate limit aşımı
- TRIP_CREATE_VALIDATION_FAILED // Geçersiz input
- TRIP_CREATE_DB_ERROR // Veritabanı hatası
- TRIP_CREATE_SUCCESS // Başarılı oluşturma
🐛 Hata Yakalama
try {
const trip = await tripsApiSafe.create({ ... });
} catch (error: any) {
// error.message kullanıcıya gösterilebilir
toast.error(error.message);
// Detaylı log için
console.error('Trip creation error:', error);
}
📚 Daha Fazla Bilgi
- Detaylı Test Senaryoları:
TRIP_CREATE_SECURITY_TESTS.md - Implementasyon Özeti:
TRIP_CREATE_SECURITY_SUMMARY.md - Rate Limiter Utility:
src/utils/rateLimiter.ts - API Implementation:
src/db/api.ts(satır 1052+)
⚠️ Önemli Notlar
- Her zaman
tripsApiSafe.create()kullanın - Hata mesajlarını kullanıcıya gösterin (
error.message) - Rate limit için Redis kullanımı önerilir (production)
- Security logları düzenli kontrol edin
- Test senaryolarını çalıştırın
🎯 Checklist
tripsApiSafe.create()kullanıldı mı?- Hata mesajları kullanıcıya gösteriliyor mu?
- Auth kontrolü yapılıyor mu?
- Rate limiting aktif mi?
- Input validation çalışıyor mu?
- Security logları görünüyor mu?