[{"data":1,"prerenderedAt":917},["ShallowReactive",2],{"blog-it-no-api-key-found-in-request":3,"blog-index-it":564},{"id":4,"title":5,"body":6,"category":521,"cover":522,"coverAlt":523,"description":524,"draft":525,"extension":526,"faq":527,"image":543,"keywords":544,"meta":552,"navigation":553,"ogTitle":554,"path":555,"published":556,"seo":557,"stem":558,"tldr":559,"updated":556,"__hash__":563},"blog_it\u002Fblog\u002Fno-api-key-found-in-request.md","\"No API key found in request\" su Supabase, e la correzione sbagliata",{"type":7,"value":8,"toc":508},"minimark",[9,13,24,27,35,40,43,50,53,56,62,66,69,85,102,108,118,122,127,133,143,151,155,158,161,175,192,195,200,204,207,210,277,280,283,290,297,304,309,316,320,323,332,339,345,357,376,380,383,392,400,404,410,419,435,445,462,466,495],[10,11,12],"p",{},"Ieri la tua app funzionava. Oggi una lista che si riempiva di righe resta vuota,\ne se apri la console del browser c'è una breve risposta di Supabase dove\ndovrebbero esserci i dati:",[14,15,20],"pre",{"className":16,"code":18,"language":19},[17],"language-text","{\n  \"message\": \"No API key found in request\",\n  \"hint\": \"No `apikey` request header or url param was found.\"\n}\n","text",[21,22,18],"code",{"__ignoreMap":23},"",[10,25,26],{},"È tutto quello che ottieni. Non dice quale tabella stavi leggendo, cosa hai\nmandato, né cosa cambiare.",[10,28,29,30,34],{},"Ecco la parte che guida dopo guida racconta male: ",[31,32,33],"strong",{},"\"No API key found in request\"\nparla di un header mancante, e quasi tutti i consigli che troverai parlano delle\nregole del tuo database."," Sul forum di discussione di Supabase questo messaggio\nha un thread tutto suo, sedici persone ci propongono otto rimedi diversi, e tre\ndi loro dicono di aggiungere o allargare una regola su una delle tue tabelle.\nTutti quelli che ci hanno provato raccontano che il messaggio è sparito. Se una\nregola sia mai stata la causa è un'altra domanda, e il thread non la chiude mai.\nQuello che è certo dopo è che più persone possono leggere la tabella di prima.",[36,37,39],"h2",{"id":38},"cosa-significa-no-api-key-found-in-request","Cosa significa \"No API key found in request\"",[10,41,42],{},"Supabase ha respinto la tua richiesta al portone, prima che al database venisse\nchiesto qualcosa.",[10,44,45,46,49],{},"Ogni richiesta verso il tuo progetto arriva prima a una porta che Supabase mette\ndavanti a tutto il resto. In quel momento il suo compito è stretto: leggere\nl'header ",[21,47,48],{},"apikey",", confrontare il valore con le chiavi del tuo progetto e far\npassare la richiesta. Senza una chiave da leggere si ferma lì e risponde 401, il\ncodice di stato per \"non so chi sei\". La documentazione di Supabase su quella\nporta dice essa stessa che una chiave mancante o non valida viene respinta così.",[10,51,52],{},"Pensa a quella porta come a un portiere all'ingresso del palazzo, e non come a\nuna serratura su uno schedario. Il portiere chiede un pass a chiunque arrivi. Le\nregole che decidono chi può aprire quale schedario stanno due piani più su, e qui\nnessuno le ha consultate, perché niente ha superato l'ingresso.",[10,54,55],{},"Come errori, quindi, questo è mite. Non è stato letto niente, non è stato scritto\nniente, e i tuoi dati sono esattamente come erano. Una richiesta è stata\nrespinta.",[57,58],"diagram",{"alt":59,"caption":60,"src":61},"Un percorso da sinistra a destra, da un'app a un portone alto. Il portone ha una fessura tratteggiata vuota e una sbarra ambra, la freccia si ferma lì, e una breve linea tratteggiata dall'altra parte non porta da nessuna parte. Più a destra ci sono un lucchetto e una tabella in grigio, dentro una cornice tratteggiata.","La porta legge la chiave. Le regole della tua tabella stanno una tappa più avanti, e una richiesta respinta non le raggiunge mai.","\u002Fblog\u002Fno-api-key-found-in-request\u002Fwhere-it-stops-1600x620.png",[36,63,65],{"id":64},"perché-la-mia-richiesta-è-arrivata-senza-chiave","Perché la mia richiesta è arrivata senza chiave?",[10,67,68],{},"Perché il valore che la tua app doveva mandare non c'era nella richiesta che il\nbrowser ha fatto davvero. Quattro cause coprono quasi tutti i casi.",[10,70,71,74,75,78,79,84],{},[31,72,73],{},"La chiave non è mai arrivata nell'app compilata."," Il tuo codice la legge da\nuna variabile d'ambiente, la build che ha prodotto il sito online non aveva quella\nvariabile impostata, e ",[21,76,77],{},"createClient"," ha ricevuto una stringa vuota. Tutto\ncompila, l'app si carica, e ogni richiesta parte senza chiave. In un progetto Vite\no Next la variabile deve anche portare il prefisso che la segna come sicura per il\nbrowser, che è\n",[80,81,83],"a",{"href":82},"\u002Fblog\u002Fvite-and-next-public-env-vars","una trappola a sé",".",[10,86,87,90,91,94,95,98,99,101],{},[31,88,89],{},"Stai chiamando il percorso REST a mano."," Una ",[21,92,93],{},"fetch"," scritta verso\n",[21,96,97],{},"\u002Frest\u002Fv1\u002Fla_tua_tabella"," manda gli header che hai scritto e nient'altro. La\nlibreria client di Supabase aggiunge ",[21,100,48],{}," per te; una richiesta scritta a mano\nha quello che le hai dato.",[10,103,104,107],{},[31,105,106],{},"Qualcosa nel mezzo l'ha tolto."," Una regola di rewrite, un proxy o un tuo\ngateway sta fra la tua app e Supabase e inoltra la richiesta senza l'header.",[10,109,110,113,114,117],{},[31,111,112],{},"Stai guardando un redirect e non una richiesta di dati."," Se il messaggio\ncompare dopo che qualcuno ha fatto login o ha cliccato un link di conferma, e la\nbarra degli indirizzi mostra ancora il tuo URL Supabase, l'impostazione da\nguardare è la Site URL dentro Auth. La risposta con più reazioni di tutto quel\nthread Supabase è di qualcuno che lì aveva scritto l'indirizzo del proprio sito\nsenza ",[21,115,116],{},"https:\u002F\u002F"," davanti.",[36,119,121],{"id":120},"la-correzione-in-una-riga","La correzione, in una riga",[10,123,124,125,84],{},"Manda la tua chiave pubblicabile nell'header ",[21,126,48],{},[14,128,131],{"className":129,"code":130,"language":19},[17],"import { createClient } from '@supabase\u002Fsupabase-js'\n\nexport const supabase = createClient(\n  'https:\u002F\u002Fil-tuo-progetto.supabase.co',\n  'sb_publishable_…',\n)\n",[21,132,130],{"__ignoreMap":23},[10,134,135,136,138,139,142],{},"Crea il client così e la libreria mette la chiave nell'header giusto a ogni\nrichiesta, così l'header non lo scrivi mai. La documentazione di Supabase è\nprecisa su quale sia: le chiavi pubblicabili e segrete viaggiano in ",[21,137,48],{},"\nanziché in ",[21,140,141],{},"Authorization: Bearer",", perché sono stringhe corte e opache e tutto\nciò che prova a verificarle come un JWT fallisce.",[10,144,145,146,150],{},"Quella chiave deve stare nella tua app. Dice a quale progetto appartiene una\nrichiesta, e quello che un visitatore che la possiede raggiunge lo decidono le\nregole sulle tue tabelle, che è tutta la ragione per cui può essere pubblica.\n",[80,147,149],{"href":148},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Quali chiavi API sono sicure nel frontend","\npercorre il resto della famiglia.",[36,152,154],{"id":153},"la-correzione-che-peggiora-tutto","La correzione che peggiora tutto",[10,156,157],{},"La chiave segreta entra nello stesso header, e su un progetto vecchio zittisce il\nmessaggio e continua a funzionare.",[10,159,160],{},"È un solo clic sbagliato. La tua dashboard elenca entrambe le chiavi sulla stessa\npagina, e la coppia vecchia si somiglia: stessa forma, stessa lunghezza, una sotto\nl'altra. Quanto sia grave il clic dipende da quale coppia emette il tuo progetto.",[10,162,163,166,167,170,171,174],{},[31,164,165],{},"Una chiave segreta recente viene respinta nel browser."," Supabase blocca\n",[21,168,169],{},"sb_secret_…"," guardando l'header ",[21,172,173],{},"User-Agent"," e risponde 401. Incollarne una nel\nfrontend quindi non fa sparire l'errore, che è il risultato migliore disponibile\nqui.",[10,176,177,184,185,187,188,191],{},[31,178,179,180,183],{},"Una vecchia chiave ",[21,181,182],{},"service_role"," non ha quel blocco."," Funziona. La lista si\nriempie, l'app si comporta come la settimana scorsa, e la chiave ora sta in un\nfile che qualsiasi visitatore può scaricare. Lì ignora ogni regola che hai\nscritto: ",[21,186,182],{}," porta l'attributo Postgres ",[21,189,190],{},"BYPASSRLS",", quindi una policy\nnon le si applica mai. Ogni riga di ogni tabella, leggibile e scrivibile da chi\napre il file.",[10,193,194],{},"La nota di Supabase sul blocco del browser merita due letture. Il blocco risponde\n401, e un attaccante può comunque usare la chiave con altri strumenti. Quello che\nprotegge sono le richieste della tua app; la stessa chiave nello stesso file\nrisponde a una richiesta mandata da uno script.",[57,196],{"alt":197,"caption":198,"src":199},"Una chiave disegnata due volte. Sopra, il suo percorso da una finestra di browser si ferma su una sbarra ambra piena con il numero 401. Sotto, la stessa chiave parte da un terminale e attraversa il punto dove quella sbarra starebbe, qui disegnata come contorno tratteggiato, fino a tre righe di tabella riempite di rosso.","Il blocco del browser riguarda il browser. La stessa chiave nello stesso file funziona da qualunque cosa non lo sia.","\u002Fblog\u002Fno-api-key-found-in-request\u002Fthe-browser-block-1600x640.png",[36,201,203],{"id":202},"laltra-strada-sbagliata-e-perché-è-così-facile","L'altra strada sbagliata, e perché è così facile",[10,205,206],{},"Allargare una regola sulla tabella zittisce il messaggio anch'essa, e cambia chi\npuò leggere le tue righe.",[10,208,209],{},"Ecco quel thread Supabase per intero, raggruppato per quello che ogni risposta ti\nchiede di cambiare:",[211,212,213,229],"table",{},[214,215,216],"thead",{},[217,218,219,223,226],"tr",{},[220,221,222],"th",{},"Cosa cambiare",[220,224,225],{},"Quante delle otto risposte",[220,227,228],{},"Cosa cambia davvero",[230,231,232,244,255,265],"tbody",{},[217,233,234,238,241],{},[235,236,237],"td",{},"La Site URL dentro Auth",[235,239,240],{},"1",[235,242,243],{},"Dove atterra un redirect",[217,245,246,249,252],{},[235,247,248],{},"Una policy o un grant",[235,250,251],{},"3",[235,253,254],{},"Chi legge e scrive le righe",[217,256,257,260,262],{},[235,258,259],{},"La query o la sessione",[235,261,251],{},[235,263,264],{},"Il tuo codice",[217,266,267,272,274],{},[235,268,269,270],{},"L'header ",[21,271,48],{},[235,273,240],{},[235,275,276],{},"Cosa stava chiedendo la porta",[10,278,279],{},"L'ultima riga è quella che risponde al suggerimento contenuto nel messaggio. È il\ncommento in fondo al thread e ha un voto solo.",[10,281,282],{},"Nessuna delle altre sette è scritta in malafede, ed è questo a rendere la cosa\ndifficile. Un messaggio compare davvero in più situazioni, chi risponde ha davvero\nrimesso in moto la propria app, e una policy che già mancava è davvero qualcosa da\nsistemare. Quello che va storto è l'ordine: si riscrive una regola per zittire un\nmessaggio che parla di un header, e la regola è la metà di quella coppia che poi\nnessuno ricontrolla. La tua app funziona in entrambi i casi, quindi niente ti dice\nquale delle due hai fatto.",[10,284,285,286,289],{},"Da fuori il risultato si vede. Il nostro scanner legge le app online come farebbe\nuno sconosciuto, e delle 31.056 app che ha valutato, ",[31,287,288],{},"tre"," hanno pubblicato una\nchiave segreta Supabase. Questo ne fa il ritrovamento più raro che abbiamo, e il\npiù grave.",[10,291,292,293,296],{},"L'istinto accanto è molto più comune. Dietro 8.435 di quelle app abbiamo trovato\nun progetto Supabase. Su 3.680 di esse la domanda \"uno sconosciuto può leggere\nquesta tabella\" ha ottenuto una risposta utilizzabile, e ",[31,294,295],{},"2.096 hanno risposto di\nsì",": almeno una tabella ha consegnato righe a una richiesta da fuori senza\nnessun account di mezzo. In 394 di queste la tabella aperta era chiamata come una\ntabella di persone.",[10,298,299,300,84],{},"Una parte è voluta. Un menu pubblicato, una pagina di annunci e un changelog\npubblico vivono tutti in tabelle che uno sconosciuto deve poter leggere, e il\nnostro scanner non sa distinguerle da una tabella di clienti aperta per\ndistrazione. Riporta quello che ha risposto e lascia il giudizio a te, che è il\nmotivo per cui\n",[80,301,303],{"href":302},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","attivare Row Level Security non equivale a essere protetti",[57,305],{"alt":306,"caption":307,"src":308},"Tre barre su una stessa scala, sempre più corte verso il basso. La prima sono tutte le app in cui è stato trovato un progetto Supabase. La seconda è il numero minore in cui la domanda sulla tabella ha avuto una risposta, con il resto che prosegue come contorno tratteggiato con un punto interrogativo. La terza sono le app che hanno risposto di sì.","Cosa può leggere uno sconosciuto, sulle app che hanno risposto. La banda tratteggiata sono le app che non hanno risposto niente, che non è lo stesso di un'app senza niente di aperto.","\u002Fblog\u002Fno-api-key-found-in-request\u002Fwhat-answered-1600x620.png",[10,310,311,312,84],{},"Se preferisci vedere la tua risposta anziché dedurla, la nostra scansione\ngratuita legge il tuo sito online e ti dice cosa raggiunge da fuori. Richiede\nuna ventina di secondi e non serve un account:\n",[80,313,315],{"href":314},"\u002Fsecurity-scanner","scansiona la tua app",[36,317,319],{"id":318},"come-capire-quale-chiave-hai-incollato","Come capire quale chiave hai incollato",[10,321,322],{},"Leggi l'inizio della stringa.",[10,324,325,328,329,331],{},[21,326,327],{},"sb_publishable_…"," sta nella tua app. ",[21,330,169],{}," mai. Non c'è niente da\ndecodificare, perché a cosa serve la chiave è scritto sul davanti.",[10,333,334,335,338],{},"Un valore lungo che inizia con ",[21,336,337],{},"eyJ"," è una della coppia vecchia, ed è lì che le\ndue diventano difficili da distinguere. La sezione centrale di una chiave così è\ninformazione leggibile e non cifratura, e porta un campo che chiude la questione:",[14,340,343],{"className":341,"code":342,"language":19},[17],"{\n  \"iss\": \"supabase\",\n  \"role\": \"anon\",          ← quello che conta\n  \"iat\": 1750000000\n}\n",[21,344,342],{"__ignoreMap":23},[10,346,347,350,351,353,354,356],{},[21,348,349],{},"anon"," è la pubblicabile della coppia. ",[21,352,182],{}," è quella da ruotare oggi. La\ndocumentazione di Supabase lo dice più secco di quanto lo diremmo noi: se un\ntutorial o un assistente IA ti dice di copiare una chiave lunga che inizia con\n",[21,355,337],{},", è stato scritto per le chiavi vecchie.",[10,358,359,360,362,363,365,366,370,371,375],{},"Entrambe le coppie possono essere attive insieme, ed è il dettaglio su cui si\ninciampa. Creare una chiave pubblicabile o segreta lascia le tue chiavi ",[21,361,349],{}," e\n",[21,364,182],{}," esattamente dov'erano, e continuano a funzionare finché non le\ndisattivi nella dashboard come passo a parte.\n",[80,367,369],{"href":368},"\u002Fblog\u002Fsupabase-new-api-keys","Cosa è cambiato con le chiavi nuove"," copre quella\nmigrazione, e\n",[80,372,374],{"href":373},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","dove vive ogni valore nella dashboard"," è\nla pagina da aprire se non ci sei mai stato.",[36,377,379],{"id":378},"se-la-chiave-segreta-è-già-nella-tua-app","Se la chiave segreta è già nella tua app",[10,381,382],{},"Ruotala prima di modificare qualsiasi cosa, e lavora nell'ordine che dà Supabase.",[10,384,385,386,388,389,391],{},"Crea una nuova chiave segreta nella dashboard. Sostituisci la vecchia ovunque il\ntuo progetto la usi. Verifica che ogni parte della tua app sia passata a quella\nnuova. Solo allora ritira la vecchia, e l'ultimo passo cambia a seconda della\ncoppia che hai in mano: cancellare una chiave segreta non si può annullare, mentre\ndisattivare una vecchia coppia ",[21,387,349],{}," e ",[21,390,182],{}," è reversibile, quindi puoi\nriaccenderle se ti è sfuggito un client.",[10,393,394,395,399],{},"Se ruotare prima o chiudere prima la falla dipende da se una copia è già pubblica.\n",[80,396,398],{"href":397},"\u002Fblog\u002Frotate-supabase-service-role-key","Ruotare una chiave service_role di Supabase","\npercorre entrambi gli ordini e cosa leggere dopo nei tuoi log.",[36,401,403],{"id":402},"perché-resti-così-quando-lerrore-sparisce","Perché resti così quando l'errore sparisce",[10,405,406,409],{},[31,407,408],{},"La correzione regge fino al prossimo prompt o alla prossima modifica che tocca\nla tua configurazione Supabase."," Basta un prompt per rimettere dentro una\nchiave o allentare di nuovo una regola, e la tua app continua a funzionare in\nentrambi i casi, quindi il cambiamento si vede solo quando qualcuno guarda.",[10,411,412],{},[31,413,414,418],{},[80,415,417],{"href":416},"\u002Fpricing","Reeve Monitor"," guarda al posto tuo:",[420,421,422,426,429,432],"ul",{},[423,424,425],"li",{},"tutti e nove i controlli ogni ora, su un massimo di tre app",[423,427,428],{},"un'email il giorno in cui una nuova scansione dà alla tua app un voto più basso della precedente",[423,430,431],{},"se l'app è raggiungibile, ogni 60 secondi",[423,433,434],{},"un rapporto mensile di quello che ha visto",[10,436,437],{},[31,438,439,440,444],{},"Una chiave che può scrivere ogni riga può anche svuotare ogni tabella.\n",[80,441,443],{"href":442},"\u002Fsupabase-backups","Reeve Care"," conserva una copia del tuo database Supabase\ndove nessuna chiave della tua app può arrivare.",[420,446,447,450,453,456,459],{},[423,448,449],{},"una copia cifrata ogni giorno, tenuta fuori dal tuo account Supabase",[423,451,452],{},"ogni copia verificata prima di contare, con il conteggio delle righe di ogni tabella",[423,454,455],{},"un ripristino con un clic che salva lo stato attuale prima di sostituire qualcosa",[423,457,458],{},"anche i tuoi file caricati, appena colleghi una credenziale di Storage",[423,460,461],{},"tutto ciò che fa Monitor",[36,463,465],{"id":464},"cosa-fare-oggi","Cosa fare oggi",[467,468,469],"key-takeaways",{},[420,470,471,474,480,489,492],{},[423,472,473],{},"Leggi il messaggio come un rifiuto alla porta. Le tue righe non sono state toccate e non c'è niente da recuperare.",[423,475,476,477,479],{},"Guarda nella scheda rete del browser la richiesta fallita e controlla se un header ",[21,478,48],{}," c'è proprio. Quell'unica occhiata ti dice se è un problema di chiave o di redirect.",[423,481,482,483,485,486,488],{},"Crea il client Supabase con la chiave pubblicabile e lascia che sia la libreria a mandare l'header. ",[21,484,327],{}," su un progetto recente, la chiave ",[21,487,349],{}," su uno vecchio.",[423,490,491],{},"Se nella tua app c'è già una chiave segreta, ruotala per prima cosa. Cancellarla dal codice non chiude la porta, perché la vecchia versione resta nella cronologia delle versioni e in ogni copia in cache del sito.",[423,493,494],{},"Rimetti a posto ogni regola allargata durante questa caccia, poi controllala da fuori e non dall'anteprima del tuo builder.",[10,496,497,498,502,503,507],{},"Parti dall'unica tabella da cui è arrivato l'errore, poi leggi le policy di ogni\ntabella che hai toccato nella stessa settimana. La\n",[80,499,501],{"href":500},"\u002Fchecklist","checklist di sicurezza in 10 minuti"," copre cos'altro resta di solito\naperto in un'app appena lanciata, e la\n",[80,504,506],{"href":505},"\u002Fis-your-supabase-app-safe","guida alla sicurezza di Supabase"," percorre il resto\ndi quello che uno sconosciuto può raggiungere.",{"title":23,"searchDepth":509,"depth":509,"links":510},3,[511,513,514,515,516,517,518,519,520],{"id":38,"depth":512,"text":39},2,{"id":64,"depth":512,"text":65},{"id":120,"depth":512,"text":121},{"id":153,"depth":512,"text":154},{"id":202,"depth":512,"text":203},{"id":318,"depth":512,"text":319},{"id":378,"depth":512,"text":379},{"id":402,"depth":512,"text":403},{"id":464,"depth":512,"text":465},"Basi della sicurezza","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcover-1200x630.png","Una richiesta arriva a un portone alto con la fessura del pass vuota e una sbarra di traverso, e il database a cui era diretta resta intatto dietro.","\"No API key found in request\" significa che la tua richiesta è arrivata a Supabase senza chiave. Quasi tutte le risposte indicano le regole del database.",false,"md",[528,531,534,537,540],{"q":529,"a":530},"Cosa significa \"No API key found in request\"?","Significa che la tua richiesta è arrivata a Supabase senza l'header apikey, quindi la porta che Supabase mette davanti al tuo progetto l'ha respinta prima che il database fosse coinvolto. Non è stato letto niente, non è stato scritto niente, e nei tuoi dati non è cambiato niente. La risposta porta un suggerimento che dice la stessa cosa con altre parole: no apikey request header or url param was found.",{"q":532,"a":533},"Quale chiave Supabase va nell'header apikey?","La tua chiave pubblicabile, cioè sb_publishable_ su un progetto recente e la chiave anon su uno più vecchio. Supabase la fornisce esattamente per questo e si aspetta che sia visibile dentro la tua app. La libreria client la mette nell'header a ogni richiesta, quindi se crei il client con la chiave pubblicabile non scrivi mai l'header a mano.",{"q":535,"a":536},"È sicuro tenere la mia chiave anon nel browser?","Sì, e deve stare lì perché la tua app possa parlare con il tuo progetto. La chiave anon dice solo a quale progetto appartiene una richiesta; quello che un visitatore che la possiede raggiunge davvero lo decidono le regole di Row Level Security sulle tue tabelle. Quali chiavi API sono sicure nel frontend percorre tutta la famiglia delle chiavi e spiega come leggerle.",{"q":538,"a":539},"Ho usato la chiave service_role e ha funzionato. È un problema?","Sì, ed è la cosa che vale la pena sistemare oggi. Una chiave service_role porta l'attributo Postgres BYPASSRLS, quindi le tue policy non le si applicano mai. Pubblicata dentro la tua app finisce in un file che qualsiasi visitatore può scaricare, e chi lo scarica può leggere e scrivere ogni riga di ogni tabella. Ruota prima la chiave, poi sposta su un server quello che ne aveva bisogno.",{"q":541,"a":542},"Come faccio a sapere quale chiave ho incollato?","Leggi l'inizio della stringa. sb_publishable_ sta nella tua app e sb_secret_ mai. Un valore lungo che inizia con eyJ è una della coppia vecchia, e quelle due sembrano identiche, quindi devi guardarci dentro: la sezione centrale si decodifica in dati leggibili con un campo role, che riporta anon oppure service_role.","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",[545,546,547,548,549,550,551],"no api key found in request","no api key found in request supabase","supabase api key non trovata","supabase header apikey mancante","401 api key non valida supabase","supabase api key non funziona","supabase 401 unauthorized",{},true,"\"No API key found in request\" su Supabase","\u002Fblog\u002Fno-api-key-found-in-request","2026-10-07",{"title":5,"description":524},"blog\u002Fno-api-key-found-in-request",[560,561,562],"\"No API key found in request\" significa che la tua richiesta è arrivata a Supabase senza l'header apikey, quindi è stata respinta alla porta prima che al database venisse chiesto qualcosa.","La correzione giusta è la tua chiave pubblicabile in quell'header, cioè la chiave pensata per essere pubblica. La libreria client di Supabase la invia per te a ogni richiesta.","Le due correzioni a cui si ricorre invece sono la chiave segreta e una regola più larga sulla tabella. Entrambe zittiscono il messaggio, ed entrambe lasciano le tue righe leggibili a chiunque abbia la chiave che viaggia dentro la tua app.","se9YFuqreIK1dBR7A7_0mXEOIIEsFxV1CdCRwhBW1t4",[565,571,577,583,589,590,596,602,608,614,620,626,632,638,645,651,657,662,668,674,680,686,692,698,704,709,715,721,727,733,739,745,751,757,763,768,774,780,786,792,798,804,810,816,822,828,833,839,845,851,857,863,869,875,881,886,891,897,902,907,913],{"path":566,"title":567,"description":568,"published":569,"category":521,"image":570,"draft":525},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"Row-level security policy for table objects\" in upload","\"New row violates row-level security policy for table objects\" vuol dire che al tuo upload manca una regola insert. Rendere pubblico il bucket non ne aggiunge.","2026-10-11","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":572,"title":573,"description":574,"published":575,"category":521,"image":576,"draft":525},"\u002Fblog\u002Fbase44-security-scan","Scansione di sicurezza Base44: ciò che vede solo lei","La scansione di sicurezza Base44 controlla sette tipi di problema dall’interno. Ecco la metà che legge e che nessun altro legge, e quella che non guarda mai.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":578,"title":579,"description":580,"published":581,"category":521,"image":582,"draft":525},"\u002Fblog\u002Fapi-key-leaked-what-to-do","La tua chiave API è trapelata. L'ordine in cui muoverti","Una chiave API è trapelata e non sai da cosa cominciare. Non tutte le chiavi nel frontend lo sono, e l'ordine conta più della velocità.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":584,"title":585,"description":586,"published":587,"category":521,"image":588,"draft":525},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" senza disattivare RLS","\"Infinite recursion detected in policy for relation\" significa che la tua policy ha interrogato la tabella che protegge. Ecco come rompere il cerchio.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":555,"title":5,"description":524,"published":556,"category":521,"image":543,"draft":525},{"path":591,"title":592,"description":593,"published":594,"category":521,"image":595,"draft":525},"\u002Fblog\u002Fis-base44-safe","Base44 è sicuro? Cosa abbiamo trovato in 5.442 app","Base44 è sicuro? Abbiamo passato nove controlli su 5.442 app Base44 online. Quasi tutte hanno preso B, per motivi che il proprietario non ha mai scelto.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":597,"title":598,"description":599,"published":600,"category":521,"image":601,"draft":525},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Nascondere una chiave API: spostala in una Edge Function Supabase","Nascondere una chiave API vuol dire toglierla dal browser, e una Edge Function Supabase è il posto più piccolo dove metterla. Due passaggi contano di più.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":603,"title":604,"description":605,"published":606,"category":521,"image":607,"draft":525},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Il tuo file .env è esposto? I dodici percorsi da provare","Il tuo file .env è esposto sul tuo server web? Dodici indirizzi te lo dicono, e una risposta significa che tutto quello che contiene è già pubblico.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":609,"title":610,"description":611,"published":612,"category":521,"image":613,"draft":525},"\u002Fblog\u002Fis-v0-safe","Sicurezza di v0: tutte le 1.790 app v0 analizzate hanno preso A","La sicurezza di v0 misurata su 1.790 app v0 online: tutte hanno preso A. Solo 17 nominavano un database, ed è soprattutto questo che misura quella A.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":615,"title":616,"description":617,"published":618,"category":521,"image":619,"draft":525},"\u002Fblog\u002Fis-bolt-safe","Bolt è sicuro? Cosa abbiamo trovato in 1.123 app Bolt","Bolt è sicuro? Abbiamo passato 1.123 app Bolt online per nove controlli. L’hosting era pulito. I rilievi erano chiavi e tabelle aperte dentro le app.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":621,"title":622,"description":623,"published":624,"category":521,"image":625,"draft":525},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase è down o è la tua app? Come capirlo","Supabase è down o è la tua app? Un progetto in pausa, un database pieno e un tuo errore sembrano la stessa cosa. Quattro controlli li separano.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":627,"title":628,"description":629,"published":630,"category":521,"image":631,"draft":525},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","Supabase crittografa i miei dati? Sì. Ecco da cosa protegge","Supabase crittografa i dati? Sì: AES-256 a riposo, TLS in transito, SOC 2 e ISO 27001. Cosa copre ciascuno, e la fuga di dati che nessuno di questi ferma.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":633,"title":634,"description":635,"published":636,"category":521,"image":637,"draft":525},"\u002Fblog\u002Fsupabase-free-plan-limits","Supabase: prezzi e limiti del piano gratuito, uno per uno","Prezzi e limiti del piano gratuito di Supabase: 500 MB di database, 5 GB di egress e nessun backup. Cosa succede a ogni soglia e cosa cambia Pro a $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":639,"title":640,"description":641,"published":642,"category":643,"image":644,"draft":525},"\u002Fblog\u002Ftest-your-supabase-backup","Testa il tuo backup di Supabase prima del giorno in cui serve","Come testare il tuo backup di Supabase: ripristinarlo in un progetto di prova, contare le righe, accedere e cercare la riga che manca a un file troncato.","2026-09-28","Backups","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":646,"title":647,"description":648,"published":649,"category":643,"image":650,"draft":525},"\u002Fblog\u002Fsupabase-backup-github-action","Backup gratis di Supabase con una GitHub Action, e il tranello","Un backup di Supabase con una GitHub Action è gratis e va bene per molte app. Il workflow, la connection string giusta e l'egress di ogni esecuzione.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":652,"title":653,"description":654,"published":655,"category":643,"image":656,"draft":525},"\u002Fblog\u002Fdownload-your-supabase-backup","Perché non puoi scaricare il tuo backup di Supabase","Non puoi scaricare il tuo backup di Supabase su un progetto recente, perché la copia giornaliera è uno snapshot fisico. Come verificarlo e tenere una copia tua.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":658,"title":659,"description":660,"published":655,"category":521,"image":661,"draft":525},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": il grant mancante","Dal 30 ottobre una nuova tabella di Supabase risponde \"permission denied for table\" finché non concedi l'accesso. Il grant della mail è metà della soluzione.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":663,"title":664,"description":665,"published":666,"category":521,"image":667,"draft":525},"\u002Fblog\u002Fopen-api-endpoint-exposed","Un endpoint API aperto è un problema di sicurezza? Leggi il JSON","La tua scansione ha segnalato un endpoint API aperto. Quanto conti dipende da che cosa è tornato, e la maggior parte di quelli trovati era della piattaforma.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":669,"title":670,"description":671,"published":672,"category":521,"image":673,"draft":525},"\u002Fblog\u002Flovable-security-scan","Scansione di sicurezza Lovable: cosa non può dimostrare","Scansione di sicurezza Lovable: cosa controllano Quick scan e Deep scan, quando parte ciascuno, e l’unica cosa che nessuna scansione dall’interno dimostra.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":675,"title":676,"description":677,"published":678,"category":643,"image":679,"draft":525},"\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","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":681,"title":682,"description":683,"published":684,"category":521,"image":685,"draft":525},"\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":687,"title":688,"description":689,"published":690,"category":521,"image":691,"draft":525},"\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":693,"title":694,"description":695,"published":696,"category":521,"image":697,"draft":525},"\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":699,"title":700,"description":701,"published":702,"category":521,"image":703,"draft":525},"\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":82,"title":705,"description":706,"published":707,"category":521,"image":708,"draft":525},"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":710,"title":711,"description":712,"published":713,"category":521,"image":714,"draft":525},"\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":716,"title":717,"description":718,"published":719,"category":521,"image":720,"draft":525},"\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":722,"title":723,"description":724,"published":725,"category":521,"image":726,"draft":525},"\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":728,"title":729,"description":730,"published":731,"category":643,"image":732,"draft":525},"\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":734,"title":735,"description":736,"published":737,"category":643,"image":738,"draft":525},"\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":740,"title":741,"description":742,"published":743,"category":643,"image":744,"draft":525},"\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":746,"title":747,"description":748,"published":749,"category":521,"image":750,"draft":525},"\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":752,"title":753,"description":754,"published":755,"category":521,"image":756,"draft":525},"\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":758,"title":759,"description":760,"published":761,"category":521,"image":762,"draft":525},"\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":397,"title":764,"description":765,"published":766,"category":521,"image":767,"draft":525},"Come ruotare una chiave service_role Supabase trapelata","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.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":769,"title":770,"description":771,"published":772,"category":521,"image":773,"draft":525},"\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":775,"title":776,"description":777,"published":778,"category":521,"image":779,"draft":525},"\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":781,"title":782,"description":783,"published":784,"category":521,"image":785,"draft":525},"\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":787,"title":788,"description":789,"published":790,"category":521,"image":791,"draft":525},"\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":793,"title":794,"description":795,"published":796,"category":521,"image":797,"draft":525},"\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":799,"title":800,"description":801,"published":802,"category":521,"image":803,"draft":525},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","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":805,"title":806,"description":807,"published":808,"category":643,"image":809,"draft":525},"\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":811,"title":812,"description":813,"published":814,"category":521,"image":815,"draft":525},"\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":817,"title":818,"description":819,"published":820,"category":643,"image":821,"draft":525},"\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":823,"title":824,"description":825,"published":826,"category":521,"image":827,"draft":525},"\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":373,"title":829,"description":830,"published":831,"category":521,"image":832,"draft":525},"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":834,"title":835,"description":836,"published":837,"category":521,"image":838,"draft":525},"\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":840,"title":841,"description":842,"published":843,"category":521,"image":844,"draft":525},"\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":846,"title":847,"description":848,"published":849,"category":643,"image":850,"draft":525},"\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":852,"title":853,"description":854,"published":855,"category":643,"image":856,"draft":525},"\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":858,"title":859,"description":860,"published":861,"category":521,"image":862,"draft":525},"\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":864,"title":865,"description":866,"published":867,"category":521,"image":868,"draft":525},"\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":870,"title":871,"description":872,"published":873,"category":643,"image":874,"draft":525},"\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":876,"title":877,"description":878,"published":879,"category":521,"image":880,"draft":525},"\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":882,"title":883,"description":884,"published":879,"category":521,"image":885,"draft":525},"\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":368,"title":887,"description":888,"published":889,"category":521,"image":890,"draft":525},"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":892,"title":893,"description":894,"published":895,"category":643,"image":896,"draft":525},"\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":302,"title":898,"description":899,"published":900,"category":521,"image":901,"draft":525},"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":903,"title":904,"description":905,"published":900,"category":643,"image":906,"draft":525},"\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":908,"title":909,"description":910,"published":911,"category":643,"image":912,"draft":525},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","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":148,"title":914,"description":915,"published":911,"category":521,"image":916,"draft":525},"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",1791705965120]