Tüm rehberler
Kritik önem derecesiAçıkta Kalan Secret'lar

İ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

Secret'ları sunucuda tut

Üçü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_PUBLIC_ önekini bilinçli kullan

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.

Sızmış key'leri rotate et

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