[{"data":1,"prerenderedAt":801},["ShallowReactive",2],{"blog-it-enable-rls-on-every-supabase-table":3,"blog-index-it":562},{"id":4,"title":5,"body":6,"category":518,"cover":519,"coverAlt":520,"description":521,"draft":522,"extension":523,"faq":524,"image":540,"keywords":541,"meta":550,"navigation":551,"ogTitle":552,"path":553,"published":554,"seo":555,"stem":556,"tldr":557,"updated":554,"__hash__":561},"blog_it\u002Fblog\u002Fenable-rls-on-every-supabase-table.md","Attiva Row Level Security su ogni tabella Supabase, poi verificalo",{"type":7,"value":8,"toc":506},"minimark",[9,13,21,26,29,32,39,45,48,52,55,58,69,80,86,89,95,98,114,118,121,127,133,159,165,171,174,180,186,193,276,288,292,295,298,303,306,309,315,319,322,325,328,334,343,346,350,353,359,366,371,392,405,412,416,419,422,434,437,440,452,456,493],[10,11,12],"p",{},"Ti hanno detto di attivare Row Level Security, oppure il tuo costruttore di IA\nl'ha nominato di sfuggita mentre sistemava altro. Il tuo progetto Supabase ha da\nqualche parte fra quattro e quaranta tabelle, e non sai quali siano coperte.",[10,14,15,16,20],{},"L'istruzione che trovi ovunque è una riga di SQL per tabella, e fin lì è giusta.\nQuello davanti a cui quasi ogni guida si ferma è il passo dopo. ",[17,18,19],"strong",{},"Una policy che\nesiste non è una policy che funziona",", e niente nella tua dashboard ti mostrerà\nla differenza. Quindi attivare Row Level Security su Supabase sono tre lavori e\nnon uno: mettere il flag su tutte le tabelle, scrivere le due o tre policy che\nrimettono in piedi la tua app, e poi chiedere al tuo database quello che gli\nchiederebbe uno sconosciuto.",[22,23,25],"h2",{"id":24},"cosa-fa-davvero-attivare-row-level-security","Cosa fa davvero attivare Row Level Security?",[10,27,28],{},"Fa consultare a Postgres le tue regole prima che consegni una riga. Con il flag\nspento non ci sono regole da consultare, quindi la risposta a ogni richiesta è\ntutto.",[10,30,31],{},"Immagina un bibliotecario che va a prendere quello che chiedi. Row Level\nSecurity è l'istruzione di leggere un biglietto su di te prima di riempire il\ncarrello. Il biglietto è la tua policy, e può dire che questa persona può\nprendere i libri che ha scritto, oppure che chiunque può prendere qualunque\ncosa. Con l'istruzione in vigore e nessun biglietto ancora scritto, il\nbibliotecario torna con il carrello vuoto e non spiega perché.",[10,33,34,35,38],{},"È proprio quest'ultima parte a far inciampare, e decide che aspetto avrà una\nverifica più avanti. ",[17,36,37],{},"Row Level Security filtra le righe. Non rifiuta le\nrichieste."," Una tabella che non hai il permesso di leggere risponde con un\nelenco vuoto e un codice di successo, non con un errore né con una schermata di\naccesso. Alla tua app non viene mai detto che è stata respinta. Non riceve nulla\ne disegna una schermata bianca.",[40,41],"diagram",{"alt":42,"caption":43,"src":44},"La stessa richiesta disegnata tre volte. Con l'interruttore di sicurezza spento tornano quattro righe accese. Con l'interruttore acceso e nessuna policy torna uno spazio tratteggiato vuoto. Con l'interruttore acceso e una policy di proprietà torna una sola riga accesa. Tutti e tre i ritorni sono contrassegnati 200.","Una richiesta, tre configurazioni e lo stesso codice di successo ogni volta. Row Level Security cambia cosa torna, mai se la richiesta è andata a buon fine.","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fsame-request-three-answers-1600x780.png",[10,46,47],{},"Quindi mettere il flag su un progetto che non ha ancora nessuna policy non\nchiude fuori gli sconosciuti dai tuoi dati. Chiude fuori tutti, la tua app\ncompresa, finché non dici chi può vedere cosa.",[22,49,51],{"id":50},"come-attivo-rls-su-tutte-le-tabelle-supabase-in-una-volta","Come attivo RLS su tutte le tabelle Supabase in una volta?",[10,53,54],{},"Un ciclo, eseguito una volta nel SQL Editor. Percorre ogni tabella del tuo schema\npublic e mette il flag ovunque sia spento.",[10,56,57],{},"Parti dal vedere a che punto sei. Questo elenca le tue tabelle e dice se ognuna\nce l'ha adesso:",[59,60,65],"pre",{"className":61,"code":63,"language":64},[62],"language-text","select tablename, rowsecurity\nfrom pg_tables\nwhere schemaname = 'public'\norder by tablename;\n","text",[66,67,63],"code",{"__ignoreMap":68},"",[10,70,71,72,75,76,79],{},"Ogni riga in cui ",[66,73,74],{},"rowsecurity"," dice ",[66,77,78],{},"false"," è una tabella che consegna il suo\ncontenuto a chiunque abbia la chiave pubblicabile che viaggia con la tua app. Se\nquell'elenco è corto, falle una alla volta e guarda cosa si rompe:",[59,81,84],{"className":82,"code":83,"language":64},[62],"alter table public.orders enable row level security;\n",[66,85,83],{"__ignoreMap":68},[10,87,88],{},"Se non è corto, questo se ne occupa tutto:",[59,90,93],{"className":91,"code":92,"language":64},[62],"do $$\ndeclare t record;\nbegin\n  for t in\n    select tablename from pg_tables where schemaname = 'public'\n  loop\n    execute format(\n      'alter table public.%I enable row level security', t.tablename\n    );\n  end loop;\nend $$;\n",[66,94,92],{"__ignoreMap":68},[10,96,97],{},"Esegui quello e la tua app diventa bianca. Supabase lo dice chiaramente nella\nsua documentazione: i dati diventano irraggiungibili attraverso l'API con una\nchiave pubblicabile finché non vengono definite delle policy. È il flag che fa\nil suo mestiere, ed è il motivo per cui la sezione successiva è quella da tenere\naperta prima di premere esegui.",[99,100,102],"callout",{"type":101},"warn",[10,103,104,107,108,113],{},[17,105,106],{},"Le tabelle che ha fatto il tuo costruttore sono quelle che erano aperte."," Una\ntabella creata a clic dal Table Editor di Supabase arriva con Row Level Security\nattivo. Una tabella creata eseguendo SQL no, ed eseguire SQL è il modo in cui\nLovable, Bolt, Cursor e v0 creano tabelle per te. Le tabelle che non hai mai\nvisto nascere sono esattamente quelle per cui questo ciclo esiste, e\n",[109,110,112],"a",{"href":111},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","cosa prende e cosa non prende l'avviso \"RLS disabled in public\"","\nspiega perché la tua dashboard può essere rimasta zitta su di loro.",[22,115,117],{"id":116},"le-tre-policy-che-ti-servono-davvero","Le tre policy che ti servono davvero",[10,119,120],{},"Quasi ogni tabella in un'app come la tua ha una di tre forme: righe che\nappartengono a una persona, righe che chiunque può leggere e righe che la tua app\nscrive per conto di un visitatore. Eccole tutte, pronte da incollare e\nrinominare.",[10,122,123,126],{},[17,124,125],{},"Righe che appartengono a una persona."," Ordini, messaggi, elementi salvati,\nqualsiasi cosa con un proprietario.",[59,128,131],{"className":129,"code":130,"language":64},[62],"create policy \"read own orders\"\non public.orders for select\nto authenticated\nusing ( (select auth.uid()) = user_id );\n",[66,132,130],{"__ignoreMap":68},[10,134,135,138,139,142,143,146,147,150,151,154,155,158],{},[66,136,137],{},"auth.uid()"," è l'id di chi ha fatto l'accesso su quella richiesta. ",[66,140,141],{},"user_id"," è\nla colonna della tua tabella che registra il proprietario, quindi controlla il\nnome prima di eseguirlo: i costruttori scrivono anche ",[66,144,145],{},"owner_id",", ",[66,148,149],{},"profile_id"," e\n",[66,152,153],{},"created_by",". La riga ",[66,156,157],{},"to authenticated"," significa che la policy non viene\nnemmeno presa in considerazione per un visitatore senza accesso, ed è quello che\ntiene la tabella chiusa al pubblico.",[10,160,161,164],{},[17,162,163],{},"Righe che chiunque può leggere."," Un catalogo prodotti, articoli pubblicati,\nuna mappa di locali.",[59,166,169],{"className":167,"code":168,"language":64},[62],"create policy \"anyone may read products\"\non public.products for select\nto anon, authenticated\nusing ( true );\n",[66,170,168],{"__ignoreMap":68},[10,172,173],{},"Scrivi questa di proposito oppure non scriverla, perché è anche la policy a cui\nun costruttore di IA si aggrappa nel momento in cui gli chiedi di sistemare una\nschermata vuota. La domanda da risolvere prima: questa tabella potrebbe essere\nuna pagina del tuo sito, esattamente com'è, senza togliere niente? Un no vuol\ndire che vuole la policy di proprietà qui sopra.",[10,175,176,179],{},[17,177,178],{},"Righe che la tua app scrive."," Leggere e scrivere sono permessi separati in\nPostgres, quindi una tabella su cui la tua app salva ha bisogno di una seconda\npolicy, e questa controlla la riga in entrata e non in uscita.",[59,181,184],{"className":182,"code":183,"language":64},[62],"create policy \"insert own orders\"\non public.orders for insert\nto authenticated\nwith check ( (select auth.uid()) = user_id );\n",[66,185,183],{"__ignoreMap":68},[10,187,188,189,192],{},"Quale clausola va dove è la parte che frega, e la riga ",[66,190,191],{},"update"," porta un\nrequisito che non ha nulla di ovvio:",[194,195,196,212],"table",{},[197,198,199],"thead",{},[200,201,202,206,209],"tr",{},[203,204,205],"th",{},"Operazione",[203,207,208],{},"Clausola",[203,210,211],{},"Richiede anche",[213,214,215,230,244,263],"tbody",{},[200,216,217,223,228],{},[218,219,220],"td",{},[66,221,222],{},"select",[218,224,225],{},[66,226,227],{},"using",[218,229],{},[200,231,232,237,242],{},[218,233,234],{},[66,235,236],{},"insert",[218,238,239],{},[66,240,241],{},"with check",[218,243],{},[200,245,246,250,257],{},[218,247,248],{},[66,249,191],{},[218,251,252,254,255],{},[66,253,227],{}," e ",[66,256,241],{},[218,258,259,260,262],{},"una policy ",[66,261,222],{}," sulla stessa tabella",[200,264,265,270,274],{},[218,266,267],{},[66,268,269],{},"delete",[218,271,272],{},[66,273,227],{},[218,275],{},[10,277,278,279,282,283,287],{},"La documentazione di Supabase è esplicita sull'ultima: senza una policy di\nselect corrispondente, un update non funziona come ti aspetti. E se il messaggio\n",[66,280,281],{},"new row violates row-level security policy"," è quello che ti ha messo a cercare,\nla distanza fra quelle due clausole è\n",[109,284,286],{"href":285},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","tutto quell'errore",".",[22,289,291],{"id":290},"perché-ogni-esempio-scrive-select-authuid-invece-di-authuid","Perché ogni esempio scrive (select auth.uid()) invece di auth.uid()",[10,293,294],{},"Perché le parentesi fanno calcolare il valore a Postgres una volta per tutta la\nquery invece di una volta per ogni riga che guarda.",[10,296,297],{},"La versione avvolta diventa quello che Postgres chiama un initPlan: eseguito una\nsola volta e poi riusato per il resto dell'istruzione. Senza le parentesi la\nfunzione viene richiamata alla riga uno, alla riga due, alla riga tre, e giù così\nper una tabella che potrebbe contenerne centomila. Il Performance Advisor di\nSupabase segnala la versione senza parentesi sotto una regola chiamata Auth RLS\nInitialization Plan, ed è una delle voci che la gente ci trova più spesso.",[40,299],{"alt":300,"caption":301,"src":302},"Due pannelli sopra le stesse otto righe di tabella. Nel pannello di sinistra un segno di funzione sta accanto a ogni riga con il proprio collegamento, otto in tutto. Nel pannello di destra un solo segno di funzione in alto si apre a ventaglio verso tutte e otto le righe insieme.","Le parentesi sono tutta la differenza. A sinistra la funzione gira una volta per riga; a destra gira una volta e la risposta viene riusata.","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fonce-per-query-1600x620.png",[10,304,305],{},"Un'avvertenza, ed è di Supabase stessa: funziona perché la risposta non cambia da\nuna riga all'altra. Una funzione il cui risultato dipende davvero dalla riga che\nha davanti non si può tirare fuori dal ciclo, quindi quella lasciala senza\nparentesi.",[10,307,308],{},"Già che ci sei, aggiungi un indice sulla colonna su cui filtrano le tue policy.\nLa policy diventa una condizione a ogni lettura di quella tabella, quindi su una\ntabella con tante righe una colonna senza indice si vede nei tuoi tempi di\nrisposta:",[59,310,313],{"className":311,"code":312,"language":64},[62],"create index orders_user_id_idx on public.orders (user_id);\n",[66,314,312],{"__ignoreMap":68},[22,316,318],{"id":317},"testare-una-policy-senza-fabbricare-un-account-finto","Testare una policy senza fabbricare un account finto",[10,320,321],{},"Il SQL Editor di Supabase può eseguire una query come se l'avesse mandata un\nvisitatore preciso, e questo copre del tutto il caso anonimo.",[10,323,324],{},"L'editor porta un controllo per il ruolo con cui una query deve girare. Mettilo\nsul ruolo anonimo, poi lancia un normale select sulla tabella che hai appena\ncambiato. Quello che torna è quello che riceve uno sconosciuto senza accesso.\nPer un visitatore con accesso prendi l'id di un utente che hai già invece di\ncrearne uno nuovo; qualsiasi riga nella tua tabella basta per la prova.",[10,326,327],{},"Se preferisci digitare invece che cliccare, la stessa cosa in SQL:",[59,329,332],{"className":330,"code":331,"language":64},[62],"begin;\nset local role anon;\nselect * from public.orders;\nrollback;\n",[66,333,331],{"__ignoreMap":68},[10,335,336,254,339,342],{},[66,337,338],{},"begin",[66,340,341],{},"rollback"," stanno lì perché il cambio di ruolo duri quel blocco e non\ndi più, cosa che conta se stai passando in rassegna più tabelle di seguito.",[10,344,345],{},"Quello che questo ti dice è cosa fanno le tue policy dentro il database. Quello\nche non può dirti è cosa il tuo progetto consegna a internet, perché la richiesta\nche i tuoi visitatori fanno davvero non parte dal SQL Editor. Parte da un\nbrowser, porta una chiave pubblicabile e arriva attraverso l'indirizzo pubblico\ndel tuo progetto.",[22,347,349],{"id":348},"come-testo-lrls-di-supabase-da-fuori-la-mia-app","Come testo l'RLS di Supabase da fuori la mia app?",[10,351,352],{},"Manda la richiesta che manderebbe uno sconosciuto. Ti servono due valori ed\nentrambi stanno già nel codice che il tuo sito serve a ogni visitatore: l'URL del\ntuo progetto e la tua chiave pubblicabile.",[59,354,357],{"className":355,"code":356,"language":64},[62],"curl \"https:\u002F\u002FYOUR-PROJECT.supabase.co\u002Frest\u002Fv1\u002Forders?select=*&limit=1\" \\\n  -H \"apikey: YOUR_PUBLISHABLE_KEY\" \\\n  -H \"Authorization: Bearer YOUR_PUBLISHABLE_KEY\"\n",[66,358,356],{"__ignoreMap":68},[10,360,361,362,365],{},"Sostituisci un nome di tabella alla volta e leggi cosa torna. Un elenco vuoto,\n",[66,363,364],{},"[]",", vuol dire che la policy ha tenuto per un visitatore senza accesso. Una riga\nvuol dire che chiunque abbia una chiave che viaggia con la tua app può leggere\nquella tabella. Un errore che nomina la chiave stessa vuol dire che hai copiato\nil valore sbagliato, e conviene escluderlo prima di concludere qualsiasi cosa.",[40,367],{"alt":368,"caption":369,"src":370},"Un confine tratteggiato attorno a una tabella di database. Dentro, una lente sta accanto alla tabella con una freccia corta. Fuori, una persona manda una freccia che porta una chiave attraverso una fessura nel confine, con il percorso barra rest barra v1 scritto accanto alla fessura, e raggiunge la stessa tabella.","La prova nell'editor non esce mai dall'edificio. La richiesta da fuori arriva attraverso lo stesso indirizzo pubblico che usano i tuoi visitatori, con la stessa chiave che la tua app spedisce.","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Ftwo-tests-one-table-1600x640.png",[10,372,373,374,377,378,381,382,386,387,391],{},"Su un progetto Supabase recente quella chiave inizia con ",[66,375,376],{},"sb_publishable_",", e su\nuno più vecchio è la chiave ",[66,379,380],{},"anon",". Entrambe si possono usare così senza rischio\ne stare senza rischio nella tua app, è il loro scopo;\n",[109,383,385],{"href":384},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","quali chiavi API stanno in un frontend","\ncopre la coppia che non ci sta, e\n",[109,388,390],{"href":389},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","dove trovarle nella dashboard"," sono i\nquattro valori su quella pagina di impostazioni.",[10,393,394,395,399,400,404],{},"Questa è la prova che somiglia alla realtà, e averla passata su larga scala è il\nmotivo per cui sappiamo quanto è diffuso il divario. Fra il 12 e il 14 agosto\n2026 abbiamo passato nove controlli esterni su 30.998 app in produzione\npubblicate da Lovable, Base44, Replit, v0 e Bolt. Delle 3.680 app con Supabase in\ncui il controllo è arrivato in fondo, 2.096 hanno risposto a una richiesta\nanonima con righe da almeno una tabella. Fa 57%, ed è una quota delle app che ci\nhanno dato una risposta netta, non di tutto quello che abbiamo scansionato. Il\n",[109,396,398],{"href":397},"\u002Fresearch\u002Fvibe-coded-app-security-2026","set di dati completo è pubblicato",", e\n",[109,401,403],{"href":402},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","di cosa è una quota quel 57%","\nripercorre il conteggio.",[10,406,407,408,287],{},"Farlo a mano va bene con quattro tabelle e diventa noioso con quaranta. La nostra\nscansione gratuita manda quella richiesta al posto tuo, scopre quali tabelle\nesistono senza che tu le nomini e ti dice quali hanno risposto, accanto ad altri\notto controlli che fa da fuori. Legge il tuo sito in produzione come può farlo\nqualsiasi visitatore, ci mette circa 20 secondi e non richiede un account:\n",[109,409,411],{"href":410},"\u002Fsecurity-scanner","scansiona la tua app",[22,413,415],{"id":414},"prima-di-riscrivere-policy-su-una-tabella-in-produzione","Prima di riscrivere policy su una tabella in produzione",[10,417,418],{},"Prendi prima una copia del tuo database. Stai per cambiare i permessi su ogni\ntabella che hai, con gli stessi strumenti che hanno prodotto il problema.",[10,420,421],{},"Vale la pena separare due rischi diversi, perché solo uno riguarda il lavoro di\noggi. Se una tabella era leggibile e scrivibile da chiunque, stringerla adesso\nnon cambia nulla di quello che è già successo, e quella versione salta fuori di\nsolito come un messaggio di assistenza su dati che sono cambiati da soli.\nL'altro rischio è la migrazione in sé. Una policy cancellata e ricreata un po'\nstorta è un martedì qualunque, e la via del ritorno è una copia di com'erano le\ncose un'ora fa.",[10,423,424,425,429,430,287],{},"Su un piano Supabase a pagamento la copia di stanotte aspetta nella console. Sul\npiano gratuito non c'è proprio nulla su cui ripiegare, perché\n",[109,426,428],{"href":427},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Supabase non fa nessun backup automatico sul piano gratuito",".\nSe è il tuo caso,\n",[109,431,433],{"href":432},"\u002Fblog\u002Fback-up-supabase-free-tier","prendine uno prima di iniziare",[10,435,436],{},"Reeve Care è la versione di tutto questo che non devi ricordarti. Il tuo database\nSupabase viene copiato secondo un calendario, tenuto fuori dal tuo account\nSupabase, cifrato, e riletto per confermare che si ripristina prima che la data\nsulla tua dashboard si muova. I file caricati dai tuoi utenti viaggiano con lui\nappena colleghi una chiave Storage, e quella chiave si chiede a parte perché\nSupabase non emette nessuna chiave in sola lettura per i file: quella che copia i\ntuoi caricamenti può anche scrivere, quella che copia il tuo database no.\nCollegarla è facoltativo e il tuo database viene salvato in ogni caso. I backup\nsono solo di Supabase, quindi se i tuoi dati stanno altrove lo diciamo invece di\nvenderti un abbonamento che sorveglia una scatola vuota.",[10,438,439],{},"Il ripristino è la parte che conta in un giorno come questo. Care copia lo stato\nattuale del tuo database prima di rigiocare la versione che hai scelto, quindi\npremere il pulsante ha un annulla tutto suo.",[10,441,442,443,447,448,287],{},"L'altra metà è il controllo che hai appena fatto a mano. Una policy che si\nallenta durante una migrazione successiva non è una cosa che si trova\nguardandola, quindi Care rilancia la stessa richiesta anonima secondo un\ncalendario e ti dice quando una tabella comincia a rispondere mentre la settimana\nscorsa era zitta. Il monitoraggio dell'uptime e un report mensile stanno nello\nstesso abbonamento. Niente di tutto questo scrive le tue policy al posto tuo, e\nnessun backup chiude una tabella aperta. Quello che cambia è quanto ti costa una\nmigrazione andata storta.\n",[109,444,446],{"href":445},"\u002Fsupabase-backups","Cosa Reeve salva su Supabase, ogni quanto, e cosa fa un ripristino","\npercorre tutto il ciclo, e i piani sono sulla\n",[109,449,451],{"href":450},"\u002Fpricing","pagina prezzi",[22,453,455],{"id":454},"lordine-in-cui-lavorare","L'ordine in cui lavorare",[457,458,459],"key-takeaways",{},[460,461,462,470,473,480,490],"ul",{},[463,464,465,466,469],"li",{},"Elenca le tue tabelle con ",[66,467,468],{},"select tablename, rowsecurity from pg_tables where schemaname = 'public'"," e guarda quante sono aperte prima di cambiare qualsiasi cosa.",[463,471,472],{},"Prendi un backup, poi attiva Row Level Security su ogni tabella dello schema public. Aspettati che la tua app diventi bianca; è il flag che lavora.",[463,474,475,476,479],{},"Dai a ogni tabella una delle tre policy. La proprietà è il caso normale; ",[66,477,478],{},"USING (true)"," è una decisione che prendi tabella per tabella, non un modo per riavere le schermate.",[463,481,482,483,486,487,489],{},"Scrivi ",[66,484,485],{},"(select auth.uid())"," invece di ",[66,488,137],{},", e indicizza la colonna su cui filtrano le tue policy.",[463,491,492],{},"Prova ogni tabella da fuori e senza accesso. Un elenco vuoto è promosso. Una riga è una tabella che chiunque può leggere, qualunque cosa dica la tua dashboard.",[10,494,495,496,500,501,505],{},"Comincia dalla tabella che ti imbarazzerebbe di più come pagina pubblica, e\nscendi da lì. La\n",[109,497,499],{"href":498},"\u002Fchecklist","checklist di sicurezza in 10 minuti"," copre questo insieme al resto\ndi quello che vale la pena confermare in un'app appena lanciata, e la\n",[109,502,504],{"href":503},"\u002Fis-your-supabase-app-safe","guida alla sicurezza di Supabase"," passa in rassegna\ncos'altro tende a restare aperto.",{"title":68,"searchDepth":507,"depth":507,"links":508},3,[509,511,512,513,514,515,516,517],{"id":24,"depth":510,"text":25},2,{"id":50,"depth":510,"text":51},{"id":116,"depth":510,"text":117},{"id":290,"depth":510,"text":291},{"id":317,"depth":510,"text":318},{"id":348,"depth":510,"text":349},{"id":414,"depth":510,"text":415},{"id":454,"depth":510,"text":455},"Basi della sicurezza","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcover-1200x630.png","Un elenco di tabelle di database in un pannello, ognuna con un interruttore di sicurezza accanto, e la maggior parte ancora spenti.","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.",false,"md",[525,528,531,534,537],{"q":526,"a":527},"Cosa succede se attivo RLS e non scrivo nessuna policy?","La tabella smette di rispondere, anche alla tua app. Con il flag attivo, Postgres consulta le tue policy prima di consegnare una riga, e senza policy non c'è nulla che possa dire di sì, quindi le richieste tornano vuote. Supabase lo documenta direttamente: i dati diventano irraggiungibili attraverso l'API con una chiave pubblicabile finché non vengono definite delle policy. Non viene cancellato nulla e non si rompe nulla. Scrivi una policy per le righe che la tua app deve mostrare e le schermate tornano.",{"q":529,"a":530},"Row Level Security rallenta le mie query?","Può farlo, e le due correzioni sono piccole. Scrivi `(select auth.uid())` nella condizione della policy, con le parentesi, così Postgres calcola il valore una volta per tutta la query e poi lo riusa su ogni riga. Supabase segnala la versione senza parentesi nel suo Performance Advisor, sotto una regola chiamata Auth RLS Initialization Plan. Poi aggiungi un indice sulla colonna su cui filtra la policy, di solito `user_id`. Su una tabella da qualche migliaio di righe difficilmente noterai la differenza. Su una grande contano entrambe.",{"q":532,"a":533},"Mi serve RLS se la mia tabella non contiene dati personali?","Lo vuoi attivo lo stesso, e la policy può essere quella permissiva. Una tabella con Row Level Security spento è leggibile da chiunque abbia la chiave pubblicabile che viaggia con la tua app, il che va bene per un catalogo prodotti e molto meno bene per qualsiasi cosa non pubblicheresti come pagina. Attivarlo e scrivere una policy di lettura con `USING (true)` ti dà lo stesso accesso pubblico, ma di proposito, e la tabella si legge come decisa invece che come dimenticata la prossima volta che qualcuno ripassa l'elenco.",{"q":535,"a":536},"Perché la mia sottoscrizione realtime ha smesso di funzionare dopo aver attivato RLS?","Perché Realtime consulta le stesse policy prima di mandare una modifica a chi è iscritto. Una tabella con Row Level Security attivo e senza policy di select per quel visitatore non consegna righe a una query né modifiche a una sottoscrizione, esattamente per lo stesso motivo. Aggiungi la policy di select che serve a quella sottoscrizione e il flusso riprende. Se usi Realtime broadcast o presence invece delle modifiche al database, quelli sono autorizzati a parte, tramite policy scritte sulla tabella `realtime.messages`.",{"q":538,"a":539},"Come faccio a testare una policy senza creare un utente finto?","In due modi, e nessuno dei due richiede un account nuovo. Il SQL Editor di Supabase può eseguire una query come se l'avesse mandata un ruolo preciso, e questo copre del tutto il caso anonimo: quello che torna è quello che riceve uno sconosciuto. Per il caso con login serve un id utente che faccia da controfigura, e va bene qualsiasi riga già presente nella tua tabella. Il secondo modo è una richiesta da fuori che porta la tua chiave pubblicabile, e verifica tutto il percorso e non solo la policy.","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",[542,543,544,545,546,547,548,549],"attivare row level security supabase","supabase attivare rls","row level security policies supabase","esempio policy rls supabase","supabase rls select auth.uid","testare rls supabase","supabase rls best practices","auth.uid() policy",{},true,"Attiva Row Level Security su ogni tabella Supabase","\u002Fblog\u002Fenable-rls-on-every-supabase-table","2026-09-10",{"title":5,"description":521},"blog\u002Fenable-rls-on-every-supabase-table",[558,559,560],"Attivare Row Level Security su Supabase senza una policy chiude del tutto una tabella, e scrivere una policy senza attivare il flag non fa proprio nulla. Ogni tabella ha bisogno di entrambe le cose.","Tre forme di policy coprono quasi tutto quello che crea un costruttore di IA: righe che appartengono a una persona, righe che chiunque può leggere e righe che la tua app scrive per conto di un visitatore.","Poi verifica da fuori la tua app e senza login, perché quella è la richiesta che fa uno sconosciuto, ed è l'unica che ti dice cosa fanno le tue policy invece di cosa dicono.","__x64S9NqVvuyqX_TVlZUEBwvbLZ9ULLlnPUoZP9uuQ",[563,570,576,582,588,594,600,606,612,618,624,630,636,642,643,648,654,660,666,672,678,684,690,696,702,707,713,718,723,729,735,741,747,753,759,764,769,775,780,786,791,797],{"path":564,"title":565,"description":566,"published":567,"category":568,"image":569,"draft":522},"\u002Fblog\u002Fsupabase-backup-auth-users","Perché nel tuo dump Supabase non ci sono utenti","Lancia supabase db dump da solo e ottieni la forma del tuo database e nessuna delle sue righe, senza lo schema auth in cui vivono i tuoi utenti.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":571,"title":572,"description":573,"published":574,"category":518,"image":575,"draft":522},"\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":577,"title":578,"description":579,"published":580,"category":518,"image":581,"draft":522},"\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":583,"title":584,"description":585,"published":586,"category":518,"image":587,"draft":522},"\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":589,"title":590,"description":591,"published":592,"category":518,"image":593,"draft":522},"\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":595,"title":596,"description":597,"published":598,"category":518,"image":599,"draft":522},"\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":601,"title":602,"description":603,"published":604,"category":518,"image":605,"draft":522},"\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":607,"title":608,"description":609,"published":610,"category":518,"image":611,"draft":522},"\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":613,"title":614,"description":615,"published":616,"category":518,"image":617,"draft":522},"\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":619,"title":620,"description":621,"published":622,"category":568,"image":623,"draft":522},"\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":625,"title":626,"description":627,"published":628,"category":568,"image":629,"draft":522},"\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":631,"title":632,"description":633,"published":634,"category":568,"image":635,"draft":522},"\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":637,"title":638,"description":639,"published":640,"category":518,"image":641,"draft":522},"\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":553,"title":5,"description":521,"published":554,"category":518,"image":540,"draft":522},{"path":111,"title":644,"description":645,"published":646,"category":518,"image":647,"draft":522},"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":649,"title":650,"description":651,"published":652,"category":518,"image":653,"draft":522},"\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":655,"title":656,"description":657,"published":658,"category":518,"image":659,"draft":522},"\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":661,"title":662,"description":663,"published":664,"category":518,"image":665,"draft":522},"\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":667,"title":668,"description":669,"published":670,"category":518,"image":671,"draft":522},"\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":673,"title":674,"description":675,"published":676,"category":518,"image":677,"draft":522},"\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":679,"title":680,"description":681,"published":682,"category":518,"image":683,"draft":522},"\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":685,"title":686,"description":687,"published":688,"category":518,"image":689,"draft":522},"\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":691,"title":692,"description":693,"published":694,"category":568,"image":695,"draft":522},"\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":697,"title":698,"description":699,"published":700,"category":518,"image":701,"draft":522},"\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":432,"title":703,"description":704,"published":705,"category":568,"image":706,"draft":522},"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":708,"title":709,"description":710,"published":711,"category":518,"image":712,"draft":522},"\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":389,"title":714,"description":715,"published":716,"category":518,"image":717,"draft":522},"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":285,"title":719,"description":720,"published":721,"category":518,"image":722,"draft":522},"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":724,"title":725,"description":726,"published":727,"category":518,"image":728,"draft":522},"\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":730,"title":731,"description":732,"published":733,"category":568,"image":734,"draft":522},"\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":736,"title":737,"description":738,"published":739,"category":568,"image":740,"draft":522},"\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":742,"title":743,"description":744,"published":745,"category":518,"image":746,"draft":522},"\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":748,"title":749,"description":750,"published":751,"category":518,"image":752,"draft":522},"\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":754,"title":755,"description":756,"published":757,"category":568,"image":758,"draft":522},"\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":402,"title":760,"description":761,"published":762,"category":518,"image":763,"draft":522},"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":765,"title":766,"description":767,"published":762,"category":518,"image":768,"draft":522},"\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":770,"title":771,"description":772,"published":773,"category":518,"image":774,"draft":522},"\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":427,"title":776,"description":777,"published":778,"category":568,"image":779,"draft":522},"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":781,"title":782,"description":783,"published":784,"category":518,"image":785,"draft":522},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security è attivo. La tabella resta pubblica.","Attivare Supabase Row Level Security non protegge una tabella. Lo fanno le policy, e quella che ha rimesso in piedi la tua app può far entrare chiunque.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":787,"title":788,"description":789,"published":784,"category":568,"image":790,"draft":522},"\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":792,"title":793,"description":794,"published":795,"category":568,"image":796,"draft":522},"\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":384,"title":798,"description":799,"published":795,"category":518,"image":800,"draft":522},"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",1790150956061]