Environment Variables Güvenli Yönetimi: .env Dosyalarının Doğrusu
.env dosyası nasıl güvenli yönetilir? VITE_ ve NEXT_PUBLIC_ prefix kuralları, .gitignore, service_role key tehlikesi ve secret rotation stratejisi rehberi.
En Yaygın Güvenlik Hatası
Bir geliştiricinin işe ilk başladığı gün yaptığı en tehlikeli şeylerden biri:
# ❌ YAPMAYIN — API key'iniz artık git geçmişinde SONSUZA KADAR
git add .env
git commit -m "config ekledim"
git push origin main
Tek bir commit — API key’iniz artık GitHub’da herkesin görebildiği yerde.
.env Dosya Hiyerarşisi
| Dosya | Git’e eklenir mi? | Ne için? |
|---|---|---|
.env.example | ✅ Evet | Şablon (değerler boş) |
.env | ❌ Hayır | Varsayılan ortam değişkenleri |
.env.local | ❌ Hayır | Kişisel geliştirme ayarları |
.env.production | ❌ Hayır | Production değerleri |
.env.development | ❌ Hayır | Development değerleri |
Öncelik sırası (Vite): .env.local > .env.[mode] > .env
.gitignore — İlk Gün Yapılacak
# .gitignore — ZORUNLU
.env
.env.local
.env.*.local
.env.production
.env.development
Client vs Server — VITE_ ve NEXT_PUBLIC_ Kuralı
Frontend framework’ler prefix ile hangi değişkenlerin client-side’a gönderileceğini belirler:
# .env
# ✅ Client-side'da kullanılabilir (tarayıcıda görünür!)
VITE_SUPABASE_URL=https://xxx.supabase.co
VITE_SUPABASE_ANON_KEY=eyJhbGci...
# ❌ Client-side'da ERİŞİLEMEZ (server-only)
SUPABASE_SERVICE_ROLE_KEY=eyJhbGci...
DATABASE_URL=postgresql://user:pass@host:5432/db
| Framework | Client prefix | Erişim |
|---|---|---|
| Vite | VITE_ | import.meta.env.VITE_* |
| Next.js | NEXT_PUBLIC_ | process.env.NEXT_PUBLIC_* |
| Create React App | REACT_APP_ | process.env.REACT_APP_* |
⚠️ Prefix olan her değişken tarayıcıda görünür. Asla gizli key’leri prefix ile başlatmayın!
Supabase Key’leri — Hangisi Tehlikeli?
# ✅ GÜVENLİ — Client-side'da kullanılabilir
# RLS ile korunur, sınırlı yetkili
VITE_SUPABASE_ANON_KEY=eyJhbGci...
# ❌ TEHLİKELİ — ASLA client-side'a koymayın!
# RLS'i BYPASS eder, tüm veritabanına TAM ERİŞİM
SUPABASE_SERVICE_ROLE_KEY=eyJhbGci...
service_role key client’a sızarsa: Herhangi biri tüm tablolarınızdaki tüm verileri okuyabilir, değiştirebilir ve silebilir.
.env.example Dosyası
Her projede .env.example dosyası OLMALI:
# .env.example — Git'e ECLENİR, değerler boş
# Supabase Bağlantısı
VITE_SUPABASE_URL=
VITE_SUPABASE_ANON_KEY=
# Yalnızca server-side
SUPABASE_SERVICE_ROLE_KEY=
DATABASE_URL=
# İsteğe bağlı
SMTP_HOST=
SMTP_PORT=587
Deployment Platform Ayarları
Vercel
Settings → Environment Variables → Add
- SUPABASE_SERVICE_ROLE_KEY: [değer]
- Environments: Production ✅ Preview ✅ Development ❌
Cloudflare Pages
Settings → Environment Variables → Production
- SUPABASE_SERVICE_ROLE_KEY: [Encrypt ✅]
Netlify
Site Settings → Environment variables → Add
- SUPABASE_SERVICE_ROLE_KEY: [değer]
- Scopes: Builds ✅ Functions ✅ Runtime ❌
Eğer Key Sızdıysa — Acil Eylem Planı
- Hemen revoke edin: Supabase Dashboard → Settings → API → Regenerate
- Git geçmişini temizleyin:
git filter-branchveyaBFG Repo-Cleaner - İlgili servisleri kontrol edin: Unauthorized access loglarını inceleyin
- Takıma bildirin: Tüm geliştiriciler yeni key’leri almalı
# BFG ile git geçmişinden silme
brew install bfg
bfg --replace-text passwords.txt repo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive
Checklist — Her Projede Kontrol Edin
-
.envdosyası.gitignore’da mı? -
.env.examplemevcut mu? - Client prefix (
VITE_/NEXT_PUBLIC_) sadece public key’lerde mi? -
service_rolekey sadece server-side’da mı? - Deployment platform’da environment variables şifrelenmiş mi?
- Eski key’ler rotasyona alındı mı?
İlgili Yazılar
- API Güvenlik Kontrol Listesi — Rate limiting, CORS, input validation
- Supabase RLS Yetkilendirme — anon key + RLS güvenliği
- Supabase Auth — Auth key ve session yönetimi
- Cloudflare Tunnel — On-premise güvenli bağlantı
Bu rehber Vite Env Variables, Next.js Environment Variables ve Supabase Security Best Practices dokümantasyonuna dayanarak hazırlanmıştır.