[{"data":1,"prerenderedAt":921},["ShallowReactive",2],{"blog-it-open-api-endpoint-exposed":3,"blog-index-it":571},{"id":4,"title":5,"body":6,"category":529,"cover":530,"coverAlt":531,"description":532,"draft":533,"extension":534,"faq":535,"image":550,"keywords":551,"meta":559,"navigation":560,"ogTitle":561,"path":562,"published":563,"seo":564,"stem":565,"tldr":566,"updated":563,"__hash__":570},"blog_it\u002Fblog\u002Fopen-api-endpoint-exposed.md","Un endpoint API aperto è un problema di sicurezza? Leggi il JSON",{"type":7,"value":8,"toc":515},"minimark",[9,13,21,26,29,32,35,41,44,48,51,54,118,121,125,128,138,144,150,168,179,188,192,195,202,274,282,294,298,301,304,307,312,322,326,329,332,356,359,363,366,369,379,382,388,399,421,427,430,436,445,450,453,459,462,471,475,495,502],[10,11,12],"p",{},"La tua scansione è tornata con una riga che non si legge come un verdetto:\nalcuni endpoint API rispondono senza login. Magari qualcuno te l'ha detto in\nmodo più diretto, parlando di un endpoint API aperto. Sotto c'è un indirizzo, ed\nè piuttosto probabile che tu non lo riconosca.",[10,14,15,16,20],{},"Ecco la parte che guida dopo guida racconta male: ",[17,18,19],"strong",{},"il consiglio abituale per\nquesto rilievo è mettere un login davanti al tuo endpoint, e nella maggior parte\ndelle app che abbiamo scansionato non c'è nessun endpoint tuo davanti a cui\nmetterlo."," Sette su dieci di quelli che abbiamo trovato appartengono alla\npiattaforma su cui l'app è stata pubblicata. Leggere questo rilievo comincia\nquindi dal capire di chi è l'indirizzo, e la risposta di solito si vede già\nnella prima riga di quello che torna.",[22,23,25],"h2",{"id":24},"che-cosa-significa-un-endpoint-api-aperto-nel-tuo-report","Che cosa significa un endpoint API aperto nel tuo report",[10,27,28],{},"Significa che un percorso scritto nel codice della tua app ha risposto a una\nrichiesta che non portava alcun login, e che quello che è tornato era JSON.",[10,30,31],{},"Tre passaggi, e nessuno di questi è astuto. Carichiamo la tua app in un browser\ncome fa un visitatore, e leggiamo il codice che quel browser ha scaricato. Lì\ndentro ci sono gli indirizzi che la tua app chiama quando le servono dei dati.\nPoi chiediamo dati a ciascuno, senza account, senza cookie e senza chiave. Se un\nindirizzo risponde con JSON che non è un messaggio di errore, finisce nel report.",[10,33,34],{},"Questo registra che cosa è successo. Non è un giudizio sui dati, perché niente\nche stia fuori dalla tua app può capire se un elenco di cose è un elenco di cose\npubbliche. Per questo il rilievo è formulato così: questi endpoint hanno\nrestituito dati senza alcuna autenticazione, può essere voluto per dati\npubblici, controlla che nessuno esponga informazioni private.",[36,37],"diagram",{"alt":38,"caption":39,"src":40},"Codice scaricato da un'app, con quattro indirizzi estratti da esso. A ogni indirizzo vengono chiesti dati da una richiesta che porta una chiave sbarrata, cioè nessun login. Tre tornano vuoti o rifiutati e uno torna con un blocco di dati.","Gli indirizzi escono dal tuo stesso codice, e a ciascuno si chiede senza allegare nulla. Quello che risponde è quello che finisce nel report.","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fwhat-the-check-does-1600x620.png",[10,42,43],{},"Il report ti consegna quindi un elenco di indirizzi da aprire. Ognuno di loro va\naperto in un browser disconnesso, e sono le prime righe della risposta a\nchiudere la questione.",[22,45,47],{"id":46},"ogni-endpoint-api-aperto-è-un-problema-di-sicurezza","Ogni endpoint API aperto è un problema di sicurezza?",[10,49,50],{},"No. Ce ne sono tre tipi, e solo il terzo è un problema.",[10,52,53],{},"Pensa a un condominio. Certe cose lì dentro sono fatte per chiunque entri: gli\norari accanto alla porta, le uscite di sicurezza, l'avviso della manutenzione\ndell'ascensore di martedì. Da qualche altra parte nello stesso palazzo c'è uno\nschedario con i dati degli inquilini. Dal corridoio, una bacheca e uno schedario\nnon chiuso a chiave sono entrambi mobili che si possono aprire, e l'unico modo\nper distinguerli è leggere che cosa c'è scritto sulla carta.",[55,56,57,73],"table",{},[58,59,60],"thead",{},[61,62,63,67,70],"tr",{},[64,65,66],"th",{},"Che cosa ha risposto",[64,68,69],{},"Di chi è l'indirizzo",[64,71,72],{},"A che punto sei",[74,75,76,92,104],"tbody",{},[61,77,78,82,85],{},[79,80,81],"td",{},"Impostazioni della piattaforma: avvisi cookie, interruttori",[79,83,84],{},"Del tuo builder, in ogni app che pubblica",[79,86,87],{},[88,89,91],"key-verdict",{"type":90},"safe","Niente da fare",[61,93,94,97,100],{},[79,95,96],{},"I tuoi dati pubblici: un listino prezzi, un articolo",[79,98,99],{},"Tuo, e fatto per essere letto",[79,101,102],{},[88,103,91],{"type":90},[61,105,106,109,112],{},[79,107,108],{},"Righe su persone: nomi, email, ordini, messaggi",[79,110,111],{},"Tuo, e raggiungibile da chiunque abbia l'indirizzo",[79,113,114],{},[88,115,117],{"type":116},"danger","Chiudilo oggi",[10,119,120],{},"La prima riga è una bacheca che ha avvitato al muro qualcun altro. La seconda è\nuna bacheca che hai appeso tu apposta. La terza è lo schedario, ed è aperto da\ntanto quanto esiste l'indirizzo.",[22,122,124],{"id":123},"come-controllare-che-cosa-restituiscono-i-tuoi-endpoint","Come controllare che cosa restituiscono i tuoi endpoint",[10,126,127],{},"Aprili uno a uno da disconnesso e leggi quello che arriva. La lettura richiede\npiù tempo di quanto il rilievo lasci intendere, ed è l'unico passaggio che\nrisponde alla domanda.",[10,129,130,133,134,137],{},[17,131,132],{},"Trova gli indirizzi."," Apri la tua app in produzione, premi F12 per far\ncomparire gli strumenti per sviluppatori del browser, clicca su ",[17,135,136],{},"Rete"," e\nricarica la pagina. Scorri le richieste che tornano come JSON. Quelli sono gli\nindirizzi da cui la tua app prende i dati, e l'elenco del report ne è un\nsottoinsieme.",[10,139,140,143],{},[17,141,142],{},"Interroga ciascuno da sconosciuto."," Copia una URL, apri una finestra di\nnavigazione in incognito così da essere disconnesso, e incollala. Quello che\nvedi è esattamente quello che a quell'indirizzo vede chiunque su internet.",[10,145,146,149],{},[17,147,148],{},"Leggi le prime righe."," Tre cose possono tornare:",[151,152,153,162,165],"ul",{},[154,155,156,157,161],"li",{},"Un errore, un rifiuto, oppure ",[158,159,160],"code",{},"[]",". L'indirizzo vuole un login, oppure non\nc'è niente lì dentro per un chiamante disconnesso. Vai avanti.",[154,163,164],{},"Impostazioni. Flag, interruttori, un colore, l'elenco delle funzioni attive,\nun numero di versione. Nessuno viene nominato e niente viene descritto. Vai\navanti.",[154,166,167],{},"Righe. Un indirizzo email, il nome di una persona, il totale di un ordine, il\ntesto di un messaggio, un numero di telefono. Fermati qui, è questo.",[10,169,170,171,174,175,178],{},"Se trovi delle righe, prova a cambiare un numero nella URL prima di chiudere la\nscheda. Un indirizzo che consegna la scheda di una persona su ",[158,172,173],{},"id=1"," e quella di\nun'altra su ",[158,176,177],{},"id=2"," le sta consegnando tutte, e vale la pena saperlo prima di\ndecidere quanto sia urgente.",[10,180,181,182,187],{},"La nostra scansione gratuita fa i primi due passaggi al posto tuo: legge nel\ncodice della tua app gli indirizzi che chiama, interroga ciascuno senza login, ed\nelenca quelli che hanno risposto con dei dati. Dura una ventina di secondi e non\nrichiede alcun account: ",[183,184,186],"a",{"href":185},"\u002Fsecurity-scanner","scansiona la tua app",". Il terzo\npassaggio è tuo, perché sei l'unica persona che sa se un nome in quell'elenco è\nun cliente vero.",[22,189,191],{"id":190},"la-maggior-parte-di-quelli-che-abbiamo-trovato-è-della-piattaforma","La maggior parte di quelli che abbiamo trovato è della piattaforma",[10,193,194],{},"Nella nostra rilevazione di agosto 2026, 3.852 delle 30.926 app in cui questo\ncontrollo è riuscito a ottenere una risposta avevano almeno un indirizzo che\nrisponde senza login. Di queste, 2.705 erano app Base44, e su Base44 l'indirizzo\nè quasi sempre lo stesso.",[10,196,197,198,201],{},"È ",[158,199,200],{},"\u002Fapi\u002Fconsent\u002Fconfig",", le impostazioni dei cookie della piattaforma. A\nsettembre abbiamo riaperto un campione di app Base44 segnalate e l'unico\nindirizzo che ha risposto era quello. Restituisce impostazioni, è identico da\nun'app all'altra, e lì dentro non ci sono i dati di nessuno. Lo scanner lo sta\nriportando correttamente e il proprietario non ha niente da correggere.",[55,203,204,217],{},[58,205,206],{},[61,207,208,211,214],{},[64,209,210],{},"Piattaforma",[64,212,213],{},"App con il rilievo",[64,215,216],{},"App in cui il controllo ha risposto",[74,218,219,230,241,252,263],{},[61,220,221,224,227],{},[79,222,223],{},"Base44",[79,225,226],{},"2.705",[79,228,229],{},"5.419",[61,231,232,235,238],{},[79,233,234],{},"Domini propri",[79,236,237],{},"82",[79,239,240],{},"955",[61,242,243,246,249],{},[79,244,245],{},"Bolt",[79,247,248],{},"4",[79,250,251],{},"1.120",[61,253,254,257,260],{},[79,255,256],{},"Lovable",[79,258,259],{},"8",[79,261,262],{},"18.518",[61,264,265,268,271],{},[79,266,267],{},"v0",[79,269,270],{},"0",[79,272,273],{},"1.786",[10,275,276,277,281],{},"Una piattaforma manca da quella tabella apposta. A Replit va un blocco grosso\ndei rilievi rimanenti, e nessuno ne ha riaperto un campione come abbiamo fatto\ncon quelli di Base44, quindi non sappiamo ancora di chi siano quegli indirizzi.\nPubblicare un numero come problema del proprietario prima che qualcuno l'abbia\nguardato è esattamente il modo in cui un'impostazione di piattaforma di Base44\ndiventa una statistica sui proprietari negligenti. Ogni numero qui sopra viene\ndalla\n",[183,278,280],{"href":279},"\u002Fresearch\u002Fvibe-coded-app-security-2026","nostra scansione di 30.998 app vibe-coded in produzione",",\nche pubblica ciascuno insieme alla base su cui è stato misurato.",[10,283,284,285,288,289,293],{},"Leggi insieme i due estremi di quella tabella, perché la distanza è la parte\nutile. Su Lovable sono 8 app su 18.518, e su v0 nessuna. Quelle app non hanno un\npiccolo server tutto loro: la pagina parla con Supabase direttamente dal\nbrowser, quindi non c'è da nessuna parte un ",[158,286,287],{},"\u002Fapi\u002F…"," tuo che questo controllo\npossa trovare. Quello che protegge i dati in un'app così sono le regole su\nciascuna tabella, ed è un rilievo diverso con un\n",[183,290,292],{"href":291},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","suo modo di andare storto",".",[22,295,297],{"id":296},"quando-il-json-sono-impostazioni-e-quando-sono-persone","Quando il JSON sono impostazioni e quando sono persone",[10,299,300],{},"Una domanda decide: c'è qualcosa nella risposta che descrive una persona?",[10,302,303],{},"Le impostazioni descrivono la tua app. Un flag che dice se la modalità scura è\nattiva, l'elenco delle valute che accetti, la versione di qualcosa, il testo di\nun banner dei cookie. Pubblicare quello rivela come è configurata la tua app, e\nla tua app gira comunque davanti a tutti.",[10,305,306],{},"Le righe descrivono i tuoi utenti. Un nome, un indirizzo email, che cosa ha\ncomprato qualcuno, che cosa ha scritto, dove abita. Quella non è una frase sulla\nconfigurazione, è il contenuto dello schedario, e conta per quanto è ordinario\nportarselo via. Non c'è nessuna effrazione. L'indirizzo è una riga di testo che\nfunziona in qualsiasi browser, quindi finisce incollato in una chat di gruppo,\nsalvato negli appunti di qualcuno, e scaricato a intervalli da uno script che\nnessuno sta guardando.",[36,308],{"alt":309,"caption":310,"src":311},"Due risposte di dimensione e forma identiche. Quella a sinistra contiene quattro interruttori, due accesi e due spenti. Quella a destra contiene quattro righe, ognuna con la figura di una persona e una riga oscurata accanto.","Tutte e due sono un 200 e un blocco di JSON, ed è tutto quello che il controllo vede. La differenza fra le due è l'intera domanda, e puoi rispondere leggendo.","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fsettings-or-people-1600x660.png",[313,314,316],"callout",{"type":315},"note",[10,317,318,321],{},[17,319,320],{},"Il caso scomodo è l'indirizzo che prima era impostazioni."," Un endpoint che\nrestituiva l'elenco delle categorie della tua app era un dato pubblico il giorno\nin cui è stato scritto. Poi qualcuno ha aggiunto una colonna alla tabella dietro,\nperché la pagina potesse mostrare chi aveva creato ogni categoria, e lo stesso\nindirizzo ha cominciato a consegnare nomi. Sullo schermo non è cambiato niente,\nl'indirizzo non si è spostato, e il rilievo nel tuo report si legge esattamente\ncome prima.",[22,323,325],{"id":324},"chiuderne-uno-e-perché-rinominare-il-percorso-non-lo-chiude","Chiuderne uno, e perché rinominare il percorso non lo chiude",[10,327,328],{},"Chiedi un login all'indirizzo, e rispondi 401 a chi chiama senza averlo.",[10,330,331],{},"La correzione è tutta qui, e va all'indirizzo e da nessun'altra parte. Tre cose\nche sembrano la correzione e non lo sono:",[151,333,334,340,350],{},[154,335,336,339],{},[17,337,338],{},"Rinominare il percorso, o toglierlo dal codice."," Di questa bisogna\ndiffidare, perché il rilievo sparisce. Chi aveva già la URL ce l'ha ancora, sta\nnelle cronologie dei browser e nei log del server, e lo schedario è ancora\naperto, solo senza l'etichetta davanti.",[154,341,342,345,346,293],{},[17,343,344],{},"Restringere l'header CORS."," Quello decide quali altri siti possono leggere\nuna risposta dentro al browser di qualcuno, e nient'altro lo consulta. Uno\nscript o un terminale legge lo stesso indirizzo in entrambi i casi, ed è per\nquesto che\n",[183,347,349],{"href":348},"\u002Fblog\u002Fcors-wildcard-security-risk","il rilievo del wildcard è un'altra domanda",[154,351,352,355],{},[17,353,354],{},"Filtrare nell'app."," Se la pagina nasconde le righe che non dovrebbe\nmostrare, l'indirizzo continua a mandarle. Il filtro deve avvenire prima che\nla risposta esca.",[10,357,358],{},"C'è una quarta opzione, e su una pagina pubblica è spesso la migliore: smettere\ndi avere l'endpoint. Se i dati servono solo alla tua pagina, la pagina può\nriceverli mentre viene costruita, e l'indirizzo esce dal tuo codice insieme a\nloro.",[22,360,362],{"id":361},"che-aspetto-ha-la-correzione-nel-codice","Che aspetto ha la correzione nel codice",[10,364,365],{},"Due cose, nell'handler che risponde all'indirizzo: capire chi sta chiedendo, e\nfermarsi se la risposta è nessuno.",[10,367,368],{},"Forse non scriverai mai queste righe di persona, e va benissimo. Leggile lo\nstesso, perché sono quello con cui verifichi che il tuo builder abbia davvero\nfatto ciò che gli hai chiesto. Questa è la forma di prima, quella che la\nscansione ha trovato:",[370,371,376],"pre",{"className":372,"code":374,"language":375},[373],"language-text","app.get('\u002Fapi\u002Forders', async (req, res) => {\n  const orders = await db.orders.findMany()\n  res.json(orders)\n})\n","text",[158,377,374],{"__ignoreMap":378},"",[10,380,381],{},"E dopo:",[370,383,386],{"className":384,"code":385,"language":375},[373],"app.get('\u002Fapi\u002Forders', async (req, res) => {\n  const user = await getUserFromRequest(req)\n  if (!user) {\n    return res.status(401).json({ error: 'Not signed in' })\n  }\n\n  const orders = await db.orders.findMany({ where: { userId: user.id } })\n  res.json(orders)\n})\n",[158,387,385],{"__ignoreMap":378},[10,389,390,391,394,395,398],{},"Sono cambiate due cose e contano entrambe. Il ",[158,392,393],{},"401"," è la porta. Il ",[158,396,397],{},"where"," è il\nmotivo per cui la porta vale la pena: senza, un visitatore autenticato può\nleggere gli ordini di tutti gli altri clienti, che è un pubblico più piccolo per\ngli stessi dati e resta comunque quello sbagliato.",[10,400,401,404,405,408,409,412,413,416,417,420],{},[17,402,403],{},"Sulle Edge Function di Supabase, leggi la configurazione prima di scrivere\nqualsiasi cosa."," Le Edge Function controllano da sole il token di chi chiama:\nla documentazione di configurazione di Supabase mette ",[158,406,407],{},"verify_jwt"," a ",[158,410,411],{},"true"," di\ndefault, quindi una funzione che risponde agli sconosciuti è una funzione in cui\nqualcuno l'ha disattivato, con una riga in ",[158,414,415],{},"supabase\u002Fconfig.toml"," oppure\npubblicando con ",[158,418,419],{},"--no-verify-jwt",":",[370,422,425],{"className":423,"code":424,"language":375},[373],"[functions.orders]\nverify_jwt = false\n",[158,426,424],{"__ignoreMap":378},[10,428,429],{},"Se la tua funzione deve essere privata, cancella quelle due righe e ripubblica.\nLasciale solo dove l'endpoint deve davvero rispondere a chiunque, che è il caso\nche la documentazione di Supabase stessa prende come esempio: un webhook di\npagamento. Dentro la funzione, l'SDK attuale ti dà un client già limitato alla\npersona che ha chiamato:",[370,431,434],{"className":432,"code":433,"language":375},[373],"import { withSupabase } from 'npm:@supabase\u002Fserver'\n\nexport default {\n  fetch: withSupabase({ auth: 'user' }, async (_req, ctx) => {\n    const { data } = await ctx.supabase.from('orders').select()\n    return Response.json(data)\n  }),\n}\n",[158,435,433],{"__ignoreMap":378},[10,437,438,441,442,293],{},[158,439,440],{},"ctx.supabase"," gira come chi ha chiamato, quindi sono le tue regole di sicurezza\na livello di riga a decidere che cosa torna, cioè la stessa protezione su cui si\nappoggia il resto della tua app e\n",[183,443,444],{"href":291},"la cosa che vale la pena controllare a parte",[446,447,449],"h3",{"id":448},"il-prompt-da-incollare-nel-tuo-builder","Il prompt da incollare nel tuo builder",[10,451,452],{},"Se costruisci in Lovable, Bolt, Cursor, Replit o v0, dagli questo. Lascialo in\ninglese, in qualunque lingua tu stia leggendo, perché è la lingua in cui questi\nstrumenti ragionano, e sostituisci le due parti fra parentesi quadre con quello\nche dice il tuo report:",[370,454,457],{"className":455,"code":456,"language":375},[373],"A security scan of [my-app.com] found these API endpoints answer\nwithout any authentication: [\u002Fapi\u002Forders, \u002Fapi\u002Fusers].\n\nPlease look at each one and decide whether it is meant to be public.\nFor the ones that are not, require a valid session or API token and\nreturn 401 otherwise. Make sure each one returns only the rows that\nbelong to the person asking, not the whole table filtered in the UI.\nFor any that must stay open, make sure they return only non-sensitive\ndata and add rate limiting so they cannot be abused.\n\nTell me what you changed for each endpoint, and do not rename or\nremove the paths.\n",[158,458,456],{"__ignoreMap":378},[10,460,461],{},"Quell'ultima frase è lì apposta. Quando gli si chiede di far sparire un rilievo,\nun modello a volte prende la strada più corta e sposta l'indirizzo, che è\nl'unico risultato che alla scansione successiva sembra un successo e non cambia\nniente.",[313,463,465],{"type":464},"warn",[10,466,467,470],{},[17,468,469],{},"Riscansiona da disconnesso, non da autenticato."," Una volta pubblicata la\ncorrezione, controllala come descrive la sezione qui sopra: una finestra di\nnavigazione in incognito e la URL. Provarla da autenticato dimostra che\nl'endpoint per te funziona ancora, cosa di cui non ha mai dubitato nessuno.\nEsci dall'account e rileggila.",[22,472,474],{"id":473},"che-cosa-fare-adesso","Che cosa fare adesso",[476,477,478],"key-takeaways",{},[151,479,480,483,486,489,492],{},[154,481,482],{},"Apri ogni indirizzo segnalato in una finestra di navigazione in incognito e leggi quello che torna. È il passaggio che il report non può fare al posto tuo.",[154,484,485],{},"Se la risposta sono impostazioni e l'indirizzo è uno che non hai mai scritto, è del tuo builder e non c'è niente da correggere. Cerca il percorso nella documentazione della tua piattaforma prima di spenderci qualcosa.",[154,487,488],{},"Se la risposta contiene un nome, una email o un ordine, chiedi oggi stesso un login a quell'indirizzo e restituisci 401 a chi non ce l'ha.",[154,490,491],{},"Non rinominare il percorso e non cancellarne il riferimento. Il rilievo sparisce e l'indirizzo continua a rispondere.",[154,493,494],{},"Prova a cambiare un id nella URL sulla tua app. Un indirizzo che serve una scheda a uno sconosciuto di solito le serve tutte.",[10,496,497,498,293],{},"Gli indirizzi di questo elenco li ha scritti qualcuno che allora sapeva che cosa\nci fosse dietro, e quello che cambia è proprio quello che c'è dietro. Reeve Care\nripassa questa scansione sulla tua app in produzione a intervalli regolari e ti\nmanda una email quando un risultato peggiora, che è esattamente il caso che il\ngiro da disconnesso qui sopra non può prendere:\n",[183,499,501],{"href":500},"\u002Fpricing","che cosa sorveglia e quanto costa",[10,503,504,505,509,510,514],{},"Se preferisci sistemare tutto in una volta sola, la\n",[183,506,508],{"href":507},"\u002Fchecklist","checklist di sicurezza in 10 minuti"," copre questo insieme al resto\ndi ciò che un'app appena lanciata tende a lasciare aperto, e\n",[183,511,513],{"href":512},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","quali chiavi sono sicure nel frontend","\nè l'altro rilievo con cui la gente arriva di solito.",{"title":378,"searchDepth":516,"depth":516,"links":517},3,[518,520,521,522,523,524,525,528],{"id":24,"depth":519,"text":25},2,{"id":46,"depth":519,"text":47},{"id":123,"depth":519,"text":124},{"id":190,"depth":519,"text":191},{"id":296,"depth":519,"text":297},{"id":324,"depth":519,"text":325},{"id":361,"depth":519,"text":362,"children":526},[527],{"id":448,"depth":516,"text":449},{"id":473,"depth":519,"text":474},"Basi della sicurezza","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcover-1200x630.png","Due sportelli identici in un muro, da ciascuno spunta un foglio. Uno porta una fila di interruttori, l'altro una colonna di volti.","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.",false,"md",[536,539,541,544,547],{"q":537,"a":538},"Che cosa significa \"endpoint API aperto\" nel mio report?","Significa che abbiamo letto il codice che la tua app manda a un browser, ci abbiamo trovato dentro un indirizzo a cui la tua app chiede dati, e a quell'indirizzo abbiamo chiesto dati senza account e senza login. Ha risposto, e la risposta era JSON. Il rilievo è tutto qui. Registra che cosa è successo, e non giudica se i dati fossero privati, perché niente fuori dalla tua app può saperlo.",{"q":47,"a":540},"No. Molti indirizzi sono fatti per rispondere a chiunque: un listino prezzi pubblicato, un articolo, l'elenco delle funzioni attive. Il problema è l'indirizzo che restituisce righe che appartengono a delle persone, perché lo fa per chiunque abbia la URL. Leggi quello che è tornato e chiediti se qualcosa lì dentro descrive una persona.",{"q":542,"a":543},"Il report segnala un endpoint che non ho scritto io. Che cos'è?","Di solito è del tuo builder. Le piattaforme che danno alla tua app un piccolo server tutto suo ci infilano anche qualche indirizzo loro, e quelli stanno nel codice di ogni app della piattaforma. L'esempio più netto che abbiamo misurato sono le impostazioni dei cookie di Base44 su \u002Fapi\u002Fconsent\u002Fconfig, che valgono 2.705 dei 3.852 rilievi della nostra rilevazione di agosto 2026. Restituiscono impostazioni, sono identiche su ogni app Base44, e lì dentro non c'è niente che ti appartenga.",{"q":545,"a":546},"Come controllo che cosa restituiscono gli endpoint della mia app?","Apri la tua app in produzione, premi F12, clicca su Rete e ricarica. Le richieste che tornano come JSON sono gli indirizzi da cui la tua app prende i dati. Copia ogni URL, apri una finestra di navigazione in incognito così da essere disconnesso, e incollale una alla volta. Leggi quello che arriva. Un errore o una lista vuota vanno benissimo. Le righe con nomi, email o totali di ordini sono leggibili da chiunque abbia quell'indirizzo.",{"q":548,"a":549},"Nascondere il percorso lo risolve?","No. Rinominare l'indirizzo, o togliere dal codice il riferimento, impedisce a uno scanner di trovarlo e lo lascia rispondere esattamente come prima. Chi aveva già la URL ce l'ha ancora, e resta nelle cronologie dei browser, nei log del server e in tutto ciò che ha scansionato il tuo sito. Si risolve all'indirizzo: chiedere un login e rispondere 401 a uno sconosciuto.","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",[552,553,554,555,556,557,558],"endpoint api aperto","endpoint api senza autenticazione","endpoint api restituisce dati senza login","il mio endpoint api è pubblico","rotta api non protetta","endpoint api senza login","endpoint json esposto",{},true,"Un endpoint API aperto è un problema di sicurezza?","\u002Fblog\u002Fopen-api-endpoint-exposed","2026-09-25",{"title":5,"description":532},"blog\u002Fopen-api-endpoint-exposed",[567,568,569],"Un endpoint API aperto significa che un percorso scritto nel codice della tua app ha risposto a una richiesta senza login, e che quello che è tornato era JSON.","Di quelli che abbiamo trovato su 30.926 app, sette su dieci li ha messi lì la piattaforma su cui l'app è stata pubblicata, e restituiscono impostazioni.","La domanda che decide è se qualcosa nella risposta descrive una persona. Un listino prezzi è pubblico apposta. Un elenco dei tuoi clienti non lo è mai stato.","XGiyxbLEBQ-ifm9-I0iQWMxzFNYzHCPiPO2utqhIhBQ",[572,578,584,590,596,602,608,614,620,626,632,638,644,651,657,663,668,669,675,681,687,693,699,705,711,717,723,729,735,741,747,753,759,765,771,777,783,789,795,801,807,813,819,825,831,837,843,848,854,860,866,872,878,884,889,895,901,906,911,917],{"path":573,"title":574,"description":575,"published":576,"category":529,"image":577,"draft":533},"\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":579,"title":580,"description":581,"published":582,"category":529,"image":583,"draft":533},"\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":585,"title":586,"description":587,"published":588,"category":529,"image":589,"draft":533},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" senza disattivare RLS","\"Infinite recursion detected in policy for relation\" significa che la tua policy ha interrogato la tabella che protegge. Ecco come rompere il cerchio.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":591,"title":592,"description":593,"published":594,"category":529,"image":595,"draft":533},"\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":597,"title":598,"description":599,"published":600,"category":529,"image":601,"draft":533},"\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":603,"title":604,"description":605,"published":606,"category":529,"image":607,"draft":533},"\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":609,"title":610,"description":611,"published":612,"category":529,"image":613,"draft":533},"\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":615,"title":616,"description":617,"published":618,"category":529,"image":619,"draft":533},"\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":621,"title":622,"description":623,"published":624,"category":529,"image":625,"draft":533},"\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":627,"title":628,"description":629,"published":630,"category":529,"image":631,"draft":533},"\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":633,"title":634,"description":635,"published":636,"category":529,"image":637,"draft":533},"\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":639,"title":640,"description":641,"published":642,"category":529,"image":643,"draft":533},"\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":645,"title":646,"description":647,"published":648,"category":649,"image":650,"draft":533},"\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":652,"title":653,"description":654,"published":655,"category":649,"image":656,"draft":533},"\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":658,"title":659,"description":660,"published":661,"category":649,"image":662,"draft":533},"\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":664,"title":665,"description":666,"published":661,"category":529,"image":667,"draft":533},"\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":562,"title":5,"description":532,"published":563,"category":529,"image":550,"draft":533},{"path":670,"title":671,"description":672,"published":673,"category":529,"image":674,"draft":533},"\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":676,"title":677,"description":678,"published":679,"category":649,"image":680,"draft":533},"\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":682,"title":683,"description":684,"published":685,"category":529,"image":686,"draft":533},"\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":688,"title":689,"description":690,"published":691,"category":529,"image":692,"draft":533},"\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":694,"title":695,"description":696,"published":697,"category":529,"image":698,"draft":533},"\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":700,"title":701,"description":702,"published":703,"category":529,"image":704,"draft":533},"\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":706,"title":707,"description":708,"published":709,"category":529,"image":710,"draft":533},"\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":712,"title":713,"description":714,"published":715,"category":529,"image":716,"draft":533},"\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":718,"title":719,"description":720,"published":721,"category":529,"image":722,"draft":533},"\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":724,"title":725,"description":726,"published":727,"category":529,"image":728,"draft":533},"\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":730,"title":731,"description":732,"published":733,"category":649,"image":734,"draft":533},"\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":736,"title":737,"description":738,"published":739,"category":649,"image":740,"draft":533},"\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":742,"title":743,"description":744,"published":745,"category":649,"image":746,"draft":533},"\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":748,"title":749,"description":750,"published":751,"category":529,"image":752,"draft":533},"\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":754,"title":755,"description":756,"published":757,"category":529,"image":758,"draft":533},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Attiva Row Level Security su ogni tabella Supabase, poi verificalo","Attivare Row Level Security su Supabase senza una policy chiude del tutto la tabella. Una policy senza il flag non fa nulla. Ecco lo SQL, e la verifica.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":760,"title":761,"description":762,"published":763,"category":529,"image":764,"draft":533},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": cosa non vede l'avviso","Supabase segnala \"RLS disabled in public\" come errore. Non dice nulla della policy di lettura che lascia la tua tabella altrettanto aperta.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":766,"title":767,"description":768,"published":769,"category":529,"image":770,"draft":533},"\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":772,"title":773,"description":774,"published":775,"category":529,"image":776,"draft":533},"\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":778,"title":779,"description":780,"published":781,"category":529,"image":782,"draft":533},"\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":784,"title":785,"description":786,"published":787,"category":529,"image":788,"draft":533},"\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":790,"title":791,"description":792,"published":793,"category":529,"image":794,"draft":533},"\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":796,"title":797,"description":798,"published":799,"category":529,"image":800,"draft":533},"\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":802,"title":803,"description":804,"published":805,"category":529,"image":806,"draft":533},"\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":808,"title":809,"description":810,"published":811,"category":649,"image":812,"draft":533},"\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":814,"title":815,"description":816,"published":817,"category":529,"image":818,"draft":533},"\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":820,"title":821,"description":822,"published":823,"category":649,"image":824,"draft":533},"\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":826,"title":827,"description":828,"published":829,"category":529,"image":830,"draft":533},"\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":832,"title":833,"description":834,"published":835,"category":529,"image":836,"draft":533},"\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":838,"title":839,"description":840,"published":841,"category":529,"image":842,"draft":533},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy su Supabase. E adesso?","\"New row violates row-level security policy\" significa che Supabase ha rifiutato una scrittura. La soluzione veloce riapre la tabella a chiunque.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":348,"title":844,"description":845,"published":846,"category":529,"image":847,"draft":533},"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":849,"title":850,"description":851,"published":852,"category":649,"image":853,"draft":533},"\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":855,"title":856,"description":857,"published":858,"category":649,"image":859,"draft":533},"\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":861,"title":862,"description":863,"published":864,"category":529,"image":865,"draft":533},"\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":867,"title":868,"description":869,"published":870,"category":529,"image":871,"draft":533},"\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":873,"title":874,"description":875,"published":876,"category":649,"image":877,"draft":533},"\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":879,"title":880,"description":881,"published":882,"category":529,"image":883,"draft":533},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Chiunque può leggere il tuo database Supabase? 3.680 app testate","Chiunque può leggere il tuo database Supabase senza fare login? Abbiamo scansionato 30.998 app online create con i builder IA e misurato quante rispondono sì.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":885,"title":886,"description":887,"published":882,"category":529,"image":888,"draft":533},"\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":529,"image":894,"draft":533},"\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":649,"image":900,"draft":533},"\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":291,"title":902,"description":903,"published":904,"category":529,"image":905,"draft":533},"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":649,"image":910,"draft":533},"\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":649,"image":916,"draft":533},"\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":512,"title":918,"description":919,"published":915,"category":529,"image":920,"draft":533},"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",1791618973722]