Tutte le guide
Gravità CriticoSecret esposti

API key esposte nel JavaScript lato client

Tutto ciò che arriva al browser — script inline, JS raggruppato, source map — può essere letto da chiunque. Le chiavi segrete (OpenAI, secret Stripe, AWS, URL di database) incorporate nel codice del frontend sono di fatto pubblicate.

Che cos'è

Gli strumenti di build inseriscono le variabili d'ambiente in fase di compilazione. Se fai riferimento a un secret nel codice client, finisce nel bundle JavaScript che ogni visitatore scarica.

C'è una distinzione cruciale: le chiavi publishable/anon (pk_live di Stripe, config web di Firebase) sono progettate per essere pubbliche, ma le chiavi segrete (sk_live, chiavi service role, API key dei provider) no e non devono mai arrivare al browser.

Perché è importante

Una chiave di provider trapelata permette a chiunque di far lievitare l'utilizzo sul tuo account — bollette per LLM, addebiti SMS, spese cloud — o di accedere ai dati che la chiave autorizza.

I malintenzionati analizzano i bundle JavaScript su vasta scala cercando pattern di chiavi. Un secret committato viene di solito sfruttato pochi minuti dopo la messa online.

Come risolverlo

Tieni i secret sul server

Chiama le API di terze parti da una route server o dal backend, mai dal browser. Il browser parla con il tuo endpoint; il tuo endpoint custodisce la chiave.

// 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());
}
Usa il prefisso NEXT_PUBLIC_ con intenzione

In Next.js solo le variabili con prefisso NEXT_PUBLIC_ vengono esposte al browser. Non mettere mai un secret dietro quel prefisso: usalo solo per valori che è sicuro rendere pubblici.

Ruota le chiavi trapelate

Se un secret è arrivato al browser, revocalo e riemettilo. Rimuoverlo dalla build successiva non invalida le copie già raccolte.

FAQ

La mia chiave publishable Stripe (pk_live) è un problema nel frontend?

No: le chiavi publishable sono fatte per essere pubbliche. Il rischio è la chiave segreta (sk_live), che deve restare lato server.

Posso semplicemente offuscare la chiave?

No. L'offuscamento è banalmente reversibile. L'unica soluzione è tenere il secret completamente fuori dal client.

La tua app è interessata?

AppSafe controlla questo e decine di altri problemi in un'unica scansione gratuita.

Scansiona la mia app gratis