Vai al contenuto

Basi della sicurezza

Una chiave segreta Stripe nel frontend può muovere denaro

Una chiave segreta Stripe esposta nel tuo frontend può rimborsare, addebitare e leggere ogni scheda cliente che hai. La tua chiave pk_live_ ci sta bene.

Vlad Tkachenko11 min di lettura
Un registratore di cassa da negozio con il cassetto dei contanti aperto e una chiave lasciata nella serratura sul davanti della macchina.

In breve

  • Una chiave segreta Stripe esposta nel tuo frontend è la fuga che viene addebitata al tuo conto: rimborsi, nuovi addebiti e ogni scheda cliente che hai.
  • pk_live_ sta nella tua app ed è sempre stato così. sk_live_ ne differisce per un solo carattere e ha permessi senza limiti su tutto il tuo account Stripe.
  • Crea prima la chiave sostitutiva, mettila in produzione e solo dopo fai scadere la vecchia. Cancellare la riga dal codice non richiama indietro nulla che sia già stato scaricato.
  • Abbiamo trovato una chiave segreta Stripe attiva in 3 app su 30.998 scansionate. Tutte e tre sono uscite con voto D.

Apri la tua app in produzione in un browser, guarda il sorgente della pagina e cercaci dentro sk_live_. Se torna una stringa lunga, hai una chiave segreta Stripe esposta nel tuo frontend, e qualsiasi visitatore tu abbia mai avuto avrebbe potuto copiarla.

Ecco il punto in cui i consigli generici sulle chiavi API sbagliano: Stripe ti dà due chiavi attive, si somigliano quasi in tutto, e una delle due deve stare nella tua app. La chiave che inizia con pk_live_ sta lì per progetto. La chiave che inizia con sk_live_ ha, con le parole di Stripe, permessi senza limiti su tutte le API. Differiscono per un carattere in mezzo a una stringa lunga, ed è lì la maggior parte del motivo per cui questa cosa continua a succedere.

Tra il 12 e il 14 agosto 2026 abbiamo passato nove controlli esterni su 30.998 app in produzione costruite con Lovable, Bolt, v0, Replit e Base44. Tre di esse spedivano una chiave segreta Stripe attiva, e altre due una con restrizioni, il che ne fa una delle cose più rare emerse dalla scansione; gli stessi nove controlli hanno trovato una chiave API Google in 1.142 app. Tutte e tre le chiavi segrete sono uscite con voto D, perché un singolo rilievo critico mette un tetto al voto lì, per quanto bene sia tutto il resto. I numeri completi sono nel nostro rapporto di scansione.

Una chiave segreta Stripe esposta nel frontend è un problema?

Sì, se la stringa inizia con sk_live_. No, se inizia con pk_live_.

Stripe emette due chiavi attive perché le due metà di un pagamento avvengono in due posti diversi. Immagina il bancone di un negozio. Il POS è rivolto verso il cliente ed è avvitato bene in vista, e il peggio che uno sconosciuto possa farci è pagarti. La cassa dietro il bancone è tutto un altro oggetto. Si apre, contiene l’incasso della giornata, e nel cassetto sotto c’è una scheda per ogni cliente con l’indirizzo scritto sopra.

pk_live_ è il POS. Il suo lavoro è costruire un modulo di pagamento dentro il browser di qualcun altro, e la documentazione di Stripe dice che le chiavi pubblicabili si possono esporre senza problemi nel codice frontend.

sk_live_ è la chiave della cassa. Stripe descrive le chiavi segrete come dotate di permessi senza limiti su tutte le API, che è la stessa frase letta dall’altro lato: non c’è nulla nel tuo account che non riesca a raggiungere.

La tua app ha bisogno del POS nel browser anche solo per incassare. Della chiave della cassa non dovrebbe avere bisogno mai.

pk_live_ e sk_live_: come distinguerle

Leggi il secondo carattere del prefisso. È tutto qui il test.

ChiaveInizia conSicura nel browser?Cosa fa
Pubblicabilepk_live_…Sta quiCostruisce il modulo di pagamento e tokenizza una carta. Non legge clienti e non muove denaro.
Segretask_live_…MaiPermessi senza limiti su tutte le API di Stripe, su tutto il tuo account.
Con restrizionirk_live_…MaiSolo i permessi spuntati alla creazione. Resta una credenziale valida in mano a un estraneo.
Di testsk_test_, pk_test_NoTocca solo il tuo ambiente di prova. Un problema più piccolo con la stessa abitudine dietro.

La parte centrale del prefisso è la seconda cosa da leggere. _test_ non raggiunge nulla oltre il tuo ambiente di prova, quindi una chiave di test trapelata non ti costa denaro; pubblica comunque come è costruita la tua integrazione, e l’indicazione di Stripe è di trattare come compromessa qualsiasi chiave segreta o con restrizioni vista dove non doveva stare. Gli account più recenti possono portare anche una chiave di organizzazione che inizia con sk_org_ e che opera su più di un account Stripe insieme. Segue la stessa regola, e una fuga lì arriva più lontano di un singolo account.

