Alle Guides
Schweregrad KritischOffengelegte Secrets

API-Keys, die in clientseitigem JavaScript offengelegt sind

Alles, was an den Browser ausgeliefert wird — Inline-Skripte, gebündeltes JS, Source Maps — kann jeder lesen. Secret Keys (OpenAI, Stripe Secret, AWS, Datenbank-URLs), die in Frontend-Code eingebettet sind, sind praktisch veröffentlicht.

Was es ist

Build-Tools fügen Umgebungsvariablen zur Compile-Zeit ein. Wenn du ein Secret in Client-Code referenzierst, landet es im JavaScript-Bundle, das jeder Besucher herunterlädt.

Es gibt eine entscheidende Unterscheidung: Publishable-/Anon-Keys (Stripe pk_live, Firebase-Web-Config) sind für die Öffentlichkeit gedacht, aber Secret Keys (sk_live, Service-Role-Keys, Provider-API-Keys) sind es nicht und dürfen niemals in den Browser gelangen.

Warum es wichtig ist

Ein geleakter Provider-Key erlaubt jedem, auf deine Kosten Nutzung zu verursachen — LLM-Rechnungen, SMS-Gebühren, Cloud-Ausgaben — oder auf Daten zuzugreifen, die der Key autorisiert.

Angreifer durchsuchen JavaScript-Bundles im großen Stil nach Key-Mustern. Ein committetes Secret wird meist innerhalb von Minuten nach dem Live-Gang missbraucht.

So behebst du es

Halte Secrets auf dem Server

Rufe Drittanbieter-APIs von einer Server-Route oder einem Backend auf, niemals aus dem Browser. Der Browser spricht mit deinem Endpoint; dein Endpoint hält den Key.

// 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());
}
Verwende das Präfix NEXT_PUBLIC_ bewusst

In Next.js werden nur Variablen mit dem Präfix NEXT_PUBLIC_ an den Browser ausgeliefert. Stelle niemals ein Secret hinter dieses Präfix — verwende es nur für Werte, die gefahrlos öffentlich sein dürfen.

Rotiere geleakte Keys

Ist ein Secret in den Browser gelangt, widerrufe es und stelle ein neues aus. Es aus dem nächsten Build zu entfernen, macht bereits abgegriffene Kopien nicht ungültig.

FAQ

Ist mein Stripe Publishable Key (pk_live) im Frontend ein Problem?

Nein — Publishable Keys sind für die Öffentlichkeit gedacht. Das Risiko ist der Secret Key (sk_live), der serverseitig bleiben muss.

Kann ich den Key nicht einfach verschleiern?

Nein. Verschleierung lässt sich trivial rückgängig machen. Die einzige Lösung ist, das Secret vollständig aus dem Client herauszuhalten.

Ist deine App betroffen?

AppSafe prüft dies und Dutzende weitere Probleme in einem kostenlosen Scan.

Meine App gratis scannen