İstemci tarafı JavaScript'te açığa çıkan API key'leri
Tarayıcıya gönderilen her şey — inline script'ler, paketlenmiş JS, source map'ler — herkes tarafından okunabilir. Frontend koduna gömülü secret key'ler (OpenAI, Stripe secret, AWS, veritabanı URL'leri) fiilen yayınlanmış demektir.
Nedir
Build araçları, environment variable'ları derleme zamanında koda gömer. İstemci kodunda bir secret'a referans verirsen, o secret her ziyaretçinin indirdiği JavaScript bundle'ında yer alır.
Kritik bir ayrım vardır: publishable/anon key'ler (Stripe pk_live, Firebase web yapılandırması) herkese açık olacak şekilde tasarlanmıştır, ancak secret key'ler (sk_live, service-role key'ler, sağlayıcı API key'leri) değildir ve asla tarayıcıya ulaşmamalıdır.
Neden önemli
Sızmış bir sağlayıcı key'i, herkesin hesabında kullanım biriktirmesine — LLM faturaları, SMS ücretleri, bulut harcaması — ya da key'in yetki verdiği verilere erişmesine olanak tanır.
Saldırganlar, key kalıpları aramak için JavaScript bundle'larını büyük ölçekte tarar. Commit'lenen bir secret genellikle yayına girdikten dakikalar sonra kötüye kullanılır.
Nasıl düzeltilir
Üçüncü taraf API'leri bir server route'tan veya backend'den çağır, asla tarayıcıdan değil. Tarayıcı senin endpoint'inle konuşur; endpoint'in key'i tutar.
// app/api/summarize/route.ts (server-only)
export async function POST(req: Request) {
const { text } = await req.json();
const r = await fetch("https://api.openai.com/v1/responses", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY}` },
body: JSON.stringify({ model: "gpt-4o-mini", input: text }),
});
return Response.json(await r.json());
}Next.js'te yalnızca NEXT_PUBLIC_ önekli değişkenler tarayıcıya açılır. Bir secret'ı asla bu önekin arkasına koyma — onu yalnızca herkese açık olması güvenli değerler için kullan.
Bir secret tarayıcıya gönderildiyse, onu iptal et ve yeniden düzenle. Sonraki build'den kaldırmak, zaten kazınmış kopyaları geçersiz kılmaz.
SSS
Stripe publishable key'im (pk_live) frontend'de sorun mu?
Hayır — publishable key'ler herkese açık olacak şekilde tasarlanmıştır. Risk, sunucu tarafında kalması gereken secret key'dir (sk_live).
Key'i sadece obfuscate edebilir miyim?
Hayır. Obfuscation kolayca geri alınabilir. Tek çözüm, secret'ı istemciden tamamen uzak tutmaktır.
Uygulaman etkileniyor mu?
AppSafe, bunu ve onlarca başka sorunu tek bir ücretsiz taramada kontrol eder.
Uygulamamı ücretsiz taraBlogdan
Sahte yapay zekâ tarayıcıları .env dosyalarının peşinde. Seninkini nasıl kontrol edersin
Kimlik bilgisi tarayıcıları allowlist'leri atlatmak için yapay zekâ tarayıcılarının adlarını ödünç alıyor ve özellikle tek bir dosyayı istiyor: senin .env dosyanı. Seninkinin erişilebilir olup olmadığını nasıl kontrol edersin ve nasıl kilitlersin.
Railway ihlali: uygulamanın secret'larını kesinti olmadan nasıl yenilersin
Saldırganlar yapay zekâ ve platform API key'lerinin peşine düşünce Railway tüm kullanıcılarından ortam değişkenlerini yenilemelerini istedi. Ne kadar açıkta olduğunu nasıl kontrol edersin, uygulamanı çökertmeden her şeyi nasıl yenilersin ve bir sonraki ihlalin daha az canını yakmasını nasıl sağlarsın.
AI ile bir uygulama mı yayınlıyorsun? Yayına almadan önce şu 7 şeyi kontrol et
AI kodlama araçları "çalışıyor" için optimize eder, "yayına almak güvenli" için değil. Yeni yayınlanan her uygulamada ilk kontrol ettiğimiz yedi sorun bunlar — ve her birinin çözümü.
İlgili rehberler
.env dosyalarının açığa çıkması: saldırganlar secret'larını nasıl bulur
Erişilebilir tek bir .env, tüm stack'ini teslim edebilir.
Supabase Row Level Security (RLS): tablolarını kilitle
Anon key'in herkese açık. Onunla verilerin arasındaki tek şey RLS.
Firebase Security Rules: veritabanını açık bırakmayı bırak
Firebase config'in tasarım gereği herkese açık. Verileri kimin göreceğine kuralların karar verir.
Production'daki source map'ler kaynak kodunu sızdırır
Yayınlanan .map dosyaları orijinal kaynağını teslim eder.