Cosa può fare qualcuno con una chiave segreta Stripe trapelata

Tutto quello che puoi fare tu nella tua dashboard e che non richieda la password.

Non "ottenere accesso non autorizzato". In concreto, con nient’altro che la stringa e un terminale: leggere l’elenco completo dei tuoi clienti, con nomi, indirizzi email, indirizzi di fatturazione e le ultime quattro cifre di ogni carta. Leggere ogni pagamento che hai mai incassato, e per cosa ha pagato ogni cliente. Emettere rimborsi. Creare addebiti e link di pagamento a tuo nome. Disdire abbonamenti.

Le due chiavi stanno nello stesso file. La seconda colonna è quello che compra il carattere in più, e ogni spunta rossa lì è una richiesta che va a buon fine.

Poi c’è l’uso che non ha niente a che fare con te. Il tuo account diventa un posto dove fare card testing, il termine di Stripe stesso per un truffatore che fa passare numeri di carta rubati attraverso l’integrazione di chiunque per trovare quelli ancora validi. Le carte sono di altre persone. I rifiuti, le contestazioni e le spiegazioni sono tuoi.

Quello che in genere non possono fare è pagare se stessi. Un rimborso torna sulla carta che ha fatto il pagamento originale, e un bonifico va sul conto bancario registrato, che è il tuo. Sembra una buona notizia e non lo è: significa che il danno arriva come denaro tuo che se ne va, schede dei tuoi clienti copiate e il tuo account usato per la truffa di qualcun altro, invece che come un bonifico da indicare e inseguire.

Niente di tutto questo richiede un attaccante sofisticato. La documentazione di Stripe dice che ci sono soggetti fraudolenti che scandagliano di continuo le basi di codice pubbliche in cerca di chiavi esposte, e quegli scanner non hanno bisogno di sapere chi sei per trovare la tua.

Come rigenerare una chiave segreta Stripe senza fermare i pagamenti

Crea prima la sostituta, mettila in produzione e solo dopo fai scadere la vecchia. In quest’ordine.

  1. Nella dashboard di Stripe, crea una nuova chiave segreta. Per ora lascia stare la vecchia; funzionano entrambe insieme, e quella sovrapposizione è ciò che tiene in piedi il tuo checkout.
  2. Metti la chiave nuova dove viveva la vecchia, e dovrebbe essere un server, una Edge Function o una route serverless. Mai l’app che scarica il browser.
  3. Fai il deploy, poi incassa un pagamento reale. Un addebito che va a buon fine è l’unica prova che la chiave nuova sia collegata bene.
  4. Fai scadere la chiave vecchia. Stripe lo descrive proprio così: far scadere una chiave segreta o con restrizioni le impedisce qualsiasi altra chiamata alle API.
  5. Leggi lo storico dei pagamenti del periodo in cui la chiave era esposta, e le email di Stripe per qualsiasi cosa che non hai fatto tu.

Se la chiave è già fuori e preferisci perdere qualche pagamento piuttosto che lasciarla attiva un’altra ora, fai il contrario. Rigenerare una chiave la blocca subito e ne genera una nuova, e Stripe segnala che gli endpoint webhook creati con la vecchia chiave restano attivi, quindi la tua gestione degli eventi sopravvive all’emergenza.

La sovrapposizione nel pannello centrale è tutto il punto. Le due chiavi sono attive insieme, ed è questo che permette lo scambio senza un buco nel tuo checkout.

C’è ancora un passaggio, ed è quello che quasi tutti fanno per primo: cancellare la chiave dal codice. Fallo, e sii chiaro su cosa ottiene. I tuoi visitatori hanno già scaricato il file che la portava, quel file sta in cache di browser che non controlli, e il vecchio valore è ancora nel tuo storico delle versioni. Far scadere la chiave su Stripe è ciò che chiude la porta. Togliere la riga è ciò che ti impedisce di spedirla di nuovo.

Le chiavi pubblicabili, per inciso, non si possono far scadere affatto. Stripe non ha mai costruito quel controllo, perché quella chiave non doveva mai essere privata.

Cos’è una chiave con restrizioni di Stripe, e quando è la risposta giusta

Una chiave tagliata su misura per un lavoro invece che per tutti.

Una chiave con restrizioni inizia con rk_live_ e porta soltanto i permessi che spunti quando la crei. Una chiave che può leggere le fatture non può emettere un rimborso. Una chiave che può creare addebiti non può leggere il tuo elenco clienti. Stripe consiglia di passare dalle chiavi segrete a quelle con restrizioni esattamente per questo, ed è un buon consiglio sul codice che gira sul tuo server.

