Rapor ne buldu?
SupaExplorer adlı bir sitenin Ocak 2026 raporu, beş küçük ürün dizininden (Fazier, TinyLaunch, Uneed, PeerPush, TrustMRR) topladığı 20.052 siteyi taradı. Her sitenin ana sayfasına ve yüklediği JavaScript dosyalarına bakıp *.supabase.co adreslerini ve JWT biçimindeki anahtarları aradılar. 2.217 alan adında, yani yaklaşık %11’inde bir şey buldular. Başlıktaki “dokuzda bir” buradan geliyor.
Ama rakamı okurken dikkatli ol. Rapor, bulunan anahtarların kaçının gerçekten gizli anahtar olduğunu ayrıca vermiyor. Sadece “önemli bir kısmının” güvenlik kurallarını atlayabildiğini söylüyor. Tarama aracı da kapalı kaynak, yani sonucu bağımsız olarak tekrarlamak mümkün değil. Üstelik bulunan her anahtar bir sızıntı değil, çünkü bazıları zaten herkese açık olması için yapılmış.
Supabase’de iki tür anahtar var
Supabase’in belgelerine göre:
- Publishable anahtar (
sb_publishable_..., eski adıanon): Tarayıcıda ve mobil uygulamada durması için yapılmış. Gizli değil. İsteği yetkisizanonya da giriş yapmış kullanıcı içinauthenticatedrolüyle yapıyor. - Secret anahtar (
sb_secret_..., eski adıservice_role): Sadece sunucuda kullanılmalı. Bağlı olduğu Postgres rolündeBYPASSRLSyetkisi var, yani bütün güvenlik kurallarını atlıyor.
Supabase, tarayıcıdan gelen secret anahtarlı istekleri User-Agent başlığına bakıp reddediyor. Bu seni korumaz: Anahtarı ele geçiren biri onu tarayıcı dışından, basit bir komutla kullanır.
Açık anahtarı ne koruyor?
Supabase’in API’si, PostgREST yazımızda anlattığımız gibi, veritabanı rollerine ve Row Level Security (RLS) kurallarına güveniyor. Publishable anahtarla gelen biri, sadece tablodaki kuralların izin verdiği satırları görebiliyor. RLS açık ama hiç kural yoksa hiçbir şey göremiyor.
Tersi de doğru: RLS kapalı bir tablo, anahtarı bulan herkese açık. Yani publishable anahtarın güvenliği tamamen RLS’ye bağlı.
Anahtar pakete nasıl giriyor?
Next.js, NEXT_PUBLIC_ ile başlayan ortam değişkenlerini derleme sırasında JavaScript’in içine gömüyor. Vite’ta bu önek VITE_. Videodaki benzetme yerinde: Bu önek bir güvenlik etiketi değil, kargo etiketi. Videoda basit bir Next.js uygulaması derleniyor, ardından tarayıcıya giden dosyada arama yapılıyor ve adresle anahtar orada çıkıyor. Kimse bir şey hack’lemedi. Sadece tarayıcının zaten indirdiği dosya okundu. Aynı yol, yanlışlıkla secret anahtarı da gönderebilir.
Ne yapmalısın?
- Gizli işleri sunucuya taşı. Tarayıcı senin API’ni çağırsın, secret anahtarı sadece o API kullansın.
- Her açık tabloda RLS’yi aç ve kuralları dene. Farklı bir kullanıcıyla giriş yapıp başkasının satırını okumaya çalış.
- Derlenmiş çıktıda ara.
sb_secret_ile başlayan bir değer görürsen sorun var. Eski anahtarlareyJile başlayan JWT’ler ve rol adı açıkça yazmıyor. Ortadaki kısmı base64’ten çözdüğünde"role":"service_role"görürsen o anahtar sızmış demektir. - Sızdıysa hemen değiştir. Belgelerdeki sıra: yeni anahtar oluştur, her yerde değiştir, sonra eskisini kapat. Gizli anahtarları genel olarak nasıl yöneteceğini .env yazımızda anlattık.
Sonra ne oldu?
Supabase’in 7 Ocak 2026’daki güvenlik özetine göre panelden oluşturulan tablolarda RLS artık varsayılan olarak açık. SQL ya da migration ile oluşturulan tablolar için otomatik açan bir event trigger öneriliyor. Ayrıca herkese açık GitHub depolarına düşen secret anahtarlar otomatik iptal ediliyor. Eski anon ve service_role anahtarları 2026 sonunda kaldırılacak. Yeni anahtar oluşturmak eskilerini kapatmıyor, bu ayrı bir adım.
28 Nisan 2026’da duyurulan bir değişiklikle public şemasındaki yeni tablolar artık API’ye kendiliğinden açılmıyor. Açıkça grant vermen gerekiyor. Yeni projelerde bu Mayıs sonundan beri varsayılan. Duyuruya göre mevcut projelere 30 Ekim 2026’da uygulanacak. RLS ise aynen yerinde: İzin ve satır kuralı iki ayrı katman.
Düşün
- Uygulamanın tarayıcıya gönderdiği dosyalarda en son ne zaman arama yaptın?
- Tablolarındaki RLS kurallarını gerçekten başka bir kullanıcıyla test ettin mi?
Videoyu izle
Kaynaklar (9, İngilizce)
- Better Stack: 1 in 9 Apps Ship Supabase Keys: Here’s How It Happens (video) (yeni sekmede açılır)
- SupaExplorer: Cybersecurity Insight Report, January 2026 (yeni sekmede açılır)
- Supabase Docs: Understanding API keys (yeni sekmede açılır)
- Supabase Docs: Row Level Security (yeni sekmede açılır)
- Supabase Docs: Securing your data (yeni sekmede açılır)
- Supabase Blog: Supabase Security Retro 2025 (yeni sekmede açılır)
- Supabase Changelog: Tables not exposed to Data and GraphQL API automatically (yeni sekmede açılır)
- Next.js Docs: Environment variables (yeni sekmede açılır)
- Vite Docs: Env variables and modes (yeni sekmede açılır)
Kendi cümlelerimizle yazılmış bir özettir, çeviri değildir. Tüm kaynaklar yukarıda.