Basi della sicurezza
Come usare i secret su Replit, e cosa viene comunque pubblicato
Come usare i secret su Replit: aggiungerne uno, rileggerlo e risolvere le due cause dell'undefined. E le chiavi che lo strumento non riesce a proteggere.

In breve
- Come usare i secret su Replit: apri lo strumento Secrets, aggiungi un nome e un valore e rileggi quel valore nel codice come variabile di ambiente.
- Questo tiene la chiave fuori dai tuoi file. Non la tiene fuori dalla tua app pubblicata, perché quello che legge il codice del browser finisce dentro ciò che ogni visitatore scarica.
- La spia è il nome. Una variabile che comincia per VITE_ o NEXT_PUBLIC_ è stata messa nel browser apposta dal tuo strumento di build.
- Un secret vuoto nell’app pubblicata di solito vuol dire che la versione in linea è stata pubblicata prima che tu lo creassi. Pubblica di nuovo.
Da qualche parte fra il costruire la tua app e il pubblicarla, Replit ti ha detto di smettere di mettere la chiave API nel codice. Così hai cercato come usare i secret su Replit, hai spostato la chiave nello strumento Secrets e l’avviso è sparito. Poi qualcosa ti ha detto che la chiave è ancora visibile nella tua app pubblicata, e le due cose sembrano vere allo stesso tempo.
Lo sono. Ecco la parte che quasi tutti i consigli su questo tralasciano: lo strumento Secrets decide dove un valore è custodito. Il tuo codice decide dove viene portato. Sono due domande separate, e solo la prima ha a che fare con lo strumento.
Su Replit questo morde più che altrove, perché la metà della tua app che gira sulla macchina di Replit e la metà che gira sul portatile del tuo visitatore stanno nello stesso progetto, spesso in file vicini. Niente nell’editor traccia una linea fra le due.
Fra il 12 e il 14 agosto 2026 abbiamo eseguito gli stessi nove controlli esterni su 30.998 app in linea, di cui 3.042 pubblicate su Replit. In 219 di quelle app Replit c’era qualcosa a forma di chiave dentro il codice che un visitatore scarica. Su tutto il campione, la maggior parte di ciò che quel controllo trova è una chiave Google, che con una restrizione di solito va bene. Quelle che non vanno bene sono proprio quelle che uno strumento di secret avrebbe dovuto evitare. I numeri completi sono nel nostro rapporto di scansione.
Come uso i secret su Replit?
Apri lo strumento Secrets, aggiungi un nome e un valore e rileggi quel valore nel tuo codice come variabile di ambiente. Ci vuole circa un minuto.
- Nel tuo progetto apri Secrets. Sta nell’elenco degli strumenti, e cercare la parola in quel pannello lo trova.
- Scegli + New secret. Dagli un nome in maiuscolo con trattini bassi, per
esempio
OPENAI_API_KEY. Quel nome è ciò che userà il tuo codice, quindi conta più di quanto sembri. - Incolla il valore nel secondo campo e salva. Replit lo cifra e lo tiene fuori dai file del progetto.
- Rileggilo nel codice. In JavaScript è
process.env.OPENAI_API_KEY, in Python èos.getenv("OPENAI_API_KEY"). - Torna indietro e cancella il valore da dove stava prima.
Il quinto passo è quello che si salta, ed è quello da cui dipende se tutto il resto è servito. Creare un secret non rimuove la copia che avevi già. Una chiave incollata in un file la settimana scorsa è ancora in quel file, ancora nella cronologia del progetto e ancora dentro ogni copia della tua app pubblicata da allora.
Un file .env fa lo stesso lavoro dello strumento Secrets, con una differenza
che conta: è un file, quindi viaggia con il progetto quando qualcuno lo forka o
lo collega a un repository.
I secret di Replit sono sicuri?
Per quello che fanno, sì. Il valore è cifrato, sta fuori dal tuo codice sorgente, e i tre modi più comuni in cui una chiave sfugge di mano sono tutti chiusi da questo: condividi il progetto con un collaboratore, lo colleghi a un repository, oppure qualcuno ti guarda lavorare.
Pensalo come un cassetto chiuso a chiave. Quello che sta nel cassetto è fuori dalla vista di chiunque legga i tuoi file. Quello che il cassetto non può decidere è cosa fa la tua app con il contenuto una volta che il tuo codice lo ha aperto e se n’è andato.
E un’app Replit pubblicata se ne va con parecchio. A ogni visitatore che carica il tuo sito viene spedita tutta la metà anteriore, perché un browser non può disegnare una pagina che non gli è stata mandata. Se il codice che apre il cassetto è codice che viene spedito ai visitatori, il valore che ha tirato fuori viaggia con lui.
Quale metà della tua app legge la chiave?
La metà che gira sulla macchina di Replit può leggere un secret senza rischio. La metà che gira nel browser del tuo visitatore non può, e il modo consueto di farla funzionare è anche il modo in cui la chiave diventa pubblica.
Il tuo codice server è la parte che Replit esegue: una rotta Express, un handler Python, una funzione che parla con OpenAI o Stripe e restituisce una risposta alla tua app. Legge un secret, lo usa, e il valore non lascia mai la macchina.
Il tuo codice del browser è tutto ciò che esegue il portatile del tuo visitatore. In un progetto React è la maggior parte di quello che hai modificato. Viene compilato in un pacchetto di JavaScript e scaricato per intero da chiunque apra il tuo sito.
process.env non esiste in un browser, quindi il codice del browser che lo legge
non ottiene proprio niente. Per far arrivare il valore, qualcuno lo rinomina:
VITE_OPENAI_API_KEY in un progetto Vite, oppure NEXT_PUBLIC_OPENAI_API_KEY in
uno Next.js. Funziona subito, perché quel prefisso è un’istruzione allo strumento
di build di scrivere il valore dentro il pacchetto. La documentazione di Vite lo
dice con queste parole e sconsiglia di metterci chiavi API proprio per questo
motivo.
Quindi il controllo più rapido di questo articolo è una ricerca. Apri il progetto
e cerca VITE_ e NEXT_PUBLIC_. Ogni risultato è un valore che il tuo strumento
di build ha ordine di pubblicare.
Per alcuni è corretto. Una chiave pubblicabile di Supabase è fatta per stare in un browser, e lo è anche una chiave di Google Maps con una restrizione di referrer. È sbagliato per tutto ciò che spende soldi o legge un database senza chiedere chi sta bussando, e distinguere le due richiede circa un minuto per chiave.
Se preferisci vedere cosa sta consegnando la tua app pubblicata prima di andare file per file, la nostra scansione gratuita legge il tuo sito da fuori e ti dice cosa riesce a trovarci. Richiede circa 20 secondi e non serve un account: scansiona la tua app.
Perché il mio secret di Replit non funziona?
Due motivi, e da dove sei producono lo stesso sintomo: un valore vuoto e un’app che non funziona.
Il codice che lo legge gira nel browser. Lì non c’è nessun ambiente da
leggere, quindi process.env.LA_TUA_CHIAVE è vuoto e resterà tale. Questo non è
un problema di configurazione, e ricreare il secret quante volte vuoi non lo
sposta di un millimetro. La chiamata che ha bisogno della chiave deve traslocare
nella metà server della tua app.
La tua app pubblicata sta girando in una versione più vecchia. Replit tiene due insiemi di valori, quelli del tuo workspace e quelli con cui gira la tua app pubblicata. Si sincronizzano, quindi un secret che aggiungi di norma arriva al deployment. Quello che l’app in linea usa davvero, però, è ciò che c’era l’ultima volta che l’hai pubblicata. Aggiungi un secret dopo e l’app in funzione non ne saprà nulla finché non pubblichi di nuovo.
La guida di Replit per un’app che funziona nell’editor e si rompe una volta
pubblicata comincia esattamente da qui, quindi conviene aprire i secret di
deployment e leggerne i nomi prima di dare qualcosa per rotto. Un nome scritto
OPENAI_KEY da una parte e OPENAI_API_KEY dall’altra produce lo stesso valore
vuoto di un secret mancante.
Un deploy che fallisce a mezzanotte è il momento in cui si prende la scorciatoia. Incollare il valore direttamente nel codice sblocca tutto in pochi secondi, l’app torna su, e la chiave sta nel tuo pacchetto pubblicato da quel momento in poi.
La chiave è già nella mia app pubblicata. E adesso?
Ruotala, prima di cambiare qualsiasi riga di codice. Nel pannello del fornitore, genera una chiave nuova e revoca quella vecchia.
Quest’ordine conta perché la rotazione è l’unico passo che rende inutilizzabile il valore esposto. Modificare il codice lo toglie dalla versione attuale e lo lascia nella cronologia del progetto, e non fa assolutamente nulla contro le copie del tuo pacchetto già scaricate, messe in cache e indicizzate. Nemmeno il fatto che la tua app sia piccola aiuta: i crawler automatici leggono di continuo i siti pubblici in cerca di stringhe a forma di chiave, senza la minima idea di chi tu sia.
Poi, in quest’ordine:
- Metti la chiave nuova in Secrets e leggila solo da codice server.
- Sposta la chiamata che ne aveva bisogno. Tutto ciò che parla con OpenAI, Anthropic, Stripe o con il tuo database usando una chiave amministrativa sta dietro una rotta che la tua app chiama, così il browser chiede al tuo server e il tuo server tiene la chiave.
- Controlla le pagine di utilizzo e fatturazione del fornitore per il periodo in cui la vecchia chiave era pubblica. La rotazione ferma quello che succede da ora in poi e non dice niente di quello che è già successo.
Le chiavi dei fornitori di modelli sono le prime da controllare su Replit.
OPENAI_API_KEY è l’esempio a cui ricorre la documentazione di Replit quando ti
mostra come aggiungere un secret, e di una chiave OpenAI o Anthropic non esiste
una variante pubblicabile. Ognuna di esse addebita direttamente sul tuo account.
Un altro posto da guardare già che ci sei: se il tuo progetto pubblica le source map, un visitatore può leggere quel pacchetto come i file originali che hai scritto, con i tuoi nomi di variabile ancora sopra.
Cosa fare questa settimana
Cosa fare
- Sposta ogni chiave nello strumento Secrets, poi cancella le copie che hai lasciato nei file. Creare un secret non rimuove il vecchio valore.
- Cerca
VITE_eNEXT_PUBLIC_nel tuo progetto. Ogni risultato è un valore che il tuo strumento di build pubblica apposta, e ognuno deve essere una chiave che si poteva pubblicare. - Per ogni chiave che non lo è, sposta la chiamata che la usa nella tua metà server, così il browser chiede alla tua app e la tua app tiene la chiave.
- Se un secret è vuoto nell’app pubblicata ma funziona nell’editor, pubblica di nuovo e controlla il nome nei tuoi secret di deployment prima di toccare il codice.
- Ruota dal fornitore tutto ciò che è già uscito, prima di toccare il codice. Poi leggi la pagina di fatturazione delle settimane in cui era pubblica.
Fai prima la ricerca. Richiede un minuto, non ha bisogno di installare niente e ti dice quali delle chiavi nel tuo progetto sono già pubbliche. La checklist di sicurezza in 10 minuti copre il resto di quello che vale la pena verificare in un’app appena lanciata, e la guida in linguaggio semplice per questa piattaforma è la tua app Replit è sicura?.
FAQ
I secret di Replit sono sicuri?
Per quello che fanno, sì. Replit cifra i valori e li tiene fuori dai tuoi file, così condividere il progetto, collegarlo a un repository o farsi guardare mentre lavori non consegna più la chiave a chi sta osservando. Quello che lo strumento non può decidere è dove la tua app porta il valore dopo. Una chiave letta da codice che gira sulla macchina di Replit resta su Replit. La stessa chiave letta da codice che gira nel browser del tuo visitatore finisce dentro ciò che pubblichi, e averla messa prima in Secrets non cambia nulla.
Perché il mio secret di Replit risulta undefined?
Due cause, e da dove ti trovi sembrano identiche. O il codice che lo legge gira nel browser, dove non c’è nessun ambiente da leggere e process.env non contiene niente, oppure la tua app pubblicata sta girando in una versione distribuita prima che tu creassi il secret. Per il secondo caso pubblica di nuovo: un’app in linea usa i valori che c’erano l’ultima volta che è uscita.
Posso usare un secret nel mio frontend React su Replit?
Puoi metterci un valore, e non sarà segreto. Il codice React gira sulla macchina del tuo visitatore, quindi tutto ciò che legge deve prima essere spedito lì. Gli strumenti di build lo rendono esplicito con un prefisso: Vite espone al codice del browser solo le variabili che cominciano per VITE_, e Next.js solo quelle NEXT_PUBLIC_. Aggiungere il prefisso è il modo in cui si fa funzionare una chiave nel frontend, ed è anche il momento in cui quella chiave diventa pubblica. Le chiavi pubblicabili stanno lì. Tutto ciò che spende soldi o legge un database sta sul server.
Devo aggiungere di nuovo i miei secret quando pubblico?
Di solito no, perché i secret di deployment si sincronizzano con quelli del tuo workspace, ma il valore che usa la tua app in linea è quello presente alla tua ultima pubblicazione. Un secret aggiunto dopo arriva al deployment con la successiva. La guida di Replit per un’app che funziona nell’editor e fallisce una volta pubblicata comincia proprio da qui, quindi se al momento del deploy manca qualcosa, apri i secret di deployment e controlla che il nome ci sia e sia scritto uguale.
Ho incollato una chiave API in un file prima di scoprire lo strumento Secrets. Basta cancellare il file?
No. Ruota prima la chiave dal fornitore, perché è questo che chiude davvero la porta, e poi sposta il valore in Secrets. Cancellare una riga di codice la toglie dalla versione attuale e non dalla cronologia del progetto, né da una copia della tua app pubblicata che qualcuno ha già. La rotazione è l’unico passo che rende inutilizzabile il vecchio valore, e di solito richiede circa un minuto nel pannello del fornitore.