Non è un modo per rendere accettabile una chiave nel browser. Due delle 30.998 app della nostra scansione spedivano una chiave con restrizioni nel frontend, ed entrambe sono uscite con voto C. La nostra scansione tratta una chiave con restrizioni come rilievo alto dove una segreta è critica, e un singolo rilievo alto mette un tetto al voto a C. Chi trova quella chiave ottiene comunque ogni permesso che hai spuntato, da qualunque posto.

Dove una chiave con restrizioni si guadagna il suo posto è il caso intermedio scomodo, e le app fatte con l’IA ne producono parecchi. Uno strumento di automazione che deve leggere i tuoi bonifici. Uno script di report che qualcuno ti ha scritto su Fiverr. Una Edge Function che crea sempre e solo un tipo di addebito. Ognuno di questi gira su un server e ognuno ha bisogno di una frazione del tuo account, quindi ognuno prende la sua chiave con quella frazione spuntata, e il giorno in cui una trapela revochi una chiave invece di ricablare tutta la tua integrazione.

Come controllare cosa sta spedendo davvero la tua app

Parti a mano, perché non costa niente e non richiede niente di installato. Apri il tuo sito in produzione, guarda il sorgente della pagina e cercaci dentro sk_live_, poi rk_live_, poi pk_live_. Trovare la terza e non le prime due è il risultato che vuoi.

Quello che una ricerca nel sorgente si perde è il JavaScript che la pagina carica dopo, e su un’app costruita con Lovable, Bolt o Replit è quasi tutto. Il nostro scanner gratuito apre la tua app in un browser vero, aspetta che arrivino i bundle e legge quelli. Classifica quello che trova invece di cercare stringhe a forma di chiave, così pk_live_ torna segnata come corretta e sk_live_ torna come rilievo critico, e le due non finiscono mai nello stesso mucchio.

Le chiavi sono uno dei nove controlli in sola lettura. Gli altri sono il motivo per cui un voto ti dice più di una ricerca nel tuo sorgente.

Voto, punteggio e conteggi compaiono sullo schermo in una ventina di secondi, senza account. Se lasci un indirizzo email arriva anche l’elenco dettagliato, insieme a una correzione scritta per il builder che hai usato e che puoi incollare così com’è.

Tre cose che la scansione non farà, e sono i motivi per cui la puoi puntare senza timore su un’app in produzione che incassa davvero: non fa mai il login, non scrive mai niente, e non conserva mai una chiave che trova. Un segreto esposto viene salvato come suggerimento mascherato nella forma sk_live_…a1b2, e il valore vero viene buttato via. Scansiona la tua app, oppure leggi prima cosa guarda ognuno dei nove controlli.

Cosa fare adesso

Cosa fare

  • Leggi il secondo carattere prima di ogni altra cosa. pk_live_ nel tuo bundle è corretta e non chiede niente; sk_live_ e rk_live_ sì.
  • Crea prima la chiave sostitutiva e conferma un pagamento reale con quella, poi fai scadere la vecchia su Stripe. È la scadenza che chiude la porta.
  • Cancellare la chiave dal codice non chiude niente da solo. Il file che la portava è già scaricato, in cache e nel tuo storico delle versioni.
  • Sposta su un server tutto quello che aveva bisogno di quella chiave: una Edge Function, una route serverless, qualunque cosa che non sia il browser.
  • Leggi lo storico dei pagamenti e l’elenco clienti del periodo in cui la chiave era attiva. La rigenerazione ferma quello che succede da adesso e non dice niente su quello che è già successo.
  • Dai a ogni lavoro lato server la sua chiave con restrizioni e i soli permessi che gli servono, così la prossima fuga ti costa una chiave e non tutte.

Una chiave Stripe di solito arriva tardi. L’app esce, gira per un po’, e poi un giorno aggiungi il checkout, ed è quel deploy a mettere per la prima volta una credenziale di incasso nel bundle. La scansione che hai fatto al lancio era la fotografia di un’app che ancora non poteva prendere soldi.

Reeve Monitor è fatto per quel vuoto. Ripassa tutti e nove i controlli ogni ora su un massimo di tre app, sorveglia la raggiungibilità ogni 60 secondi, ti avvisa il giorno in cui un risultato cambia invece di aspettare che tu guardi, e manda un report mensile in parole semplici. Una chiave che arriva nel bundle con un deploy di giovedì finisce nella scansione di quell’ora. Costa €12 al mese di listino, con sette giorni gratis prima di addebitarti qualcosa, e la pagina dei prezzi a volte sta sotto la cifra qui e mai sopra.

