[{"data":1,"prerenderedAt":462},["ShallowReactive",2],{"blog-it-which-api-keys-are-safe-in-your-frontend":3},{"id":4,"title":5,"body":6,"category":418,"cover":419,"coverAlt":419,"description":420,"draft":421,"extension":422,"faq":423,"image":439,"keywords":440,"meta":449,"navigation":450,"ogTitle":451,"path":452,"published":453,"seo":454,"stem":455,"tldr":456,"updated":460,"__hash__":461},"blog_it\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend.md","Quali chiavi API sono sicure nel browser e quali no",{"type":7,"value":8,"toc":408},"minimark",[9,13,21,26,29,32,48,51,55,58,61,64,73,79,83,206,209,228,232,254,260,276,287,290,300,305,315,322,326,334,337,344,347,354,358,393,401],[10,11,12],"p",{},"Se hai costruito la tua app con Lovable, Bolt, v0, Cursor o Replit, prima o poi\nsuccede questo: qualcuno apre il sito, preme F12 e ti avvisa che la tua chiave\nAPI è «esposta». È una notizia inquietante, per un'app di cui non sai leggere il\ncodice.",[10,14,15,16,20],{},"Ecco il punto che guida dopo guida racconta male: ",[17,18,19],"strong",{},"alcune di quelle chiavi\ndevono stare lì."," Trattare ogni chiave visibile come una falla porta o ad\nallarmarsi per nulla o, molto peggio, a imparare a ignorare l'avviso, e a\nignorarlo anche il giorno in cui conta davvero.",[22,23,25],"h2",{"id":24},"è-grave-che-la-mia-chiave-api-sia-visibile","È grave che la mia chiave API sia visibile?",[10,27,28],{},"Di solito no. Dipende interamente da quale chiave sia.",[10,30,31],{},"Ogni servizio che parla con un browser distribuisce due tipi diversi di\ncredenziale. Uno è un indirizzo. L'altro è il mazzo di chiavi dell'edificio.\nEntrambi si chiamano «chiave API», ed è da lì che nasce quasi tutta la\nconfusione.",[10,33,34,35,38,39,42,43,47],{},"Un ",[17,36,37],{},"indirizzo"," si può pubblicare senza rischi. Dice solo a quale progetto\nappartiene una richiesta; il controllo dei permessi avviene altrove. Un ",[17,40,41],{},"mazzo\ndi chiavi"," no, perché ",[44,45,46],"em",{},"è"," il controllo dei permessi: chi lo possiede può fare\ntutto ciò che consente, da qualunque posto.",[10,49,50],{},"La tua app ha bisogno dell'indirizzo nel browser per funzionare. Non dovrebbe mai\navere bisogno lì del mazzo di chiavi.",[22,52,54],{"id":53},"perché-la-tua-app-manda-chiavi-al-browser","Perché la tua app manda chiavi al browser",[10,56,57],{},"Perché la richiesta parte dal browser del tuo visitatore, non dal tuo server.",[10,59,60],{},"Quando la tua app carica l'elenco degli ordini dei tuoi utenti, quella richiesta\nparte direttamente dal browser del visitatore verso il tuo fornitore di database.\nDeve dire a quale progetto appartiene, e quell'identificativo deve stare nella\npagina, perché è da lì che la richiesta viene fatta.",[10,62,63],{},"Non esiste una versione in cui quell'identificativo resti segreto. Arriva a ogni\nvisitatore per progetto. Ed è esattamente per questo che i fornitori dividono le\ncredenziali in due: sanno che una delle due diventerà pubblica, quindi l'hanno\nresa innocua.",[10,65,66,67,72],{},"La sicurezza non nasce dal nascondere l'indirizzo. Nasce dalle regole che imposti\ndall'altra parte: nel caso di Supabase la Row Level Security, che decide riga\nper riga chi può vedere cosa. Sono quelle regole che vale la pena controllare, e\n",[68,69,71],"a",{"href":70},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","attivarle non è la stessa cosa che essere protetti",".",[74,75],"diagram",{"alt":76,"caption":77,"src":78},"Due percorsi verso la stessa tabella. La chiave anon si ferma alla barriera della Row Level Security e raggiunge solo le due righe permesse dalle regole. La chiave service_role passa da un varco nella barriera e le raggiunge tutte e sei.","È la Row Level Security a rendere sicura la chiave anon. Una chiave service_role le passa accanto senza fermarsi.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fwhat-each-key-reaches-1600x820.png",[22,80,82],{"id":81},"le-due-famiglie-di-chiavi","Le due famiglie di chiavi",[84,85,86,105],"table",{},[87,88,89],"thead",{},[90,91,92,96,99,102],"tr",{},[93,94,95],"th",{},"Fornitore",[93,97,98],{},"Chiave",[93,100,101],{},"Sicura nel browser?",[93,103,104],{},"Cosa fa",[106,107,108,135,156,174,191],"tbody",{},[90,109,110,114,125,132],{},[111,112,113],"td",{},"Supabase",[111,115,116,120,121,124],{},[117,118,119],"code",{},"sb_publishable_…",", o ",[117,122,123],{},"anon"," nei progetti più vecchi",[111,126,127],{},[128,129,131],"key-verdict",{"type":130},"safe","Al suo posto",[111,133,134],{},"Dice di quale progetto si tratta. Ogni richiesta resta filtrata dalle tue regole di Row Level Security.",[90,136,137,139,147,153],{},[111,138,113],{},[111,140,141,120,144,124],{},[117,142,143],{},"sb_secret_…",[117,145,146],{},"service_role",[111,148,149],{},[128,150,152],{"type":151},"danger","Mai",[111,154,155],{},"Aggira del tutto la Row Level Security. Legge e scrive ogni riga di ogni tabella, qualunque cosa dicano le tue regole.",[90,157,158,161,167,171],{},[111,159,160],{},"Stripe",[111,162,163,166],{},[117,164,165],{},"pk_live_…"," (pubblicabile)",[111,168,169],{},[128,170,131],{"type":130},[111,172,173],{},"Crea i moduli di pagamento. Non può spostare denaro né leggere i clienti.",[90,175,176,178,184,188],{},[111,177,160],{},[111,179,180,183],{},[117,181,182],{},"sk_live_…"," (segreta)",[111,185,186],{},[128,187,152],{"type":151},[111,189,190],{},"Accesso completo all'account: addebiti, rimborsi, pagamenti, schede clienti.",[90,192,193,196,199,203],{},[111,194,195],{},"OpenAI \u002F Anthropic",[111,197,198],{},"qualsiasi chiave",[111,200,201],{},[128,202,152],{"type":151},[111,204,205],{},"Non esiste una variante pubblicabile. Ogni chiave addebita direttamente sul tuo account.",[10,207,208],{},"Lo schema vale oltre questi tre. Se un fornitore offre un solo tipo di chiave,\ndai per scontato che sia segreta e che il suo posto sia un server.",[210,211,213],"callout",{"type":212},"warn",[10,214,215,218,219,221,222,224,225,227],{},[17,216,217],{},"Quella che frega più persone è la chiave segreta di Supabase."," In un progetto\npiù vecchio si chiama ",[117,220,146],{}," e somiglia quasi in tutto alla chiave anon:\nstesso formato, stessa lunghezza, stesso punto del pannello, una accanto\nall'altra. Copiare quella sbagliata è un solo clic messo male, e dopo non si\nrompe niente: la tua app funziona esattamente come prima. È questo che lo rende\ncosì facile da non notare. Nei progetti nuovi è proprio questo ad essere\nmigliorato: ",[117,223,143],{}," e ",[117,226,119],{}," dicono quale è quale già nei primi\ncaratteri.",[22,229,231],{"id":230},"come-distinguerle-in-60-secondi","Come distinguerle in 60 secondi",[10,233,234,237,238,241,242,245,246,249,250,253],{},[17,235,236],{},"Su Stripe, e sulla maggior parte dei fornitori, basta il prefisso."," ",[117,239,240],{},"pk_"," è\npubblicabile e sicura. ",[117,243,244],{},"sk_"," è segreta e non lo è. Alcuni fornitori mettono\n",[117,247,248],{},"_test_"," o ",[117,251,252],{},"_live_"," in mezzo: una chiave di test trapelata è un problema molto\npiù piccolo di una di produzione, ma rigenerale entrambe.",[10,255,256,259],{},[17,257,258],{},"Su Supabase dipende da quanto è vecchio il tuo progetto."," Supabase ha emesso\ndue forme diverse di chiave, ed entrambe oggi girano in app funzionanti.",[10,261,262,265,267,268,270,271,275],{},[17,263,264],{},"Progetti nuovi: leggi il prefisso, esattamente come su Stripe.",[117,266,119],{}," è quella che sta bene nella tua app. ",[117,269,143],{}," è quella da\nrigenerare oggi. Non c'è nulla da decodificare: a cosa serve la chiave è scritto\ndavanti.\n",[68,272,274],{"href":273},"\u002Fblog\u002Fsupabase-new-api-keys","Cosa è cambiato e cosa significa per la tua app",",\nse non le hai ancora incontrate.",[10,277,278,281,282,224,284,286],{},[17,279,280],{},"Progetti più vecchi: bisogna guardare dentro la chiave."," La coppia originale,\n",[117,283,123],{},[117,285,146],{},", sono JWT: tre blocchi di caratteri incomprensibili\nseparati da punti, e quello centrale è informazione leggibile, non cifratura. Lì\nc'è scritto il ruolo della chiave in chiaro.",[10,288,289],{},"In nessuno dei due casi serve uno strumento. Apri Settings → API Keys nel\npannello di Supabase e ti dice quale è quale. Se preferisci controllare la chiave\nche hai davvero trovato nella tua app, la sezione centrale di una vecchia chiave\nsi decodifica in qualcosa di simile.",[291,292,297],"pre",{"className":293,"code":295,"language":296},[294],"language-text","{\n  \"iss\": \"supabase\",\n  \"ref\": \"abcdefghij…\",\n  \"role\": \"anon\",          ← è questa la parola che conta\n  \"iat\": 1750000000\n}\n","text",[117,298,295],{"__ignoreMap":299},"",[74,301],{"alt":302,"caption":303,"src":304},"Una vecchia chiave Supabase disegnata come tre sezioni separate da punti. Quella centrale è evidenziata e si decodifica in role anon, spuntata come sicura, oppure in role service_role, barrata come pericolosa.","In una vecchia chiave la sezione centrale è testo leggibile, non cifratura. Una parola lì dentro decide se la chiave si poteva pubblicare.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fread-the-role-1600x640.png",[10,306,307,310,311,314],{},[117,308,309],{},"\"role\": \"anon\""," è quella sicura. ",[117,312,313],{},"\"role\": \"service_role\""," è quella da\nrigenerare oggi. In una vecchia chiave quell'unica parola è tutta la differenza,\ned è il motivo per cui uno scanner che si limita a cercare stringhe a forma di\nchiave restituisce rumore invece di una risposta: non può dirti quale di due\nchiavi identiche hai effettivamente pubblicato.",[10,316,317,318,72],{},"Se preferisci non passare la tua app chiave per chiave, la nostra scansione\ngratuita legge il tuo sito dal vivo e ti dice quali di queste si vedono da fuori.\nCi vogliono una ventina di secondi e non serve un account:\n",[68,319,321],{"href":320},"\u002F#scan","scansiona la tua app",[22,323,325],{"id":324},"cosa-succede-davvero-quando-una-chiave-segreta-trapela","Cosa succede davvero quando una chiave segreta trapela",[10,327,328,329,120,331,333],{},"Ogni riga del tuo database diventa leggibile e scrivibile da chi ha trovato la\nchiave, comprese tabelle che non hai mai esposto alla tua app e i dati personali\ndei tuoi utenti. La Row Level Security non si applica a una chiave segreta di\nSupabase (",[117,330,143],{},[117,332,146],{}," in un progetto più vecchio). È lo scopo\ndi quella chiave.",[10,335,336],{},"Nemmeno il danno è teorico. Di solito lo si scopre come un messaggio\nall'assistenza su dati che sono cambiati da soli, o come una tabella\nimprovvisamente vuota.",[10,338,339,340,343],{},"Una chiave ",[117,341,342],{},"sk_live_"," di Stripe trapelata significa rimborsi, addebiti e schede\nclienti. Una chiave trapelata di un fornitore di IA significa una fattura, a\nvolte molto salata, che arriva prima che qualcuno se ne accorga.",[10,345,346],{},"Niente di tutto questo richiede un aggressore sofisticato. Ci sono scanner\nautomatici che setacciano i siti pubblici cercando esattamente queste stringhe, e\nnon hanno bisogno di sapere chi sei per trovare la tua.",[10,348,349,350,72],{},"Se vuoi la versione specifica per piattaforma di cosa controllare, abbiamo una\nguida in linguaggio semplice per le ",[68,351,353],{"href":352},"\u002Fis-your-supabase-app-safe","app con Supabase",[22,355,357],{"id":356},"cosa-fare-adesso","Cosa fare adesso",[359,360,361],"key-takeaways",{},[362,363,364,372,379,382,390],"ul",{},[365,366,367,368,371],"li",{},"Trova ogni chiave nella tua app e identificala. Il prefisso per Stripe e per le chiavi Supabase nuove; il campo ",[117,369,370],{},"role"," dentro quelle Supabase più vecchie.",[365,373,374,375,378],{},"Se trovi una chiave segreta nel browser, ",[17,376,377],{},"rigenerala per prima cosa",". Cancellarla dal codice non chiude la porta: il valore vecchio esiste ancora nella cronologia delle versioni e nelle copie in cache del tuo sito.",[365,380,381],{},"Sposta su un server ciò che aveva bisogno di quella chiave: una edge function, una route serverless, qualsiasi cosa che non sia il browser.",[365,383,384,385,249,387,389],{},"Attiva la Row Level Security su ogni tabella, poi verifica che funzioni davvero. Una chiave pubblicabile (",[117,386,119],{},[117,388,123],{},") è sicura solo grazie a quelle regole; senza, legge tutto il tuo database.",[365,391,392],{},"Controlla fatturazione e log dopo qualsiasi esposizione di una chiave segreta. Rigenerarla ferma ciò che verrebbe dopo, non ciò che è già successo.",[10,394,395,396,400],{},"Se preferisci procedere per punti, la\n",[68,397,399],{"href":398},"\u002Fchecklist","checklist di sicurezza in 10 minuti"," copre questo e le altre cose da\ndisattivare in un'app appena lanciata.",[10,402,403,404,72],{},"E se una fuga arriva a svuotare una tabella, riaverla dipende interamente da\n",[68,405,407],{"href":406},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","che cosa stavi salvando",{"title":299,"searchDepth":409,"depth":409,"links":410},3,[411,413,414,415,416,417],{"id":24,"depth":412,"text":25},2,{"id":53,"depth":412,"text":54},{"id":81,"depth":412,"text":82},{"id":230,"depth":412,"text":231},{"id":324,"depth":412,"text":325},{"id":356,"depth":412,"text":357},"Basi della sicurezza",null,"La tua chiave anon di Supabase è fatta per essere pubblica. La chiave service_role no, e ignora ogni regola che imposti. Come distinguerle.",false,"md",[424,427,430,433,436],{"q":425,"a":426},"Mi hanno detto che la mia chiave API è esposta. Devo preoccuparmi?","Non prima di sapere di quale chiave si tratta. Se inizia con pk_ o è una chiave anon di Supabase, è fatta per essere pubblica e va tutto bene. Se inizia con sk_ o è una chiave service_role, rigenerala subito e poi guarda a cosa poteva arrivare.",{"q":428,"a":429},"Posso semplicemente nascondere la chiave così nessuno la trova?","No. Tutto ciò che il tuo browser può usare, un visitatore può leggerlo: minificare, rinominare o offuscare rallenta qualcuno solo di qualche secondo. La soluzione non è mai nascondere una chiave segreta nel browser, ma spostarla su un server, oppure usare una chiave pubblicabile che era sicuro esporre fin dall'inizio.",{"q":431,"a":432},"Perché Supabase mi dà una chiave che chiunque può leggere?","Perché non è la chiave anon a proteggere i tuoi dati. Dice soltanto con quale progetto stai parlando. La protezione vera è la Row Level Security, che decide riga per riga cosa ogni visitatore può vedere. Per questo una chiave anon con RLS attiva non è un problema, e la stessa chiave senza RLS è un database aperto.",{"q":434,"a":435},"La mia chiave Supabase inizia con sb_publishable_. È la stessa cosa della chiave anon?","Fa lo stesso lavoro. Supabase ha rinominato le sue chiavi: sb_publishable_ ha preso il posto della chiave anon e sb_secret_ quello di service_role. Quindi una chiave che inizia con sb_publishable_ è fatta per stare nella tua app, e una che inizia con sb_secret_ non lo è mai. I progetti più vecchi portano ancora le chiavi anon e service_role originali, e quelle funzionano ancora; potresti perfino vedere entrambe le coppie affiancate nel pannello.",{"q":437,"a":438},"Ho già incollato una chiave segreta nella mia app. E adesso?","Rigenerala per prima cosa: nel pannello del fornitore crea una nuova chiave e revoca quella vecchia. È questo che chiude davvero la porta; toglierla dal codice non basta, perché il valore vecchio resta nella tua cronologia delle versioni e nelle copie in cache. Poi sposta su un server ciò che aveva bisogno di quella chiave e controlla fatturazione e log per qualcosa che non hai fatto tu.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",[441,442,443,444,445,446,447,448],"chiave anon supabase","chiave service_role","chiave sb_publishable","chiave sb_secret","nuove chiavi api supabase","chiave pubblicabile stripe","chiavi api nel browser","chiave api esposta",{},true,"Quali chiavi API sono sicure nel browser?","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","2026-08-09",{"title":5,"description":420},"blog\u002Fwhich-api-keys-are-safe-in-your-frontend",[457,458,459],"Trovare una chiave API nel codice della tua app non è automaticamente un problema. Alcune chiavi sono fatte per stare lì.","Le chiavi pubblicabili sono sicure nel browser. Quelle segrete no: una chiave segreta nel browser è una cassa aperta.","Due controlli le separano in meno di un minuto: leggere il prefisso e, su una vecchia chiave Supabase, decodificare il ruolo.","2026-08-12","la85Y6l_TsBLYqkSBYPAcSGkOwgbVz2KtjyI_nWQeIU",1787826051040]