Vai al contenuto

Basi della sicurezza

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ì.

Vlad Tkachenko8 min di lettura

In breve

  • Chiunque può leggere il tuo database Supabase senza fare login? Su 2.096 delle 3.680 app in cui il controllo è arrivato in fondo (il 57%), almeno una tabella ha risposto di sì.
  • Non è automaticamente una fuga di dati. Alcune tabelle devono essere pubbliche. Ma 394 di quelle app avevano aperta una tabella con un nome da persone: users, profiles, customers, orders.
  • La cosa di cui si viene messi in guardia di continuo, una chiave segreta lasciata nell'app, è comparsa 3 volte su 30.998 app. La tabella aperta è il caso comune.

La tua app ha una schermata di login. Dietro ci sono i tuoi utenti, i loro messaggi, forse i loro ordini. Sembra roba privata, e non esiste un modo ovvio per scoprire se lo è davvero, perché la console di Supabase non è un posto in cui tu abbia mai avuto bisogno di entrare.

Così siamo andati a misurarlo sulle app degli altri. Ad agosto 2026 abbiamo scansionato 30.998 app online pubblicate da Lovable, Base44, Replit, v0 e Bolt, facendo a ciascuna una sola domanda: chiunque può leggere il tuo database Supabase senza fare login?

Per 2.096 delle 3.680 app da cui abbiamo ottenuto una risposta netta, sì.

Ed ecco la parte che sbagliano sia la versione allarmante di questa storia sia quella rassicurante. Una tabella aperta non è automaticamente una fuga di dati: moltissime tabelle sono fatte per essere lette da tutti. Quale tabella sia decide tutto, e a quella domanda può rispondere solo chi ha costruito l'app. Ed è anche il motivo per cui nessuno se ne accorge: l'app funziona benissimo in entrambi i casi.

Chiunque può leggere il tuo database Supabase?

Per più della metà delle app che abbiamo potuto controllare, sì: almeno una tabella ha restituito righe a una richiesta che non portava alcun login.

Che questo sia possibile non c'entra nulla con qualcosa di rotto. La tua app parla con Supabase dal browser di chi la visita, quindi porta con sé una chiave che ogni visitatore può leggere, e quella chiave è fatta per essere pubblica. Nomina il tuo progetto. Da sola non concede niente.

A decidere se uno sconosciuto ottiene i tuoi dati è Row Level Security: una regola su ogni tabella che dice chi può leggere quali righe. Senza regola, la chiave è l'unica cosa fra internet e quella tabella, e la chiave è scritta nella tua pagina.

È questo che stavamo misurando. Non se una chiave fosse visibile (lo è sempre), ma cosa fa il database quando qualcuno la usa.

Di cosa è una quota quel 57%

Di una base che abbiamo ristretto tre volte, e il restringimento conta più del titolo.

Cosa abbiamo contatoApp
App online scansionate e classificate30.998
Nominano un progetto Supabase nella pagina8.435
Tabella confermata e risposta ottenuta3.680
Almeno una tabella leggibile senza login2.096
…e una di quelle aveva un nome da persone394
Ogni barra è misurata sullo stesso totale. Il 57% è una quota delle 3.680 app che abbiamo davvero potuto controllare, non di tutte quelle scansionate.

Tre cose che non abbiamo fatto. Ognuna sposta la cifra reale da una parte o dall'altra, e va detta invece che sepolta.

Abbiamo chiesto solo nomi di tabella che potevamo vedere o indovinare. Supabase non lascia più che una chiave pubblicabile elenchi le tabelle di un progetto, quindi abbiamo letto i nomi che un'app cita nel proprio codice e aggiunto un paio di dozzine di nomi comuni, con un tetto di trenta per app. Un'app le cui tabelle si chiamano in un modo che non ci è venuto in mente ci sembra pulita e potrebbe non esserlo.

Abbiamo contato le righe, mai lette. Ogni sonda ha chiesto al database quante righe avrebbe consegnato e si è fermata lì. Non è stato scaricato il dato di nessuno, e nessuna app è nominata in questo articolo né in nient'altro che pubblichiamo.

Quasi tutte le app che abbiamo potuto controllare erano app Lovable. Sono la fetta più grande di quello che abbiamo scansionato e le più propense a nominare il proprio progetto Supabase nella pagina, quindi leggi questo come una misura delle app Lovable con Supabase e non di ogni builder. Dove il controllo non è arrivato in fondo, abbiamo registrato che non è arrivato in fondo. Un'app che non siamo riusciti a controllare è sconosciuta, non pulita.

Una tabella aperta non è automaticamente un buco