Se preferisci procedere per lista, la checklist di sicurezza in 10 minuti copre questo insieme alle altre cose che vale la pena chiudere in un’app appena lanciata. Per la domanda più ampia su quali chiavi abbiano senso in un browser, abbiamo una guida per distinguere le chiavi pubblicabili da quelle segrete, la stessa domanda per una chiave OpenAI, e un censimento di cosa spedivano davvero 30.998 app.

FAQ

La mia chiave pubblicabile Stripe è sicura nel frontend?

Sì. Una chiave che inizia con pk_live_ deve stare nella pagina, e Stripe lo dice nella sua documentazione: le chiavi pubblicabili si possono esporre senza problemi nel codice frontend. Costruisce il modulo di pagamento e tokenizza una carta. Non può leggere i tuoi clienti, muovere denaro o rimborsare nulla. Se uno scanner o un conoscente ti ha detto che hai una chiave Stripe esposta, leggi il secondo carattere prima di fare qualsiasi altra cosa, perché una chiave pk_live_ dentro il tuo bundle è la tua integrazione che funziona esattamente come Stripe l’ha progettata.

Cosa può fare qualcuno con una chiave segreta Stripe trapelata?

Tutto quello che puoi fare tu nella tua dashboard e che non richieda la password. Può leggere l’elenco completo dei tuoi clienti con nomi, indirizzi email, indirizzi di fatturazione e le ultime quattro cifre di ogni carta, leggere ogni pagamento che hai mai incassato, emettere rimborsi finché il tuo saldo non è vuoto, creare addebiti e link di pagamento, e far passare numeri di carta rubati attraverso il tuo account per trovare quelli ancora validi. Quest’ultima cosa Stripe la chiama card testing, e a te arriva come contestazioni e rifiuti su un account che credevi tranquillo.

Come rigenero una chiave Stripe senza interrompere i pagamenti?

Crea prima la sostituta. Nella dashboard di Stripe crea una nuova chiave segreta, mettila dove viveva la vecchia sul tuo server, fai il deploy e conferma un pagamento reale con la chiave nuova. Solo a quel punto fai scadere la vecchia, cosa che le impedisce qualsiasi altra chiamata alle API. Se la chiave è già pubblica e preferisci perdere qualche pagamento piuttosto che lasciarla attiva, rigenerala subito: la rigenerazione blocca la chiave immediatamente e ne genera una nuova, e Stripe segnala che gli endpoint webhook creati con la vecchia chiave restano attivi.

Cos’è una chiave con restrizioni di Stripe?

Una chiave tagliata su misura per un solo lavoro. Una chiave con restrizioni inizia con rk_live_ e porta soltanto i permessi che spunti quando la crei, quindi una chiave che può leggere le fatture non può emettere un rimborso. Stripe consiglia di passare dalle chiavi segrete a quelle con restrizioni proprio per questo. Leggilo come un consiglio sul codice che gira sul tuo server, non come un modo per rendere accettabile una chiave lato browser: una chiave con restrizioni dentro il tuo bundle resta una credenziale che uno sconosciuto può usare, e la nostra scansione la classifica come rilievo alto.

Stripe mi avvisa se la mia chiave trapela?

A volte, e non puoi contarci. Stripe dice di scandagliare attivamente internet alla ricerca di chiavi API trapelate, con strumenti come lo scanner di token di GitHub, e che può avvisarti o disattivare una chiave che trova. La sua stessa pagina di buone pratiche aggiunge che il rilevamento non è garantito. Quella ricerca funziona soprattutto sui repository di codice pubblici, e una chiave compilata dentro il JavaScript del tuo dominio non è un repository. Tratta come compromessa qualsiasi chiave che hai visto dove non doveva stare, che Stripe abbia detto qualcosa o no.

Una chiave di test (sk_test_) è pericolosa nel mio frontend?

È un problema molto più piccolo di una chiave attiva e vale comunque la pena chiuderlo. Una chiave di test tocca solo il tuo ambiente di prova, quindi nessuno può prendersi i tuoi soldi con quella. Quello che consegna, però, è una mappa funzionante di come è montata la tua integrazione, e di solito significa che la stessa abitudine del copia e incolla è a un deploy di distanza dallo spedire la chiave attiva. Stripe tratta come compromessa qualsiasi chiave segreta o con restrizioni vista dove non doveva stare. Falla scadere e sposta la chiamata su un server.

Scritto da

Vlad Tkachenko

Fondatore di Reeve

Passo le giornate a guardare app costruite con Lovable, Bolt, v0, Cursor e Replit, e la breve lista di errori che vi ricompaiono di continuo.

Altro sull'autore

Da leggere dopo

Tutti gli articoli

Non sai come sta messa la tua app?

Esegui una scansione gratuita e ottieni un voto chiaro da A a F in una ventina di secondi. Senza account e senza carta.

Scansiona la tua app gratis

Controllo esterno automatizzato, non un audit completo. L'assenza di risultati non è una garanzia di sicurezza.