[{"data":1,"prerenderedAt":664},["ShallowReactive",2],{"blog-it-rotate-supabase-service-role-key":3,"blog-index-it":423},{"id":4,"title":5,"body":6,"category":380,"cover":381,"coverAlt":382,"description":383,"draft":384,"extension":385,"faq":386,"image":401,"keywords":402,"meta":411,"navigation":412,"ogTitle":413,"path":414,"published":415,"seo":416,"stem":417,"tldr":418,"updated":415,"__hash__":422},"blog_it\u002Fblog\u002Frotate-supabase-service-role-key.md","Come ruotare una chiave service_role Supabase trapelata",{"type":7,"value":8,"toc":365},"minimark",[9,24,27,30,33,41,52,55,70,81,85,88,95,101,104,110,114,120,123,148,151,154,161,170,176,206,218,223,231,241,245,248,265,275,281,285,288,291,294,304,308,311,314,320,324,355],[10,11,12,13,17,18,23],"p",{},"Qualcuno ti ha detto che la tua chiave ",[14,15,16],"code",{},"service_role"," di Supabase si trova nella\ntua app, dove chiunque può leggerla. Prima di cambiare qualsiasi cosa, assicurati\nche sia davvero quella la chiave che hanno trovato:\n",[19,20,22],"a",{"href":21},"\u002F#scan","la nostra scansione gratuita"," legge il tuo sito in produzione come lo\nleggerebbe uno sconosciuto e ti dice quale chiave Supabase vede lì davvero. Senza\naccount e senza installare nulla.",[10,25,26],{},"Il consiglio che segue una scoperta del genere è quasi sempre una parola sola:\nruotala. Poi vai a cercare come si fa, e le fonti si contraddicono. La\ndocumentazione di Supabase apre la sua guida alla rotazione dicendoti di\ncorreggere la causa della falla prima di iniziare. Una mezza dozzina di guide di\nterze parti ti dice di ruotare subito e fare domande dopo.",[10,28,29],{},"Ecco la parte che nessuna delle due scrive: hanno ragione entrambe, in\nsituazioni diverse, e la domanda che le separa è dove sia finita la chiave.",[10,31,32],{},"Una cosa da mettere in chiaro prima di tutto. Cancellare la chiave dal tuo\ncodice toglie la tua copia dal mazzo. Ruotarla cambia la serratura. Solo la\nseconda raggiunge le copie che altri hanno già.",[34,35,37,38,40],"h2",{"id":36},"è-davvero-la-chiave-service_role","È davvero la chiave ",[14,39,16],{},"?",[10,42,43,44,47,48,51],{},"In un progetto recente rispondono i primi caratteri. ",[14,45,46],{},"sb_secret_"," all'inizio è\nquella segreta. ",[14,49,50],{},"sb_publishable_"," è la chiave che deve stare nella tua app, e\ntrovarla lì non è affatto una scoperta.",[10,53,54],{},"Accertatene prima di fare qualcosa di drastico, perché la chiave che si trova in\nun'app fatta in vibe coding è di solito quella che ci deve stare.",[10,56,57,58,61,62,64,65,69],{},"I progetti più vecchi rilasciano un'altra coppia, ",[14,59,60],{},"anon"," e ",[14,63,16],{},", e le\ndue si assomigliano moltissimo: stesso formato, stessa lunghezza, nessun prefisso\nda leggere. La sezione centrale di una di quelle chiavi non è cifrata affatto. Si\ndecodifica in qualche riga di testo semplice, e una di quelle righe indica il\nruolo.\n",[19,66,68],{"href":67},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Quali chiavi API sono sicure nel frontend","\npercorre entrambi i controlli.",[10,71,72,73,75,76,80],{},"Il motivo per esserne sicuri è che il caso è più raro di quanto suggeriscano gli\navvertimenti. Abbiamo scansionato 30.998 app in vibe coding ad agosto 2026 e\nabbiamo trovato una chiave ",[14,74,16],{}," pubblicata in 3 di esse. Una chiave API\ndi Google, di solito innocua e spesso limitata a un dominio, è comparsa in 1.142.\n",[19,77,79],{"href":78},"\u002Fresearch\u002Fvibe-coded-app-security-2026","Il conteggio completo è qui",".",[34,82,84],{"id":83},"ruotare-prima-o-chiudere-prima-la-falla","Ruotare prima o chiudere prima la falla?",[10,86,87],{},"Dipende dal fatto che la chiave sia già pubblica, e la linea tra i due casi è\nnetta.",[10,89,90,94],{},[91,92,93],"strong",{},"Se la chiave è nel JavaScript che i tuoi visitatori scaricano, adesso è\npubblica."," Chiunque abbia caricato il tuo sito mentre era attiva ne ha una\ncopia, e ce l'ha anche ogni crawler automatico che stava cercando esattamente\nquella stringa. Niente di quello che cambi nel tuo codice raggiunge quelle\ncopie. Prima ruota, poi chiudi la sorgente.",[10,96,97,100],{},[91,98,99],{},"Se è arrivata solo a un repository privato, a un file di log, a una variabile\ndi CI o a una chat, l'esposizione è limitata."," Se qui ruoti per prima cosa, lo\nfarai due volte, perché il deploy successivo rimette fuori il valore vecchio da\nqualunque cosa lo producesse e la chiave nuova segue la vecchia. Chiudi la\nsorgente, poi ruota.",[10,102,103],{},"La guida di Supabase è scritta per il secondo caso. Le guide urgenti sono scritte\nper il primo. Se stai leggendo questo perché uno scanner ha trovato la chiave sul\ntuo URL in produzione, sei nel primo caso.",[105,106],"diagram",{"alt":107,"caption":108,"src":109},"Due corsie. Quella in alto parte da una finestra del browser e passa per il passo uno, una chiave con una freccia di rotazione, poi il passo due, una coppia di parentesi angolari. Quella in basso parte da un file e percorre gli stessi due passi in ordine inverso, prima le parentesi e poi la chiave.","Gli stessi due compiti, in ordine opposto. A decidere è se la copia trapelata è già in giro per il mondo.","\u002Fblog\u002Frotate-supabase-service-role-key\u002Ftwo-orders-1600x640.png",[34,111,113],{"id":112},"come-ruotare-una-chiave-segreta-di-supabase","Come ruotare una chiave segreta di Supabase",[10,115,116,117,119],{},"Se il tuo progetto ha chiavi ",[14,118,46],{},", è una faccenda da pannello e senza\ninterruzione di servizio.",[10,121,122],{},"Un progetto può tenere più di una chiave segreta alla volta, ognuna con il suo\nnome, ed è questo che rende l'operazione sicura: aggiungi la nuova prima di\ntogliere la vecchia, quindi nel mezzo non c'è niente di rotto.",[124,125,126,134,142,145],"ol",{},[127,128,129,130,133],"li",{},"Apri il progetto, vai su ",[91,131,132],{},"Settings → API Keys"," e crea una nuova chiave\nsegreta.",[127,135,136,137,141],{},"Mettila ovunque si usasse la vecchia, e dovrebbe essere tutto su un server:\nedge function, webhook, job pianificati, un backend tuo.\n",[19,138,140],{"href":139},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Dove stanno quei valori"," se non hai\nmai aperto quella pagina.",[127,143,144],{},"Fai il deploy, poi passa in rassegna le parti della tua app che leggono e\nscrivono dati. Una chiave segreta sbagliata fallisce in modo rumoroso e\nimmediato, che è il caso buono.",[127,146,147],{},"Solo allora cancella la chiave compromessa.",[10,149,150],{},"Il passo 4 è permanente. Supabase cancella una chiave segreta sul serio: nessun\nannulla, nessuna riattivazione, nessuna copia parcheggiata che tu possa\nrecuperare. Per questo va per ultimo.",[10,152,153],{},"Cancellare una chiave segreta non fa uscire i tuoi utenti. Una chiave API dice\nquale applicazione sta interrogando il tuo database, e il token di sessione di\nun visitatore dice quale utente è. Il secondo viene verificato contro la chiave\ndi firma del progetto, ed è un valore separato che non hai toccato.",[34,155,157,158,160],{"id":156},"perché-una-vecchia-chiave-service_role-di-supabase-non-si-può-ruotare","Perché una vecchia chiave ",[14,159,16],{}," di Supabase non si può ruotare",[10,162,163,164,166,167,169],{},"Perché non esiste un pulsante per farlo. La nota di troubleshooting di Supabase\ndice che la rotazione diretta dei vecchi segreti ",[14,165,60],{},", ",[14,168,16],{}," e JWT non\nè più supportata, e ti rimanda alle chiavi nuove.",[10,171,172,173,175],{},"Invalidare una vecchia chiave ",[14,174,16],{}," trapelata è quindi una migrazione e\nnon una rotazione:",[124,177,178,189,195,200],{},[127,179,180,183,184,61,186,188],{},[91,181,182],{},"Crea le chiavi nuove."," Questo aggiunge ",[14,185,50],{},[14,187,46],{},"\naccanto alla vecchia coppia. I due sistemi funzionano insieme e non si rompe\nniente.",[127,190,191,194],{},[91,192,193],{},"Sposta il frontend sulla chiave pubblicabile."," In Lovable o Bolt di solito\nè un valore nelle impostazioni del progetto e non una riga di codice.",[127,196,197],{},[91,198,199],{},"Sposta ogni uso lato server sulla chiave segreta.",[127,201,202,205],{},[91,203,204],{},"Disattiva le vecchie chiavi"," nelle impostazioni del progetto.",[10,207,208,209,211,212,214,215,217],{},"Il passo 4 è un solo interruttore e riguarda entrambe le vecchie chiavi. ",[14,210,60],{}," e\n",[14,213,16],{}," sono JWT firmati con lo stesso segreto, quindi l'interruttore che\nrevoca l'una revoca anche l'altra, e un frontend che porta ancora la vecchia\nchiave ",[14,216,60],{}," smette di funzionare nel momento in cui lo premi. Per questo il\npasso 2 viene prima.",[105,219],{"alt":220,"caption":221,"src":222},"Un pannello di impostazioni con quattro righe. Le due in alto, sb_publishable_ e sb_secret_, portano ciascuna un punto pieno e un valore leggibile. Sotto un separatore, anon e service_role sono disegnate sbiadite con i valori mascherati da puntini, e una graffa unisce quelle due righe a un unico interruttore in posizione spenta.","Disattivare le vecchie chiavi è un solo comando per entrambe. La chiave anon che la tua app sta usando se ne va insieme alla chiave service_role che vuoi invalidare.","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fone-switch-two-keys-1600x720.png",[10,224,225,226,230],{},"La disattivazione è reversibile, ed è l'unica buona notizia di questa sezione: se\nqualcosa che avevi dimenticato usa ancora una vecchia chiave, puoi riaccenderle\nmentre la sistemi.\n",[19,227,229],{"href":228},"\u002Fblog\u002Fsupabase-new-api-keys","Cosa comporta la migrazione"," lo racconta più per\nesteso.",[232,233,235],"callout",{"type":234},"warn",[10,236,237,240],{},[91,238,239],{},"Fino al passo 4 la chiave trapelata funziona ancora."," I passi da 1 a 3\naggiungono una seconda via d'ingresso; non tolgono niente. In un progetto dove la\nchiave è già pubblica, è proprio questo a rendere scomodo l'ordine, ed è il\nmotivo per fare i quattro passi uno dietro l'altro. Una migrazione lasciata a\nmetà tiene la vecchia chiave attiva e la tua app su due sistemi di chiavi\ninsieme.",[34,242,244],{"id":243},"da-dove-è-trapelata-la-chiave-e-come-chiudere","Da dove è trapelata la chiave, e come chiudere",[10,246,247],{},"Tre cause spiegano quasi tutto, e tutte e tre stanno dentro il tuo progetto.",[10,249,250,260,261,264],{},[91,251,252,253,256,257,80],{},"Un prefisso ",[14,254,255],{},"VITE_"," o ",[14,258,259],{},"NEXT_PUBLIC_"," Non sono un'impostazione di sicurezza\nche qualcuno ha dimenticato di attivare. Sono un'istruzione per la build: metti\nquesto valore nel bundle. Una variabile chiamata\n",[14,262,263],{},"VITE_SUPABASE_SERVICE_ROLE_KEY"," è stata compilata nel tuo JavaScript di\nproposito, da uno strumento che ha fatto esattamente quello che gli era stato\ndetto.",[10,266,267,270,271,274],{},[91,268,269],{},"Un valore incollato dritto in un componente."," Nessun prefisso di mezzo e\nnessun file ",[14,272,273],{},".env",", solo la chiave posata in una riga di codice perché era il\nmodo più veloce di far restituire qualcosa a una query.",[10,276,277,280],{},[91,278,279],{},"Lavoro che sta su un server."," Cancellare un account, scrivere in una tabella\nin cui i tuoi utenti non possono scrivere, leggere righe di tutti quanti. Alla\nchiave si è ricorsi perché il browser non poteva fare quel lavoro, e la\nsoluzione è spostare il lavoro: una edge function, una rotta serverless,\nqualsiasi cosa che i tuoi visitatori non scarichino.",[34,282,284],{"id":283},"come-faccio-a-sapere-se-qualcuno-lha-usata","Come faccio a sapere se qualcuno l'ha usata?",[10,286,287],{},"Di solito non puoi esserne certo. Quello che puoi fare è restringere la finestra\ne guardarci dentro.",[10,289,290],{},"La finestra si apre con il deploy che ha pubblicato la chiave per la prima volta\ne si chiude quando l'hai disattivata. Il tuo progetto Supabase tiene log sia per\nl'API sia per il database, ed è su quell'intervallo che vanno filtrati. Quello\nche cerchi sono letture e scritture che non sai spiegare: richieste a tabelle che\nla tua app non tocca mai, traffico in ore in cui nessuno la stava usando,\ncancellazioni che non ha fatto nessuno.",[10,292,293],{},"Poi controlla i dati stessi. Conteggi di righe rispetto a quello che ti aspetti,\ni tuoi stessi record di account, qualsiasi cosa con una marca temporale che si è\nmossa mentre nessuno lavorava. Un messaggio all'assistenza su dati cambiati da\nsoli è il modo in cui la maggior parte di questi casi viene davvero scoperta, e\narriva settimane dopo.",[10,295,296,297,299,300,80],{},"Una chiave ",[14,298,16],{}," non raggiunge il tuo fornitore di pagamenti né il tuo\ninvio di email. Vale comunque la pena sapere se era l'unica chiave nel tuo\nbundle, perché quelle che spendono soldi trapelano per la stessa strada:\n",[19,301,303],{"href":302},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","cosa pubblicavano 30.998 app",[34,305,307],{"id":306},"controlla-la-tua-app-in-produzione-prima-di-darla-per-chiusa","Controlla la tua app in produzione prima di darla per chiusa",[10,309,310],{},"Carica il sito in una finestra privata, apri il JavaScript che il browser ha\nscaricato e cercaci dentro il valore vecchio. Poi cerca quello nuovo, che lì non\ndovrebbe esserci nemmeno lui.",[10,312,313],{},"Due cose rendono utile questo controllo a mano. Una build può servire un bundle\nin cache ancora per un po' dopo il deploy, quindi il file che riceve un\nvisitatore non è sempre quello che hai appena costruito. E una chiave può stare\nin più di un posto: un secondo punto di ingresso, un service worker, una vecchia\nbuild ancora servita da un percorso a cui nessuno rimanda.",[10,315,316,317,80],{},"La nostra scansione gratuita fa questa parte da fuori, sull'URL che i tuoi\nvisitatori usano davvero, e decodifica una chiave Supabase quanto basta per\nleggerne il ruolo, quindi una chiave pubblicabile torna con una spunta. Ci mette\nuna ventina di secondi e non richiede un account:\n",[19,318,319],{"href":21},"scansiona la tua app",[34,321,323],{"id":322},"cosa-fare-adesso","Cosa fare adesso",[325,326,327],"key-takeaways",{},[328,329,330,340,343,346,349,352],"ul",{},[127,331,332,333,335,336,339],{},"Conferma prima la chiave. ",[14,334,46],{}," davanti, oppure ",[14,337,338],{},"\"role\": \"service_role\""," dentro una più vecchia. Una chiave pubblicabile nel tuo frontend non è una scoperta.",[127,341,342],{},"Se è nel bundle che i tuoi visitatori scaricano, ruotala prima di toccare il codice. Modificare la tua app non raggiunge le copie già in circolazione.",[127,344,345],{},"Se è trapelata solo a un repository, a un log o a una chat, chiudi prima la sorgente, così il prossimo deploy non rimette subito fuori la chiave nuova.",[127,347,348],{},"In un progetto recente: crea una seconda chiave segreta, spostaci sopra il codice del server, fai il deploy e poi cancella la vecchia. La cancellazione è definitiva.",[127,350,351],{},"In un progetto vecchio non c'è un pulsante di rotazione. Crea le chiavi nuove, spostaci sopra frontend e server, poi disattiva la vecchia coppia con l'unico interruttore che le riguarda entrambe.",[127,353,354],{},"Dopo, cerca dentro il tuo bundle in produzione. Una build in cache può servire il valore vecchio ancora per un po' dopo il deploy.",[10,356,296,357,359,360,364],{},[14,358,16],{}," legge e scrive ogni riga del tuo database. La versione\npeggiore di questa storia finisce con una tabella vuota, e se quelle righe\ntornano dipende da\n",[19,361,363],{"href":362},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","cosa stavi salvando"," prima che\nsuccedesse tutto questo.",{"title":366,"searchDepth":367,"depth":367,"links":368},"",3,[369,372,373,374,376,377,378,379],{"id":36,"depth":370,"text":371},2,"È davvero la chiave service_role?",{"id":83,"depth":370,"text":84},{"id":112,"depth":370,"text":113},{"id":156,"depth":370,"text":375},"Perché una vecchia chiave service_role di Supabase non si può ruotare",{"id":243,"depth":370,"text":244},{"id":283,"depth":370,"text":284},{"id":306,"depth":370,"text":307},{"id":322,"depth":370,"text":323},"Basi della sicurezza","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcover-1200x630.png","Un lucchetto e accanto due chiavi identiche, disegnate della stessa misura, una chiara e una sbiadita.","Supabase dice di chiudere prima la falla. Altre guide dicono di ruotare subito. Quale sia giusto dipende da dove è finita la tua chiave service_role.",false,"md",[387,390,393,396,398],{"q":388,"a":389},"Ruotare la chiave rompe la mia app in produzione?","No, se rispetti l'ordine. In un progetto con le chiavi nuove aggiungi una seconda chiave segreta, ci sposti sopra il codice del tuo server, fai il deploy e solo allora cancelli la vecchia, così non esiste mai un momento senza una chiave funzionante. In un progetto vecchio il rischio è un altro: disattivare la vecchia coppia disattiva anche la chiave anon che usa il tuo frontend, quindi la tua app si ferma se non è già passata alla chiave pubblicabile quando premi quell'interruttore.",{"q":391,"a":392},"Posso ruotare le vecchie chiavi anon e service_role?","No. La documentazione di troubleshooting di Supabase dice che la rotazione diretta dei vecchi segreti anon, service_role e JWT non è più supportata. Invalidare una vecchia chiave trapelata significa creare le nuove chiavi sb_publishable_ e sb_secret_, spostarci sopra la tua app e il codice del tuo server, e poi disattivare la vecchia coppia nelle impostazioni del progetto.",{"q":394,"a":395},"Devo cancellare la vecchia chiave o disattivarla?","Non puoi scegliere, perché i due sistemi di chiavi si comportano in modo diverso. Una chiave sb_secret_ recente viene cancellata, in modo permanente, senza alcun modo di recuperarla. La vecchia coppia si disattiva invece, e la disattivazione è reversibile: se qualcosa che avevi dimenticato usa ancora una vecchia chiave, puoi riaccenderle mentre la sistemi.",{"q":284,"a":397},"Di solito non puoi esserne certo. Riducilo piuttosto a una finestra temporale: la chiave è stata utilizzabile dal deploy che l'ha pubblicata per la prima volta fino al momento in cui l'hai disattivata. Filtra i log dell'API e del database del tuo progetto Supabase su quell'intervallo e cerca letture e scritture che non sai spiegare, poi controlla i dati stessi: conteggi di righe e marche temporali che non corrispondono a nulla che tu abbia fatto.",{"q":399,"a":400},"Devo ruotare anche la chiave anon?","In un progetto vecchio non puoi scegliere: disattivare la vecchia coppia porta via entrambe le chiavi in una volta, quindi il tuo frontend ha bisogno della nuova chiave pubblicabile prima che tu prema l'interruttore. In un progetto recente la chiave pubblicabile è pensata per essere pubblica e non c'è motivo di toccarla. Quello che vale la pena controllare in entrambi i casi è Row Level Security, perché è l'unica cosa che sta tra una chiave pubblicabile e tutto il tuo database.","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",[403,404,405,406,407,408,409,410],"ruotare chiave service role supabase","come ruotare la service role key su supabase","chiave service role supabase trapelata","chiave service role supabase esposta","rotazione chiavi supabase","revocare chiave api supabase","disattivare vecchie chiavi api supabase","service role key nel frontend",{},true,"Ruotare una chiave service_role trapelata, nell'ordine giusto","\u002Fblog\u002Frotate-supabase-service-role-key","2026-09-08",{"title":5,"description":383},"blog\u002Frotate-supabase-service-role-key",[419,420,421],"Se la tua chiave service_role di Supabase è nel JavaScript che un browser scarica, ruotala prima di sistemare qualsiasi altra cosa. La copia già in circolazione non scade.","Se è arrivata solo a un repository privato o a un log, chiudi prima la sorgente, altrimenti la chiave nuova segue la vecchia al deploy successivo.","Una vecchia chiave service_role non si può ruotare affatto. Invalidarla significa creare le nuove chiavi sb_secret_, spostarci sopra la tua app e disattivare la vecchia coppia con un interruttore che le riguarda entrambe.","9fWEgVcboCMfK7j5qDq0G8q1LX35dhNdHeiMi2iqCJA",[424,431,437,443,449,455,461,467,473,479,485,491,497,503,509,515,516,522,528,534,540,546,551,557,563,569,575,580,586,592,598,604,610,616,622,628,633,638,644,650,655,660],{"path":425,"title":426,"description":427,"published":428,"category":429,"image":430,"draft":384},"\u002Fblog\u002Fsupabase-backup-auth-users","Perché nel tuo dump Supabase non ci sono utenti","Lancia supabase db dump da solo e ottieni la forma del tuo database e nessuna delle sue righe, senza lo schema auth in cui vivono i tuoi utenti.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":432,"title":433,"description":434,"published":435,"category":380,"image":436,"draft":384},"\u002Fblog\u002Fdomain-and-certificate-expiry","Dominio scaduto, sito offline: cosa succede adesso","Il tuo dominio è scaduto e il sito è offline. Il conto alla rovescia che parte, perché il certificato è il problema minore, e come controllarli entrambi.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":438,"title":439,"description":440,"published":441,"category":380,"image":442,"draft":384},"\u002Fblog\u002Fis-lovable-safe","Lovable è sicuro? Cosa abbiamo trovato in 18.554 app Lovable","Lovable è sicuro? Abbiamo passato 18.554 app Lovable online per nove controlli. La piattaforma è risultata la più pulita di cinque. I rilievi stavano nelle app.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":444,"title":445,"description":446,"published":447,"category":380,"image":448,"draft":384},"\u002Fblog\u002Fvibe-coded-app-security-checklist","La checklist di sicurezza del vibe coding, in nove controlli","Una checklist di sicurezza del vibe coding in nove voci, ognuna verificabile dall’esterno sulla tua app dal vivo, e ognuna con un test di una riga.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":450,"title":451,"description":452,"published":453,"category":380,"image":454,"draft":384},"\u002Fblog\u002Fstripe-secret-key-in-frontend","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.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":456,"title":457,"description":458,"published":459,"category":380,"image":460,"draft":384},"\u002Fblog\u002Fvite-and-next-public-env-vars","Variabili d’ambiente Vite esposte: il prefisso vuol dire pubblica","Variabili d’ambiente Vite esposte: la tua app ha fatto ciò che il prefisso chiedeva. VITE_ e NEXT_PUBLIC_ vogliono dire pubblica, e l’IA non sapeva il costo.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":462,"title":463,"description":464,"published":465,"category":380,"image":466,"draft":384},"\u002Fblog\u002Fbase44-source-maps","Sicurezza Base44: cosa segnala uno scan e cosa tocca a te sistemare","Sicurezza Base44 su 5.438 app scansionate: tre segnalazioni su quasi tutte sono della piattaforma, la source map è il badge di Base44, la tua parte è corta.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":468,"title":469,"description":470,"published":471,"category":380,"image":472,"draft":384},"\u002Fblog\u002Fis-cursor-ai-safe","Cursor AI è sicuro? L’editor, il codice e l’app che hai pubblicato","Cursor AI è sicuro? Tre domande in una ricerca: cosa tiene Cursor, cosa sbaglia il codice che scrive, e se l’app che hai pubblicato è aperta.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":474,"title":475,"description":476,"published":477,"category":380,"image":478,"draft":384},"\u002Fblog\u002Fis-replit-safe","Replit è sicuro? Cosa abbiamo trovato in 3.042 app Replit online","Replit è sicuro? Abbiamo passato 3.042 app Replit online per nove controlli esterni. I rilievi stavano nell’app pubblicata, non nell’host.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":480,"title":481,"description":482,"published":483,"category":429,"image":484,"draft":384},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: la copia del database non ha nessun file","Un Supabase storage backup è un lavoro a parte. I backup del database tengono la lista dei tuoi file e nessuno dei file, quindi ogni upload resta rotto.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":486,"title":487,"description":488,"published":489,"category":429,"image":490,"draft":384},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery di Supabase: prezzo e limiti","Il point-in-time recovery di Supabase riavvolge il database a qualsiasi secondo della settimana scorsa. $100 al mese oltre a Pro, e copre solo il database.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":492,"title":493,"description":494,"published":495,"category":429,"image":496,"draft":384},"\u002Fblog\u002Fsupabase-project-paused-recover","Progetto Supabase in pausa? I tuoi dati sono ancora lì","Supabase ha messo in pausa il tuo progetto dopo una settimana senza attività. Non è cancellato niente, Ripristina è accanto al nome e hai un anno di tempo.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":498,"title":499,"description":500,"published":501,"category":380,"image":502,"draft":384},"\u002Fblog\u002Fsafest-ai-app-builder","Qual è il builder di app con IA più sicuro? 30.998 app testate","Qual è il builder di app con IA più sicuro? Abbiamo scansionato 30.998 app online di Lovable, Base44, Replit, v0 e Bolt. Non è il builder a decidere il voto.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":504,"title":505,"description":506,"published":507,"category":380,"image":508,"draft":384},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Attiva Row Level Security su ogni tabella Supabase, poi verificalo","Attivare Row Level Security su Supabase senza una policy chiude del tutto la tabella. Una policy senza il flag non fa nulla. Ecco lo SQL, e la verifica.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":510,"title":511,"description":512,"published":513,"category":380,"image":514,"draft":384},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": cosa non vede l'avviso","Supabase segnala \"RLS disabled in public\" come errore. Non dice nulla della policy di lettura che lascia la tua tabella altrettanto aperta.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":414,"title":5,"description":383,"published":415,"category":380,"image":401,"draft":384},{"path":517,"title":518,"description":519,"published":520,"category":380,"image":521,"draft":384},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Scanner di sicurezza per vibe coding a confronto, il nostro incluso","Il miglior scanner di sicurezza per vibe coding dipende da tre domande che nessun elenco di funzioni affronta. Dieci strumenti a confronto, con i prezzi.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":523,"title":524,"description":525,"published":526,"category":380,"image":527,"draft":384},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: i cinque controlli da fare da soli","Un Supabase security checker legge la tua app pubblicata invece delle impostazioni del progetto. Ecco i cinque controlli che esegue e come farli da solo.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":529,"title":530,"description":531,"published":532,"category":380,"image":533,"draft":384},"\u002Fblog\u002Fvibe-coding-security-scanner","Scanner di sicurezza per vibe coding: cosa si perde","Uno scanner di sicurezza per vibe coding legge la tua app dal vivo, da fuori. Cosa copre, le quattro cose che non può vedere e come leggere il risultato.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":535,"title":536,"description":537,"published":538,"category":380,"image":539,"draft":384},"\u002Fblog\u002Fmissing-security-headers","Intestazioni di sicurezza mancanti: quando contano","Le intestazioni di sicurezza mancanti sono il rilievo che il nostro scanner stampa più spesso. Da cosa proteggono e quando sono la riga meno urgente.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":541,"title":542,"description":543,"published":544,"category":380,"image":545,"draft":384},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","La tua chiave API OpenAI è esposta nel frontend. Ruotala.","Una chiave API OpenAI esposta nel frontend non si può legare a nessun dominio. Ruotala oggi, sposta la chiamata sul tuo server e metti un tetto di spesa.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":302,"title":547,"description":548,"published":549,"category":380,"image":550,"draft":384},"Chiave API esposta nel frontend: cosa spediscono 30.998 app","Una chiave API esposta nel tuo frontend è quasi sempre una chiave di Google Maps. Abbiamo scansionato 30.998 app vibe-coded e contato cosa esce davvero.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":552,"title":553,"description":554,"published":555,"category":429,"image":556,"draft":384},"\u002Fblog\u002Fsupabase-backup-tools-compared","Strumenti di backup Supabase a confronto, il nostro incluso","Quattro tipi di strumento di backup Supabase, cosa copia davvero ognuno, e il caso in cui una GitHub Action gratuita batte il pagare chiunque, noi inclusi.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":558,"title":559,"description":560,"published":561,"category":380,"image":562,"draft":384},"\u002Fblog\u002Freplit-secrets-explained","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.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":564,"title":565,"description":566,"published":567,"category":429,"image":568,"draft":384},"\u002Fblog\u002Fback-up-supabase-free-tier","Backup del piano gratuito Supabase: farne uno senza terminale","Sul piano gratuito Supabase non esistono backup: la copia la fai tu. Come farne uno dalla dashboard e che cosa si lascia dietro la via del CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":570,"title":571,"description":572,"published":573,"category":380,"image":574,"draft":384},"\u002Fblog\u002Fis-supabase-secure","Supabase è sicuro? Sì. Il tuo progetto è un'altra questione","Supabase è sicuro? La piattaforma è certificata, cifrata e sottoposta a pentest. La loro documentazione dice dove finisce quello e iniziano le tue impostazioni.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":139,"title":576,"description":577,"published":578,"category":380,"image":579,"draft":384},"Dove trovare le chiavi API di Supabase: anon, service_role e URL","L'URL del progetto, la chiave anon e la chiave service_role stanno su una pagina della dashboard. Ecco dove si trova e quale dei quattro va nella tua app.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":581,"title":582,"description":583,"published":584,"category":380,"image":585,"draft":384},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy su Supabase. E adesso?","\"New row violates row-level security policy\" significa che Supabase ha rifiutato una scrittura. La soluzione veloce riapre la tabella a chiunque.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":587,"title":588,"description":589,"published":590,"category":380,"image":591,"draft":384},"\u002Fblog\u002Fcors-wildcard-security-risk","Un wildcard CORS è un rischio di sicurezza? Quasi mai.","Un wildcard CORS è un rischio di sicurezza? Di solito è il valore predefinito del tuo builder e non consegna nulla che il tuo server non desse già a chiunque.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":593,"title":594,"description":595,"published":596,"category":429,"image":597,"draft":384},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Il branching di Supabase non è un backup. Va solo in avanti.","Perché il branching di Supabase non è un backup: un branch parte senza i tuoi dati e un merge sposta solo lo schema. A cosa serve davvero e cosa usare invece.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":599,"title":600,"description":601,"published":602,"category":429,"image":603,"draft":384},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Come ripristinare un backup Supabase, e cosa si rompe dopo","Come ripristinare un backup Supabase dalla dashboard o da un file di dump, che cosa sostituisce il ripristino e perché la tua app può restare rotta lo stesso.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":605,"title":606,"description":607,"published":608,"category":380,"image":609,"draft":384},"\u002Fblog\u002Fsupabase-storage-bucket-public","Il tuo bucket Supabase Storage è pubblico. È un problema?","Un bucket Supabase Storage pubblico significa che chi ha l'URL di un file può aprirlo. Non significa che qualcuno possa elencare quello che c'è dentro.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":611,"title":612,"description":613,"published":614,"category":380,"image":615,"draft":384},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Una chiave API Google nel frontend è un problema?","Una chiave API Google esposta nel frontend è la chiave che il nostro scanner trova più spesso, e di solito va bene così. Lo decide una impostazione gratuita.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":617,"title":618,"description":619,"published":620,"category":429,"image":621,"draft":384},"\u002Fblog\u002Fai-agent-deleted-my-database","Un agente IA ha cancellato i miei dati Supabase. Cosa recupero?","Un agente IA ha cancellato dati dal tuo database. Quello che puoi recuperare era già deciso prima che partisse, e i prossimi minuti decidono il resto.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":623,"title":624,"description":625,"published":626,"category":380,"image":627,"draft":384},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Chiunque può leggere il tuo database Supabase? 3.680 app testate","Chiunque può leggere il tuo database Supabase senza fare login? Abbiamo scansionato 30.998 app online create con i builder IA e misurato quante rispondono sì.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":629,"title":630,"description":631,"published":626,"category":380,"image":632,"draft":384},"\u002Fblog\u002Fsource-maps-exposed-in-production","Source map esposte: la tua app sta pubblicando il codice originale","Una source map esposta permette a chiunque di leggere il codice originale della tua app, commenti inclusi. Il controllo da 30 secondi e cosa conta davvero.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":228,"title":634,"description":635,"published":636,"category":380,"image":637,"draft":384},"Le nuove chiavi API di Supabase: quale va nella tua app?","Supabase ha sostituito anon e service_role con chiavi pubblicabili e segrete. Quale sta bene nella tua app, e quale non deve starci mai?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":639,"title":640,"description":641,"published":642,"category":429,"image":643,"draft":384},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Supabase fa il backup del mio database? Dipende dal tuo piano.","Supabase fa il backup del tuo database? Ogni giorno sui piani a pagamento, mai su quello gratuito. Come capire cosa hai e cosa quella copia non copre.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":645,"title":646,"description":647,"published":648,"category":380,"image":649,"draft":384},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security è attivo. La tabella resta pubblica.","Attivare Supabase Row Level Security non protegge una tabella. Lo fanno le policy, e quella che ha rimesso in piedi la tua app può far entrare chiunque.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":651,"title":652,"description":653,"published":648,"category":429,"image":654,"draft":384},"\u002Fblog\u002Fversion-history-is-not-a-backup","La cronologia delle versioni non è un backup dei tuoi dati.","Lovable e Bolt tengono una cronologia delle versioni del codice. Il tuo database è un servizio a parte, e tornare indietro non ti restituisce i dati.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":362,"title":656,"description":657,"published":658,"category":429,"image":659,"draft":384},"Tre modi per fare il backup di un database Supabase, e cosa manca","Il pannello, pg_dump e un servizio gestito. Che cosa salva davvero ciascuno, cosa lascia fuori senza dirlo e quale sopravvive alla perdita dell'account.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":67,"title":661,"description":662,"published":658,"category":380,"image":663,"draft":384},"Quali chiavi API sono sicure nel browser e quali no","La tua chiave anon di Supabase è fatta per essere pubblica. La chiave service_role no, e ignora ogni regola che imposti. Come distinguerle.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150956067]