Da fuori, una tabella che chiunque può leggere ha esattamente lo stesso aspetto sia che contenga il tuo catalogo prodotti sia che contenga i tuoi clienti. La risposta è la stessa. L'unica cosa che cambia è il nome.

Stessa richiesta, stessa risposta, verdetti opposti. Solo chi ha costruito l'app sa quale dei due casi sia la propria tabella aperta.

Per questo dividiamo il risultato in due. In 394 di quelle app, una delle tabelle leggibili portava un nome preso da un breve elenco che per noi significa persone: users, profiles, customers, orders, messages, invoices. Quello è uno sconosciuto che legge i tuoi clienti, e va sistemato oggi.

Le altre 1.702 non possiamo giudicarle da fuori, e non può farlo nessun altro scanner. Una tabella posts può essere un blog pubblico oppure appunti privati. Tu sai quale delle due. Chi guarda la tua app da internet non lo sa.

Se preferisci non tirare a indovinare sulla tua, la nostra scansione gratuita controlla il tuo sito online da fuori e ti dice quali tabelle hanno risposto. Richiede una ventina di secondi e non serve un account: scansiona la tua app.

Perché capita ad app che nessuno ha aperto di proposito

Perché la correzione che rimette in funzione un'app rotta è di solito quella che apre la tabella.

La sequenza è questa. Row Level Security viene attivato, da te o dal builder. La tua app smette immediatamente di mostrare dati, perché attivo senza regole significa che il database rifiuta tutti, te compreso. Incolli l'errore al tuo assistente, lui scrive una policy che consente qualunque richiesta, e l'app torna a funzionare. Dopo, niente sembra più sbagliato.

Quella policy è proprio ciò che troviamo. La dashboard segnala la tabella come protetta, perché l'interruttore è attivo e una policy esiste. L'articolo su perché Row Level Security attivo non è la stessa cosa di protetto percorre i quattro stati possibili di una tabella e come riconoscere il tuo.

La fuga di cui ti hanno messo in guardia era quella rara

Su tutte le 30.998 app, una chiave segreta Supabase lasciata nel browser (la chiave che ignora ogni regola tu abbia scritto) è comparsa 3 volte.

È la fuga di cui chi ha un'app sente parlare in continuazione e quella che abbiamo trovato meno spesso. È seria quando capita, e vale la pena saperla riconoscere, ma la preoccupazione spesa lì sorveglia una porta quasi sempre chiusa. L'apertura comune in queste app è una tabella qualsiasi senza nessuna regola.

Come controllare la tua app

Due posti in cui guardare dentro il tuo database Supabase, e un modo per vederlo da dove sta uno sconosciuto.

Apri il Security Advisor nella dashboard di Supabase. Elenca ogni tabella con Row Level Security disattivato, che è la versione più netta di questo problema. Supabase lo segnala bene, e se il tuo progetto è in quell'elenco hai la risposta senza leggere una riga di SQL.

Poi leggi le policy di ogni tabella che contiene persone. Il Security Advisor non può decidere se una policy permissiva sia voluta, perché per un catalogo prodotti sarebbe corretta. Apri la tabella, guarda la policy e vedi se nomina una condizione o se consente a tutti.

Oppure controllalo da fuori, che è dove vive il rischio. Uno sconosciuto non apre la tua dashboard. La nostra scansione gratuita fa la stessa richiesta anonima che farebbe un estraneo e riferisce quali tabelle hanno risposto: scansiona la tua app, senza account e senza installare nulla.

Cosa fare con una tabella che non dovrebbe essere leggibile

Cosa fare

  • Parti dalle tabelle che contengono persone. In users, profiles, customers, orders e messages vivono i dati di qualcun altro, e sono quelle che meritano una serata.
  • Scrivi la regola prima di allargare qualsiasi altra cosa. Una policy che nomina una condizione (questa riga appartiene a questo utente autenticato) è ciò che rende innocua la chiave pubblicabile dentro la tua app.
  • Controlla la policy, non l'interruttore. Attivo con una regola che consente a tutti, visto da fuori, è identico a disattivato, e la tua dashboard mostra il primo caso come protetto.
  • Lascia stare le tabelle davvero pubbliche. Che un elenco prodotti o un articolo pubblicato siano leggibili è corretto, e toglierlo rompe la tua app senza guadagnarci nulla.
  • Dopo la modifica, prova come farebbe uno sconosciuto. Che la tua app mostri la cosa giusta dimostra cosa chiede la tua app, non cosa consegnerebbe il tuo database.

