[{"data":1,"prerenderedAt":922},["ShallowReactive",2],{"blog-it-infinite-recursion-in-policy-for-relation":3,"blog-index-it":568},{"id":4,"title":5,"body":6,"category":525,"cover":526,"coverAlt":527,"description":528,"draft":529,"extension":530,"faq":531,"image":546,"keywords":547,"meta":556,"navigation":557,"ogTitle":558,"path":559,"published":560,"seo":561,"stem":562,"tldr":563,"updated":560,"__hash__":567},"blog_it\u002Fblog\u002Finfinite-recursion-in-policy-for-relation.md","\"Infinite recursion detected in policy\" senza disattivare RLS",{"type":7,"value":8,"toc":512},"minimark",[9,13,24,32,37,40,43,60,63,67,70,78,94,100,103,107,113,119,122,126,134,140,143,146,199,210,218,222,228,231,236,239,242,294,297,300,307,315,319,322,332,335,353,369,373,376,393,396,400,406,415,433,444,461,465,504],[10,11,12],"p",{},"Hai attivato Row Level Security, scritto una regola perché gli admin vedano\ntutti i profili e ciascun altro veda solo il proprio, e adesso non si carica\nnemmeno una schermata della tua app. Ogni lettura torna con la stessa riga:",[14,15,20],"pre",{"className":16,"code":18,"language":19},[17],"language-text","infinite recursion detected in policy for relation \"profiles\"\n","text",[21,22,18],"code",{"__ignoreMap":23},"",[10,25,26,27,31],{},"La maggior parte delle risposte che troverai dice la stessa cosa, ed è quella\nsbagliata: ",[28,29,30],"strong",{},"disattiva Row Level Security su quella tabella finché non ne vieni\na capo."," L'errore smette davvero. A farlo smettere è che la tabella adesso è\nleggibile da chiunque visiti il tuo sito.",[33,34,36],"h2",{"id":35},"che-cosa-significa-infinite-recursion-detected-in-policy-for-relation","Che cosa significa \"infinite recursion detected in policy for relation\"",[10,38,39],{},"Una regola su una tabella ha dovuto leggere quella stessa tabella prima di poter\nrispondere.",[10,41,42],{},"Immagina un portiere che controlla ogni visitatore su una lista di invitati, e\nla lista sta dentro la sala che sta sorvegliando. Per leggere la lista deve\nentrare. Per entrare deve controllare la lista. Non c'è un primo passo, così\nresta nel corridoio e nessuno va da nessuna parte.",[10,44,45,46,49,50,52,53,55,56,59],{},"È quello in cui è finito il tuo database. Gli hanno chiesto alcune righe di\n",[21,47,48],{},"profiles",", è andato alla regola su ",[21,51,48],{}," per capire quali potevi vedere, e\nla regola gli ha detto di guardare in ",[21,54,48],{},". Postgres si accorge che sta\ngirando in tondo, rinuncia e solleva l'errore con attaccato il codice ",[21,57,58],{},"42P17",".\nSupabase lo passa alla tua app senza toccarlo, ed è per questo che si legge come\nun pezzo di macchina.",[10,61,62],{},"La query fallisce per tutti quelli a cui la regola si applica, quindi di solito\narriva come un'app intera che resta vuota in un colpo solo, non come una singola\nschermata rotta.",[33,64,66],{"id":65},"il-cerchio-disegnato","Il cerchio, disegnato",[10,68,69],{},"La regola che lo provoca è quella che quasi tutti scrivono per prima, perché\ndice esattamente quello che intendi:",[14,71,76],{"className":72,"code":74,"language":75,"meta":23},[73],"language-sql","-- Da rifiutare: questo legge profiles per decidere chi può leggere profiles.\ncreate policy \"admins read every profile\" on profiles for select\nto authenticated\nusing (\n  exists (\n    select 1 from profiles\n    where id = (select auth.uid()) and role = 'admin'\n  )\n);\n","sql",[21,77,74],{"__ignoreMap":23},[10,79,80,81,84,85,87,88,90,91,93],{},"L'",[21,82,83],{},"exists (select 1 from profiles …)"," è tutto il problema. Leggere ",[21,86,48],{},"\nvuol dire applicare la regola su ",[21,89,48],{},", che esegue di nuovo\n",[21,92,83],{},".",[95,96],"diagram",{"alt":97,"caption":98,"src":99},"La lettura di un visitatore arriva a una policy, disegnata come un lucchetto. La policy manda una domanda alla tabella profiles e la tabella la rimanda alla policy, e quella coppia di frecce forma un anello chiuso contrassegnato 42P17.","La richiesta non ha niente di strano. L'anello sta fra la regola e la tabella che la regola protegge.","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fthe-circle-1600x660.png",[10,101,102],{},"La guida a Row Level Security di Supabase nomina la versione a due tabelle:\npolicy su due tabelle che leggono ciascuna l'altra non si risolvono mai, e la\nquery fallisce per ogni ruolo a cui le policy si applicano. Una tabella che\nlegge se stessa è la stessa forma senza la deviazione.",[33,104,106],{"id":105},"perché-succede-sempre-sulla-tabella-profiles","Perché succede sempre sulla tabella profiles?",[10,108,109,110,112],{},"Perché in ",[21,111,48],{}," sta chi è questa persona.",[10,114,115,116,118],{},"Qualunque regola che tratti un tipo di persona diversamente da un altro deve\nscoprire di che tipo è chi sta chiamando, e quel dato vive in una colonna di\nqualche tabella. Comunque si chiami quella tabella, la regola che la protegge\nfinisce per leggerla. In un'app fatta con Lovable, Bolt, v0 o Replit di solito è\n",[21,117,48],{},", perché è lì che finisce la riga di ogni persona autenticata. Una\nregola su team, organizzazioni o documenti condivisi produce lo stesso cerchio\nsulla tabella che tiene l'appartenenza.",[10,120,121],{},"Quindi la ricorsione nasce dall'aver scritto la regola ovvia sull'unica tabella\nche deve rispondere a una domanda su se stessa.",[33,123,125],{"id":124},"la-soluzione-un-helper-che-legge-la-tabella-fuori-dalle-regole","La soluzione: un helper che legge la tabella fuori dalle regole",[10,127,128,129,131,132,93],{},"Sposta la domanda in una piccola funzione che gira come proprietaria del\ndatabase, così leggere ",[21,130,48],{}," per rispondere non passa dalla regola su\n",[21,133,48],{},[14,135,138],{"className":136,"code":137,"language":75,"meta":23},[73],"create schema if not exists private;\n\ncreate function private.is_admin()\nreturns boolean\nlanguage sql\nsecurity definer      -- gira come il ruolo che l'ha creata\nset search_path = ''  -- così ogni nome qui dentro va scritto per esteso\nstable\nas $$\n  select exists (\n    select 1 from public.profiles\n    where id = (select auth.uid()) and role = 'admin'\n  );\n$$;\n\nrevoke execute on function private.is_admin() from public;\ngrant usage on schema private to authenticated;\ngrant execute on function private.is_admin() to authenticated;\n\n-- Adesso la regola interroga la funzione invece della tabella.\ncreate policy \"admins read every profile\" on profiles for select\nto authenticated\nusing ( (select private.is_admin()) );\n",[21,139,137],{"__ignoreMap":23},[10,141,142],{},"Adesso il portiere ha la lista di invitati su un tavolo nel corridoio. La legge\nsenza aprire la porta, e la porta resta chiusa per tutti quelli che non ci sono\nsopra.",[10,144,145],{},"Quattro righe lì dentro fanno un lavoro preciso, e tre di esse sono la\ndifferenza fra una soluzione e un buco nuovo:",[147,148,149,162,178,187],"ul",{},[150,151,152,157,158,161],"li",{},[28,153,154],{},[21,155,156],{},"security definer"," è ciò che rompe il cerchio. La guida di Supabase lo\ndefinisce come una funzione che gira sotto lo stesso ruolo che ha creato la\nfunzione, e su Supabase quel ruolo è ",[21,159,160],{},"postgres",", che può leggere scavalcando\nle regole.",[150,163,164,169,170,173,174,177],{},[28,165,166],{},[21,167,168],{},"set search_path = ''"," va messo su ognuna di esse. Supabase consiglia di\nmetterlo su ogni funzione security definer e di scrivere i nomi di tabella per\nesteso, perché senza un ",[21,171,172],{},"search_path"," fissato chi chiama può puntare un nome\nnon qualificato a un oggetto suo e farlo girare con i privilegi del\nproprietario della funzione. È per questo che la funzione scrive\n",[21,175,176],{},"public.profiles"," per esteso.",[150,179,180,186],{},[28,181,182,183],{},"Lo schema ",[21,184,185],{},"private"," conta per lo stesso motivo. La guida di Supabase\navverte che una funzione security definer messa in uno schema esposto si può\nchiamare dalla Data API con i privilegi di chi l'ha creata, e ti dice di non\ncrearne mai una in uno schema elencato sotto Exposed schemas nelle\nimpostazioni della tua API.",[150,188,189,194,195,198],{},[28,190,191],{},[21,192,193],{},"(select private.is_admin())",", avvolto in un select suo. Così Postgres\ncalcola la risposta una volta per tutta l'istruzione invece di una volta per\nriga, che è quello che Supabase documenta come motivo per avvolgere\n",[21,196,197],{},"auth.uid()"," allo stesso modo.",[10,200,201,202,205,206,209],{},"Le righe ",[21,203,204],{},"revoke"," e ",[21,207,208],{},"grant"," tengono la funzione richiamabile dagli utenti\nautenticati e da nessun altro.",[10,211,212,213,93],{},"Quella policy copre la lettura. Se il salvataggio comincia a fallire appena le\ntue schermate tornano a riempirsi, hai incontrato\n",[214,215,217],"a",{"href":216},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","un altro messaggio con un'altra causa",[33,219,221],{"id":220},"la-soluzione-che-non-risolve","La soluzione che non risolve",[10,223,224,225,227],{},"Anche disattivare Row Level Security su ",[21,226,48],{}," fa smettere l'errore, con un\nclic, e consegna ogni riga di quella tabella a chiunque abbia la chiave che la\ntua app manda al browser.",[10,229,230],{},"Quella chiave è pensata per essere pubblica. Sta nel codice del tuo sito, e\nchiunque può estrarla in qualche secondo. Quello che finora le impediva di\nrestituire tutta la tua tabella utenti erano le regole che hai appena\ndisattivato.",[95,232],{"alt":233,"caption":234,"src":235},"Due percorsi verso la stessa tabella. Nel primo il lucchetto è ancora al suo posto e una funzione di appoggio accanto restituisce due righe su sei. Nel secondo il posto del lucchetto è solo un contorno tratteggiato vuoto e tutte e sei le righe tornano in rosso.","Entrambe fanno smettere l'errore. Solo una delle due risponde ancora alla domanda che era stata fatta alla regola.","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Ftwo-ways-out-1600x700.png",[10,237,238],{},"La tua app dopo ha lo stesso aspetto in entrambi i casi, ed è questa la parte\nche fa restare la cosa. Niente sulle tue schermate dice quale delle due hai\nscelto, e l'errore è sparito in tutte e due.",[10,240,241],{},"A dirlo è il tuo database, interrogato dall'esterno. Abbiamo scansionato 31.056\napp online fatte con Lovable, Bolt, v0, Replit e gli altri, e visto un progetto\nSupabase dietro 8.435 di esse. Questo è ciò che ha trovato il controllo Row\nLevel Security:",[243,244,245,258],"table",{},[246,247,248],"thead",{},[249,250,251,255],"tr",{},[252,253,254],"th",{},"Che cosa abbiamo chiesto",[252,256,257],{},"App",[259,260,261,270,278,286],"tbody",{},[249,262,263,267],{},[264,265,266],"td",{},"Avevano un progetto Supabase visibile",[264,268,269],{},"8.435",[249,271,272,275],{},[264,273,274],{},"Si è potuto chiederlo",[264,276,277],{},"3.680",[249,279,280,283],{},[264,281,282],{},"Hanno restituito righe a una richiesta senza login",[264,284,285],{},"2.096",[249,287,288,291],{},[264,289,290],{},"Di quelle, da una tabella di persone, ordini o messaggi",[264,292,293],{},"394",[10,295,296],{},"La riga di mezzo è quella onesta. Su 4.755 di quelle app il controllo non ha\navuto risposta, e lo diciamo invece di darle per pulite. E alcune delle 2.096\ndevono essere leggibili, perché una tabella pubblica è una cosa che si può\nvolere davvero; dall'esterno, un menu e un elenco di soci si somigliano.",[10,298,299],{},"Non possiamo dirti quante di quelle tabelle siano state aperte da qualcuno che\nsi stava togliendo di mezzo esattamente questo errore. Possiamo dirti che una\ntabella aperta è il normale punto d'arrivo del consiglio che sta in cima ai\nrisultati di ricerca.",[10,301,302,303,93],{},"Se preferisci non doverci ragionare, la nostra scansione gratuita legge il tuo\nsito online e ti dice quali delle tue tabelle rispondono a uno sconosciuto.\nRichiede una ventina di secondi e non chiede un account:\n",[214,304,306],{"href":305},"\u002Fsecurity-scanner","scansiona la tua app",[10,308,309,310,314],{},"Succede un'altra cosa quando lo disattivi. L'advisor di Supabase comincia a\nsegnalare la tabella, cioè l'avviso\n",[214,311,313],{"href":312},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","RLS disabled in public",", e quell'avviso\nsarà ancora lì fra un mese.",[33,316,318],{"id":317},"come-capire-se-il-cerchio-è-davvero-sparito","Come capire se il cerchio è davvero sparito",[10,320,321],{},"Che l'errore smetta non è la prova, perché a farlo smettere sono due cose\ndiverse.",[10,323,324,325,327,328,331],{},"C'è anche un modo in cui la funzione di appoggio sembra giusta e continua a\nricorrere, e Supabase lo documenta: una funzione security definer scavalca le\nregole solo se il suo proprietario ne ha il diritto. Su Supabase il proprietario\nè ",[21,326,160],{},", che quel privilegio ce l'ha, quindi lo schema qui sopra funziona.\nUna funzione che appartenga a un ruolo senza di esso, o che legga una tabella\nimpostata su ",[21,329,330],{},"force row level security",", ripassa dalla regola e resta nel\ncerchio.",[10,333,334],{},"Due controlli, e falli entrambi:",[10,336,337,340,341,344,345,348,349,352],{},[28,338,339],{},"Scrivi i casi ed eseguili."," La procedura di Supabase è un file ",[21,342,343],{},".sql"," sotto\n",[21,346,347],{},"supabase\u002Ftests\u002F"," che afferma permesso e rifiuto per ogni operazione, per un\nutente autenticato e per uno anonimo, lanciato con ",[21,350,351],{},"supabase test db",". Un admin\ndeve vedere tutti i profili, un membro il suo, uno sconosciuto niente. Finché\nquello non passa, quello che sai è che l'errore ha smesso.",[10,354,355,358,359,363,364,368],{},[28,356,357],{},"Poi chiedi dall'esterno, senza login."," È la domanda che fa il browser di un\nvisitatore, e l'unica che riflette ciò che la tua app distribuisce davvero.\n",[214,360,362],{"href":361},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Se uno sconosciuto può leggere il tuo database","\nci passa attraverso, e\n",[214,365,367],{"href":366},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Row Level Security può essere attivo e la tabella restare pubblica","\ncopre il caso in cui le regole ci sono e lasciano passare tutti lo stesso.",[33,370,372],{"id":371},"quando-la-ricorsione-ti-sta-dicendo-che-lo-schema-è-sbagliato","Quando la ricorsione ti sta dicendo che lo schema è sbagliato",[10,374,375],{},"A volte non c'è una domanda circolare da togliere, perché le due tabelle\ndipendono davvero l'una dall'altra.",[10,377,378,379,382,383,386,387,389,390,392],{},"La guida di Supabase usa la condivisione come esempio: una regola su ",[21,380,381],{},"lists","\ncontrolla ",[21,384,385],{},"list_members"," per vedere con chi la lista è stata condivisa, e una\nregola su ",[21,388,385],{}," controlla ",[21,391,381],{}," per vedere di chi è. La regola di\nogni tabella legge l'altra, e nessuna può andare per prima. Lo stesso helper\nscioglie il nodo, con una funzione che restituisce gli id delle liste a cui chi\nchiama appartiene, e le due regole che interrogano quella funzione invece di\ninterrogarsi a vicenda.",[10,394,395],{},"Il segnale su cui vale la pena fermarsi è quando te ne servono tre o quattro\nperché uno schema stia in piedi. A quel punto l'appartenenza viene ricostruita\ndentro le regole ogni volta, e una sola tabella che dica chiaramente chi può\nvedere cosa di solito richiede meno manutenzione delle regole che stai\nsbrogliando.",[33,397,399],{"id":398},"tenere-la-tabella-chiusa-dopo-averla-sistemata","Tenere la tabella chiusa dopo averla sistemata",[10,401,402,405],{},[28,403,404],{},"Una regola che hai sistemato oggi descrive il database di oggi."," La prossima\npolicy, la prossima tabella e la prossima volta che qualcuno si toglie di mezzo\nun errore a mezzanotte avvengono tutte dopo l'ultima volta che hai guardato, e\nnessuna di esse cambia qualcosa che tu possa vedere sulle tue schermate.",[10,407,408],{},[28,409,410,414],{},[214,411,413],{"href":412},"\u002Fpricing","Reeve Monitor"," rifà alla tua app le stesse domande, a\ncalendario:",[147,416,417,420,427,430],{},[150,418,419],{},"tutti e nove i controlli ogni ora, su un massimo di tre app",[150,421,422,423,426],{},"un messaggio quando un risultato ",[28,424,425],{},"cambia",", così una tabella aperta stanotte non aspetta che te ne accorga",[150,428,429],{},"se l'app risponde, ogni 60 secondi",[150,431,432],{},"un rapporto mensile di quello che ha visto",[10,434,435,443],{},[28,436,437,438,442],{},"Se la tua app tiene i dati in un progetto Supabase tuo,\n",[214,439,441],{"href":440},"\u002Fsupabase-backups","Reeve Care"," ne conserva anche una copia."," Una regola che\nlascia leggere uno sconosciuto è un problema. Una regola che lo lascia scrivere\nè l'altro, e nessun controllo di questo articolo riporta indietro righe\ncancellate.",[147,445,446,449,452,455,458],{},[150,447,448],{},"una copia cifrata del tuo database Supabase ogni notte, tenuta dove il tuo progetto non arriva",[150,450,451],{},"ogni copia verificata prima di contare, contando le righe di ogni tabella",[150,453,454],{},"un ripristino con un clic quando ti serve",[150,456,457],{},"anche i tuoi file caricati, appena colleghi una credenziale Storage",[150,459,460],{},"tutto quello che fa Monitor",[33,462,464],{"id":463},"che-cosa-fare-adesso","Che cosa fare adesso",[466,467,468],"key-takeaways",{},[147,469,470,473,482,488,497],{},[150,471,472],{},"Lascia attivo Row Level Security. L'errore riguarda una regola, e disattivare le regole è una modifica a tutta la tabella.",[150,474,475,476,478,479,481],{},"Sposta il controllo del ruolo in una funzione ",[21,477,156],{}," in uno schema non esposto, con ",[21,480,168],{}," e ogni nome di tabella scritto per esteso.",[150,483,484,485,487],{},"Punta la policy sulla funzione, avvolta come ",[21,486,193],{},", così gira una volta per istruzione e non una volta per riga.",[150,489,490,491,493,494,496],{},"Scrivi i casi permessi e negati sotto ",[21,492,347],{}," e lancia ",[21,495,351],{},": un admin vede tutti i profili, un membro il suo, uno sconosciuto niente.",[150,498,499,500,93],{},"Se hai già disattivato Row Level Security per andare avanti, riattivalo oggi e sistema la regola come si deve. L'advisor di Supabase continuerà a segnalare quella tabella finché non lo fai, e ",[214,501,503],{"href":502},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","va messo su ogni tabella che hai",[10,505,506,507,511],{},"Se vuoi il resto dell'elenco per un'app appena lanciata, la\n",[214,508,510],{"href":509},"\u002Fchecklist","checklist di sicurezza in 10 minuti"," copre questo e le altre cose\nche conviene chiudere prima che qualcuno le trovi.",{"title":23,"searchDepth":513,"depth":513,"links":514},3,[515,517,518,519,520,521,522,523,524],{"id":35,"depth":516,"text":36},2,{"id":65,"depth":516,"text":66},{"id":105,"depth":516,"text":106},{"id":124,"depth":516,"text":125},{"id":220,"depth":516,"text":221},{"id":317,"depth":516,"text":318},{"id":371,"depth":516,"text":372},{"id":398,"depth":516,"text":399},{"id":463,"depth":516,"text":464},"Basi della sicurezza","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcover-1200x630.png","Un pannello di tabella chiuso a chiave, con la propria chiave disegnata dentro, dietro il vetro, e una barra di traverso sulla porta.","\"Infinite recursion detected in policy for relation\" significa che la tua policy ha interrogato la tabella che protegge. Ecco come rompere il cerchio.",false,"md",[532,535,538,541,543],{"q":533,"a":534},"Che cosa provoca \"infinite recursion detected in policy for relation\"?","Una regola su una tabella che deve leggere quella stessa tabella prima di poter rispondere. La tua regola dice più o meno \"fai passare questa persona se la sua riga in profiles dice che è admin\", quindi il database va a leggere quella riga in profiles, il che impone di controllare la regola su profiles, che lo rimanda a leggere di nuovo la riga. Postgres si accorge che sta girando in tondo, si ferma e solleva l'errore 42P17. La stessa cosa succede fra due tabelle le cui regole leggono ciascuna l'altra.",{"q":536,"a":537},"È sicuro usare una funzione security definer in una policy?","Sì, a due condizioni che Supabase enuncia nella sua guida a Row Level Security. Metti search_path alla stringa vuota e scrivi dentro ogni nome di tabella per esteso, quindi public.profiles e non profiles. Senza, qualcuno può puntare un nome non qualificato a un oggetto suo e farlo girare con i privilegi del proprietario della funzione. E crea la funzione in uno schema non esposto sull'API, perché una funzione security definer in uno schema esposto si può chiamare dall'esterno con i privilegi di chi l'ha creata.",{"q":539,"a":540},"Devo disattivare RLS per risolvere?","Fa smettere l'errore e apre la tabella. Con Row Level Security disattivato, ogni riga di quella tabella è leggibile da chiunque abbia la chiave che la tua app manda al browser, e quella chiave chiunque può estrarla dal tuo sito. La tua app si comporta allo stesso modo in entrambi i casi, quindi dopo niente ti dice quale delle due hai scelto. La funzione di appoggio qui sotto fa smettere l'errore e tiene la tabella chiusa.",{"q":106,"a":542},"Perché in profiles di solito sta la risposta a \"chi è questa persona\". Una regola che tratta gli admin in modo diverso, o i membri di un team in modo diverso, deve sapere che cosa è chi sta chiamando, e quel dato è salvato in profiles. Così la regola che protegge profiles finisce per leggere profiles. Qualunque tabella che tenga il ruolo o l'appartenenza di chi chiama può produrlo, e in un'app fatta con Lovable, Bolt o v0 quella tabella di solito è quella che si chiama profiles.",{"q":544,"a":545},"Come controllo che la mia policy funzioni davvero?","Due cose diverse fanno smettere l'errore, quindi l'errore che sparisce da solo dice molto poco. Scrivi i casi permessi e negati in un file .sql sotto supabase\u002Ftests\u002F e lancia supabase test db, che è la procedura che Supabase pubblica insieme alla guida: un proprietario autenticato deve passare e uno sconosciuto deve essere respinto. Poi fai al tuo database la stessa domanda dall'esterno, senza alcun login, come farebbe il browser di un visitatore.","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",[548,549,550,551,552,553,554,555],"infinite recursion detected in policy for relation","supabase infinite recursion policy","infinite recursion rls supabase","errore ricorsione policy supabase","42P17 supabase","loop infinito policy rls","supabase profiles policy ricorsione","errore policy ruolo supabase",{},true,"Infinite recursion detected in policy","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","2026-10-08",{"title":5,"description":528},"blog\u002Finfinite-recursion-in-policy-for-relation",[564,565,566],"\"Infinite recursion detected in policy for relation\" è l'errore 42P17 di Postgres. Una regola Row Level Security su una tabella è andata a fare una domanda a quella stessa tabella, e la domanda non ha fine.","Non è il segno che Row Level Security fosse sbagliato per la tua app. È il segno che una regola ha fatto una domanda circolare.","Una piccola funzione di appoggio legge la tabella fuori dalle regole e rompe il cerchio. Anche disattivare Row Level Security su quella tabella fa smettere l'errore, consegnando ogni riga che contiene a chiunque abbia la chiave che viaggia dentro la tua app.","wLoluJ74On-qMf3q7qZg4A5c1CFdXOIC4xYkMGIpg8E",[569,575,581,587,588,594,600,606,612,618,624,630,636,642,649,655,661,666,672,678,684,690,696,702,708,714,720,726,732,738,744,750,756,761,766,772,778,784,790,796,802,808,814,820,826,832,838,843,849,855,861,867,873,879,884,889,895,901,906,911,917],{"path":570,"title":571,"description":572,"published":573,"category":525,"image":574,"draft":529},"\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":576,"title":577,"description":578,"published":579,"category":525,"image":580,"draft":529},"\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":582,"title":583,"description":584,"published":585,"category":525,"image":586,"draft":529},"\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":559,"title":5,"description":528,"published":560,"category":525,"image":546,"draft":529},{"path":589,"title":590,"description":591,"published":592,"category":525,"image":593,"draft":529},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" su Supabase, e la correzione sbagliata","\"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.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":595,"title":596,"description":597,"published":598,"category":525,"image":599,"draft":529},"\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":601,"title":602,"description":603,"published":604,"category":525,"image":605,"draft":529},"\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":607,"title":608,"description":609,"published":610,"category":525,"image":611,"draft":529},"\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":613,"title":614,"description":615,"published":616,"category":525,"image":617,"draft":529},"\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":619,"title":620,"description":621,"published":622,"category":525,"image":623,"draft":529},"\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":625,"title":626,"description":627,"published":628,"category":525,"image":629,"draft":529},"\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":631,"title":632,"description":633,"published":634,"category":525,"image":635,"draft":529},"\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":637,"title":638,"description":639,"published":640,"category":525,"image":641,"draft":529},"\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":643,"title":644,"description":645,"published":646,"category":647,"image":648,"draft":529},"\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":650,"title":651,"description":652,"published":653,"category":647,"image":654,"draft":529},"\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":656,"title":657,"description":658,"published":659,"category":647,"image":660,"draft":529},"\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":662,"title":663,"description":664,"published":659,"category":525,"image":665,"draft":529},"\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":667,"title":668,"description":669,"published":670,"category":525,"image":671,"draft":529},"\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":673,"title":674,"description":675,"published":676,"category":525,"image":677,"draft":529},"\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":679,"title":680,"description":681,"published":682,"category":647,"image":683,"draft":529},"\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":685,"title":686,"description":687,"published":688,"category":525,"image":689,"draft":529},"\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":691,"title":692,"description":693,"published":694,"category":525,"image":695,"draft":529},"\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":697,"title":698,"description":699,"published":700,"category":525,"image":701,"draft":529},"\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":703,"title":704,"description":705,"published":706,"category":525,"image":707,"draft":529},"\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":709,"title":710,"description":711,"published":712,"category":525,"image":713,"draft":529},"\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":715,"title":716,"description":717,"published":718,"category":525,"image":719,"draft":529},"\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":721,"title":722,"description":723,"published":724,"category":525,"image":725,"draft":529},"\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":727,"title":728,"description":729,"published":730,"category":525,"image":731,"draft":529},"\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":733,"title":734,"description":735,"published":736,"category":647,"image":737,"draft":529},"\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":739,"title":740,"description":741,"published":742,"category":647,"image":743,"draft":529},"\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":745,"title":746,"description":747,"published":748,"category":647,"image":749,"draft":529},"\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":751,"title":752,"description":753,"published":754,"category":525,"image":755,"draft":529},"\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":502,"title":757,"description":758,"published":759,"category":525,"image":760,"draft":529},"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":312,"title":762,"description":763,"published":764,"category":525,"image":765,"draft":529},"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":767,"title":768,"description":769,"published":770,"category":525,"image":771,"draft":529},"\u002Fblog\u002Frotate-supabase-service-role-key","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":773,"title":774,"description":775,"published":776,"category":525,"image":777,"draft":529},"\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":779,"title":780,"description":781,"published":782,"category":525,"image":783,"draft":529},"\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":785,"title":786,"description":787,"published":788,"category":525,"image":789,"draft":529},"\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":791,"title":792,"description":793,"published":794,"category":525,"image":795,"draft":529},"\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":797,"title":798,"description":799,"published":800,"category":525,"image":801,"draft":529},"\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":803,"title":804,"description":805,"published":806,"category":525,"image":807,"draft":529},"\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":809,"title":810,"description":811,"published":812,"category":647,"image":813,"draft":529},"\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":815,"title":816,"description":817,"published":818,"category":525,"image":819,"draft":529},"\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":821,"title":822,"description":823,"published":824,"category":647,"image":825,"draft":529},"\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":827,"title":828,"description":829,"published":830,"category":525,"image":831,"draft":529},"\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":833,"title":834,"description":835,"published":836,"category":525,"image":837,"draft":529},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","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":216,"title":839,"description":840,"published":841,"category":525,"image":842,"draft":529},"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":844,"title":845,"description":846,"published":847,"category":525,"image":848,"draft":529},"\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":850,"title":851,"description":852,"published":853,"category":647,"image":854,"draft":529},"\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":856,"title":857,"description":858,"published":859,"category":647,"image":860,"draft":529},"\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":862,"title":863,"description":864,"published":865,"category":525,"image":866,"draft":529},"\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":868,"title":869,"description":870,"published":871,"category":525,"image":872,"draft":529},"\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":874,"title":875,"description":876,"published":877,"category":647,"image":878,"draft":529},"\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":361,"title":880,"description":881,"published":882,"category":525,"image":883,"draft":529},"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":885,"title":886,"description":887,"published":882,"category":525,"image":888,"draft":529},"\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":890,"title":891,"description":892,"published":893,"category":525,"image":894,"draft":529},"\u002Fblog\u002Fsupabase-new-api-keys","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":896,"title":897,"description":898,"published":899,"category":647,"image":900,"draft":529},"\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":366,"title":902,"description":903,"published":904,"category":525,"image":905,"draft":529},"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":907,"title":908,"description":909,"published":904,"category":647,"image":910,"draft":529},"\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":912,"title":913,"description":914,"published":915,"category":647,"image":916,"draft":529},"\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":918,"title":919,"description":920,"published":915,"category":525,"image":921,"draft":529},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","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",1791705965117]