İ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 taraİ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.
Production'daki source map'ler kaynak kodunu sızdırır
Yayınlanan .map dosyaları orijinal kaynağını teslim eder.
Secure, HttpOnly ve SameSite cookie flag'leri
Oturum cookie'lerinin çalınmasını önleyen üç flag.