Controllarlo una volta è una serata. Tenere vera la risposta anche il mese prossimo è la parte che in una serata non ci sta, ed è per questo che abbiamo costruito Reeve Care. Ripete questo stesso controllo sulla tua app a intervalli regolari e ti scrive quando la risposta peggiora, perché una tabella chiusa a marzo e aperta a giugno non è una cosa che qualcuno noti da dentro la propria app.

I due compiti: il controllo riparte a intervalli regolari, e una copia del tuo database esce dal tuo account Supabase e viene riletta prima di essere contata.

Tiene anche backup propri del tuo database Supabase, presi a intervalli regolari, conservati fuori dal tuo account Supabase e riletti per verifica prima di essere contati, con un ripristino che salva lo stato attuale prima di riprodurre qualsiasi cosa. Questa seconda metà conta qui perché noi controlliamo sempre e solo la lettura. La stessa policy permissiva può consentire la scrittura, e uno sconosciuto che scrive nella tua tabella è la versione che la svuota: a quel punto una copia di prima è l'unica cosa che rimette a posto le righe. Care copre il tuo database, e i file caricati su Storage appena li colleghi, su Supabase e non su ogni tipo di database: cosa sorveglia e quanto costa.

Se preferisci procedere per elenco, la checklist di sicurezza da 10 minuti copre questo insieme alle altre cose da chiudere in un'app appena lanciata. E se una tabella è rimasta aperta per un po', quello che potrai annullare dopo dipende interamente da cosa stavi salvando.

FAQ

Come capisco se chiunque può leggere il mio database Supabase?

Due controlli risolvono quasi tutto. Nella dashboard di Supabase apri il Security Advisor: elenca ogni tabella con Row Level Security disattivato, e quelle sono leggibili da chiunque abbia la chiave che viaggia dentro la tua app. Poi apri le policy di ogni tabella che contiene persone, perché una tabella può superare il primo controllo ed essere comunque aperta: una policy che permette a tutti è attiva, valida, e nella dashboard appare come protetta. Se preferisci vederlo da fuori, la nostra scansione gratuita legge il tuo sito online come farebbe uno sconosciuto.

È grave se una delle mie tabelle è leggibile da chiunque?

Dipende dalla tabella, e sei l'unica persona che può deciderlo. Un elenco di prodotti, di articoli pubblicati o di locali su una mappa è fatto per essere letto da tutti, e una policy che lo consente è corretta. La stessa impostazione su una tabella di utenti, ordini o messaggi significa che degli sconosciuti leggono i tuoi clienti. Chiediti se pubblicheresti il contenuto di quella tabella su una pagina aperta, e lascia decidere la risposta.

Ho Row Level Security attivo. Vuol dire che le mie tabelle sono protette?

Non da solo. L'interruttore e le regole sono due cose diverse: attivo senza alcuna regola blocca tutti, compresa la tua stessa app, e attivo con una regola permissiva non blocca nessuno. La regola che viene scritta quando un'app si rompe dopo l'attivazione di Row Level Security è di solito quella che consente qualunque richiesta da chiunque: rimette in piedi l'app e lascia la tabella aperta. Leggi la policy sulla tabella, non l'interruttore.

La mia app ha una schermata di login. Non tiene fuori la gente dal database?

No. La schermata di login decide cosa mostra la tua app. Non decide cosa consegna il tuo database, perché una richiesta non deve per forza arrivare dalla tua app: la chiave che la tua app porta con sé è leggibile da qualsiasi visitatore e può essere usata direttamente contro il database. A decidere la risposta è Row Level Security su ogni singola tabella.

Cosa faccio per prima cosa se trovo una tabella che degli sconosciuti possono leggere?

Sistema la policy su quella tabella prima di ogni altra cosa, poi guarda cosa era raggiungibile mentre era aperta. Parti dalle tabelle che contengono persone, perché sono quelle con dentro i dati di qualcun altro. Se la tabella era aperta e contiene dati personali, verifica se le regole del tuo Paese ti obbligano ad avvisare qualcuno: è una domanda da avvocato, non da scanner.

Scritto da

Vlad Tkachenko

Fondatore di Reeve

Passo le giornate a guardare app costruite con Lovable, Bolt, v0, Cursor e Replit, e la breve lista di errori che vi ricompaiono di continuo.

Altro sull'autore

Da leggere dopo

Non sai come sta messa la tua app?

Esegui una scansione gratuita e ottieni un voto chiaro da A a F in una ventina di secondi. Senza account e senza carta.

Scansiona la tua app gratis

Controllo esterno automatizzato, non un audit completo. L'assenza di risultati non è una garanzia di sicurezza.