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

DosyaGit’e eklenir mi?Ne için?
.env.example✅ EvetŞablon (değerler boş)
.env❌ HayırVarsayılan ortam değişkenleri
.env.local❌ HayırKişisel geliştirme ayarları
.env.production❌ HayırProduction değerleri
.env.development❌ HayırDevelopment 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
FrameworkClient prefixErişim
ViteVITE_import.meta.env.VITE_*
Next.jsNEXT_PUBLIC_process.env.NEXT_PUBLIC_*
Create React AppREACT_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ı

  1. Hemen revoke edin: Supabase Dashboard → Settings → API → Regenerate
  2. Git geçmişini temizleyin: git filter-branch veya BFG Repo-Cleaner
  3. İlgili servisleri kontrol edin: Unauthorized access loglarını inceleyin
  4. 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

  • .env dosyası .gitignore’da mı?
  • .env.example mevcut mu?
  • Client prefix (VITE_/NEXT_PUBLIC_) sadece public key’lerde mi?
  • service_role key sadece server-side’da mı?
  • Deployment platform’da environment variables şifrelenmiş mi?
  • Eski key’ler rotasyona alındı mı?

İlgili Yazılar


Bu rehber Vite Env Variables, Next.js Environment Variables ve Supabase Security Best Practices dokümantasyonuna dayanarak hazırlanmıştır.

📚 İlgili Yazılar