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
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());
}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.
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 gratisDal blog
Finti crawler AI stanno dando la caccia ai tuoi file .env. Ecco come controllare i tuoi
Gli scanner di credenziali prendono in prestito i nomi dei crawler AI per aggirare le allowlist, e cercano un file in particolare: il tuo .env. Come verificare se il tuo è raggiungibile e come metterlo al sicuro.
La violazione di Railway: come ruotare i segreti della tua app senza downtime
Railway ha chiesto a tutti gli utenti di rigenerare le variabili d'ambiente dopo che gli attaccanti hanno preso di mira le API key dei provider AI e delle piattaforme. Come verificare la tua esposizione, ruotare tutto senza mandare giù l'app e far sì che la prossima violazione faccia meno male.
Stai per lanciare un'app creata con l'AI? Controlla queste 7 cose prima
Gli strumenti di AI coding ottimizzano per "funziona", non per "è sicuro da lanciare". Questi sono i sette problemi che controlliamo per primi su qualsiasi app appena lanciata, con la soluzione per ciascuno.
Guide correlate
File .env esposti: come i malintenzionati trovano i tuoi secret
Un solo .env raggiungibile può consegnare l'intero stack.
Supabase Row Level Security (RLS): proteggi le tue tabelle
La tua anon key è pubblica. La RLS è l'unica cosa tra lei e i tuoi dati.
Firebase Security Rules: smetti di lasciare aperto il tuo database
La tua config Firebase è pubblica per design. Sono le regole a decidere chi vede i dati.
Le source map in produzione fanno trapelare il tuo codice sorgente
I file .map distribuiti consegnano il tuo codice sorgente originale.