[{"data":1,"prerenderedAt":778},["ShallowReactive",2],{"blog-it-is-replit-safe":3,"blog-index-it":538},{"id":4,"title":5,"body":6,"category":496,"cover":497,"coverAlt":498,"description":499,"draft":500,"extension":501,"faq":502,"image":518,"keywords":519,"meta":527,"navigation":528,"ogTitle":5,"path":529,"published":530,"seo":531,"stem":532,"tldr":533,"updated":530,"__hash__":537},"blog_it\u002Fblog\u002Fis-replit-safe.md","Replit è sicuro? Cosa abbiamo trovato in 3.042 app Replit online",{"type":7,"value":8,"toc":481},"minimark",[9,13,21,24,29,32,35,57,60,66,70,83,230,233,238,242,245,253,256,260,263,274,279,285,293,300,304,312,315,330,334,337,345,361,365,368,371,379,383,386,420,424,427,434,438,468],[10,11,12],"p",{},"Hai costruito qualcosa su Replit, funziona, e stai per metterci sopra persone\nvere. A un certo punto di quella settimana hai scritto «replit è sicuro» in una\ncasella di ricerca, e quello che è tornato era o una pagina sulle certificazioni\ndi Replit o una pagina su un agente IA che ha cancellato un database. Nessuna\ndelle due ha detto una parola sull’app che stai per pubblicare.",[10,14,15,16,20],{},"Ecco la parte che la maggior parte di quelle risposte sbaglia: ",[17,18,19],"strong",{},"«Replit è\nsicuro?» sono tre domande in una frase sola",", e quella che decide se degli\nsconosciuti possono leggere i dati dei tuoi utenti è quella che quasi nessuno\nmisura.",[10,22,23],{},"Noi possiamo misurarla. Tra il 12 e il 14 agosto 2026 abbiamo passato 30.998\napp online per gli stessi nove controlli esterni che chiunque può lanciare\ngratis dalla nostra home page, e 3.042 di queste erano pubblicate su Replit.\nQuesto è quello che è venuto fuori per loro, e dove il nostro sguardo si ferma.",[25,26,28],"h2",{"id":27},"replit-è-sicuro","Replit è sicuro?",[10,30,31],{},"Come host, non era lì che stavano i rilievi. Le due cose che dell’hosting\npossiamo vedere dall’esterno sono tornate pulite su ogni app che ha risposto, e\nle nove app valutate D o F ci sono arrivate tutte per qualcosa dentro l’app.",[10,33,34],{},"Pensa a Replit come a un negozio in affitto con un laboratorio sul retro. Il\npadrone di casa possiede l’edificio e la serratura della porta sulla strada. Chi\nha allestito il negozio ha deciso dove vanno gli scaffali e come il retro\ncomunica con il davanti. E quello che un passante può raggiungere dal\nmarciapiede lo decidi tu, ogni volta che apri. Sono tre domande diverse, e una\nbuona risposta alle prime due non dice nulla della terza.",[36,37,38,45,51],"ol",{},[39,40,41,44],"li",{},[17,42,43],{},"La piattaforma."," Replit ospita la tua app come si deve: un certificato\nvalido, un dominio che non scadrà, i secret cifrati e fuori dai tuoi file.\nQuesto è il padrone di casa.",[39,46,47,50],{},[17,48,49],{},"L’agente."," Il codice che scrive l’IA di Replit è sicuro. Questo è\nl’installatore, e nessuna scansione dall’esterno può vedere l’impianto.",[39,52,53,56],{},[17,54,55],{},"L’app che hai pubblicato."," Quello che uno sconosciuto può raggiungere\ndalla strada: una chiave nel codice che un browser scarica, una route API\nche risponde senza login, un file che non avrebbe mai dovuto avere un URL.",[10,58,59],{},"I nostri controlli leggono la terza. Sulla prima, il certificato era valido su\ntutte le 3.028 app in cui siamo riusciti a leggerne uno, e nessun dominio su\n3.042 era vicino alla scadenza. Sulla seconda non abbiamo nulla da misurare, e\nla sezione dedicata più in basso lo dice.",[61,62],"diagram",{"alt":63,"caption":64,"src":65},"Tre pannelli affiancati. Il primo contiene il logo di Replit con un lucchetto e un certificato accanto. Il secondo contiene un simbolo di codice con una scintilla sopra. Il terzo contiene una pagina del browser davanti a un server, tre visitatori che si allungano verso di essa, e una lente d’ingrandimento disegnata solo su quel pannello, con il numero 3.042 sotto.","Tre domande dentro una ricerca sola. Una scansione dall’esterno legge il terzo pannello e niente negli altri due.","\u002Fblog\u002Fis-replit-safe\u002Fthree-questions-1600x700.png",[25,67,69],{"id":68},"cosa-abbiamo-trovato-in-3042-app-replit","Cosa abbiamo trovato in 3.042 app Replit",[10,71,72,73,76,77,82],{},"Nove controlli, eseguiti dall’esterno, senza login e senza accesso all’account\ndi nessuno. Non abbiamo mai letto una riga: dove un database ha risposto, gli\nabbiamo chiesto quante righe avrebbe consegnato e ci siamo fermati lì. Nessuna\napp è nominata qui né altrove tra le cose che pubblichiamo. Ogni quota qui\nsotto è calcolata sulle app su cui quel controllo ha ",[17,74,75],{},"risposto",", perché un\ncontrollo che non è riuscito a finire è sconosciuto e non superato, e questa\nregola è il motivo per cui i denominatori si muovono. Il metodo e i dati sono\n",[78,79,81],"a",{"href":80},"\u002Fresearch\u002Fvibe-coded-app-security-2026","nel report",".",[84,85,86,103],"table",{},[87,88,89],"thead",{},[90,91,92,96,100],"tr",{},[93,94,95],"th",{},"Cosa abbiamo controllato",[93,97,99],{"align":98},"right","App Replit",[93,101,102],{},"Chi lo decide",[104,105,106,118,129,139,150,160,170,189,199,209,220],"tbody",{},[90,107,108,112,115],{},[109,110,111],"td",{},"Intestazioni di sicurezza del browser mancanti",[109,113,114],{"align":98},"2.924 su 3.042 (96%)",[109,116,117],{},"Ciò che serve la pagina",[90,119,120,123,126],{},[109,121,122],{},"Una route API che ha risposto a uno sconosciuto con dei dati",[109,124,125],{"align":98},"1.050 su 3.037 (35%)",[109,127,128],{},"La tua app",[90,130,131,134,137],{},[109,132,133],{},"Qualcosa a forma di chiave nel codice che un visitatore scarica",[109,135,136],{"align":98},"219 su 3.042 (7%)",[109,138,128],{},[90,140,141,144,147],{},[109,142,143],{},"Codice sorgente originale pubblicato (source map)",[109,145,146],{"align":98},"168 su 3.041 (6%)",[109,148,149],{},"Un’impostazione di build",[90,151,152,155,158],{},[109,153,154],{},"Qualsiasi sito autorizzato a chiamare la tua API",[109,156,157],{"align":98},"76 su 3.037",[109,159,128],{},[90,161,162,165,168],{},[109,163,164],{},"Qualsiasi sito autorizzato a chiamarla con i cookie dei tuoi utenti",[109,166,167],{"align":98},"56 su 3.037",[109,169,128],{},[90,171,172,184,187],{},[109,173,174,175,179,180,183],{},"Un file privato come ",[176,177,178],"code",{},".env"," o ",[176,181,182],{},".git\u002Fconfig"," a un URL pubblico",[109,185,186],{"align":98},"7 su 3.023",[109,188,128],{},[90,190,191,194,197],{},[109,192,193],{},"Una tabella del database leggibile senza login",[109,195,196],{"align":98},"4 su 3.033",[109,198,128],{},[90,200,201,204,207],{},[109,202,203],{},"Un bucket di storage che elenca i suoi file",[109,205,206],{"align":98},"0 su 3.035",[109,208,128],{},[90,210,211,214,217],{},[109,212,213],{},"Certificato scaduto o non attendibile",[109,215,216],{"align":98},"0 su 3.028",[109,218,219],{},"Replit",[90,221,222,225,228],{},[109,223,224],{},"Dominio in scadenza",[109,226,227],{"align":98},"0 su 3.042",[109,229,219],{},[10,231,232],{},"I voti: 2.789 A, 183 B, 61 C, 8 D e 1 F. Trentuno app non avevano nessun\nrilievo.",[61,234],{"alt":235,"caption":236,"src":237},"Sette barre orizzontali su una stessa scala, ognuna preceduta da un piccolo simbolo e chiusa da un numero: 2.924 per le intestazioni, 1.050 per le route aperte, 219 per le chiavi, 168 per le source map, 76 e 56 per i due rilievi cross-origin, e 7 per i file privati. La barra in alto è di un grigio pallido e le altre sono turchesi, con il 7 disegnato come una linea sottile con un anello intorno.","Una scala per tutte e sette. La barra grigia la decide l’hosting. Ogni barra turchese è nata da qualcosa dentro l’app.","\u002Fblog\u002Fis-replit-safe\u002Fwhat-we-found-1600x720.png",[25,239,241],{"id":240},"perché-il-99-aveva-un-rilievo-qui-dice-poco","Perché «il 99% aveva un rilievo» qui dice poco",[10,243,244],{},"Perché 2.924 di quei rilievi sono lo stesso, ed è la riga meno urgente che un\nreport possa contenere.",[10,246,247,248,252],{},"Le intestazioni di sicurezza del browser le manda ciò che serve la tua pagina.\nSul dominio proprio di un builder è il builder, ed è per questo che il numero è\n96% qui, 99% su Lovable e 100% su v0, e per questo ogni app sullo stesso host\nriceve la stessa risposta. Replit è uno dei pochi posti in cui puoi cambiarlo:\nse la tua app fa girare il proprio server, è quel server a mandare le\nintestazioni, e ",[78,249,251],{"href":250},"\u002Fblog\u002Fmissing-security-headers","aggiungerle sono poche righe",".\nVale la pena farlo, e non è di questo che è fatta una D.",[10,254,255],{},"Togli quella riga, e 1.798 delle 3.042 app non avevano nulla che nascesse da\nciò che era stato costruito. Le altre 1.244 sono il posto in cui vive il resto\ndi questo articolo.",[25,257,259],{"id":258},"il-rilievo-tipico-di-replit-una-route-api-tutta-tua","Il rilievo tipico di Replit: una route API tutta tua",[10,261,262],{},"La cosa più comune che abbiamo trovato e che un proprietario aveva messo lì da\nsé era una route sul server dell’app stessa che rispondeva a uno sconosciuto\ncon dei dati. 1.050 app su 3.037 ne avevano almeno una.",[10,264,265,266,269,270,273],{},"Un’app Lovable è un front end più un database che fa girare qualcun altro.\nUn’app Replit è di solito tutto il negozio: la pagina, e dietro un server che\nparla con il database, nello stesso progetto e spesso scritti nella stessa\nsessione. Il settimo dei nostri nove controlli legge i percorsi API scritti nel\nJavaScript della tua app, ",[176,267,268],{},"\u002Fapi\u002Forders",", ",[176,271,272],{},"\u002Fapi\u002Fusers",", qualunque cosa trovi, e\nchiede a ciascuno, senza login, se risponde. Su Lovable è scattato su 8 app su\n18.518, perché di solito non c’è un server del proprietario a cui chiedere. Su\nReplit è scattato su 1.050.",[61,275],{"alt":276,"caption":277,"src":278},"Due app disegnate fianco a fianco. A sinistra, una pagina del browser con una freccia tratteggiata che esce dal pannello verso un cilindro di database all’esterno, e il numero 8 sotto. A destra, una pagina del browser con un server disegnato dietro nello stesso pannello, un visitatore sul bordo del pannello che riceve un blocco di dati da quel server, e il numero 1.050 sotto.","L’app a sinistra non ha un server proprio da lasciare aperto. Quella a destra sì, ed è lì che stanno i suoi rilievi.","\u002Fblog\u002Fis-replit-safe\u002Fthe-server-you-own-1600x640.png",[10,280,281,282,284],{},"È classificato medio perché a volte è esattamente giusto così. Una route che\nrestituisce il tuo elenco pubblico di prodotti deve rispondere a tutti. È\nsbagliato quando la route è ",[176,283,272],{}," e la risposta sono i tuoi utenti con i\nloro indirizzi e-mail, e lo scopri perché chiunque può aprire quell’indirizzo\nin una scheda e leggerlo. Una route che deve essere privata ha bisogno di un\ncontrollo del login, e chiunque non ce l’abbia riceve un 401.",[10,286,287,288,292],{},"Nel negozio, questa è la porta sul retro che si apre dalla strada. Se hai usato\nSupabase, è lo stesso guasto che hai visto descritto come\n",[78,289,291],{"href":290},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","una tabella senza Row Level Security",",\nin una forma diversa. Le righe si leggono perché niente tra lo sconosciuto e i\ndati ha chiesto chi fosse.",[10,294,295,296,82],{},"Due rilievi più piccoli gli stanno accanto. 76 app hanno detto a qualsiasi sito\ndel mondo che poteva chiamare la loro API, e altre 56 lo hanno permesso con i\ncookie di login del visitatore allegati, che è la versione che lascia un altro\nsito agire come il tuo utente e\n",[78,297,299],{"href":298},"\u002Fblog\u002Fcors-wildcard-security-risk","quella che raramente è giusta",[25,301,303],{"id":302},"di-cosa-è-fatto-il-7-ha-spedito-un-secret","Di cosa è fatto «il 7% ha spedito un secret»",[10,305,306,307,311],{},"Soprattutto di chiavi Google. 219 delle 3.042 app avevano qualcosa a forma di\nchiave nel codice che un visitatore scarica, e 200 di queste erano una chiave\nAPI di Google, che di solito va bene una volta che è stata\n",[78,308,310],{"href":309},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","limitata al tuo dominio",". Trentadue\nportavano un valore a forma di chiave che non siamo riusciti ad attribuire a un\nfornitore. Tre app tenevano una chiave che addebita un account direttamente:\nuna chiave OpenAI, Anthropic o AWS.",[10,313,314],{},"Tre su 3.042 è raro. È anche il rilievo che costa soldi da solo, la chiave della\ncassa lasciata sul bancone, e tende a farsi vedere come una fattura di consumo\nche arriva prima che qualcuno se ne sia accorto. Uno scanner che confronta\nforme stamperebbe tutte e 219 come problemi; noi leggiamo cosa può fare\nciascuna chiave, perché l’alternativa è insegnarti a ignorare l’avviso il\ngiorno in cui conta.",[10,316,317,318,322,323,179,326,329],{},"Su Replit la strada che una chiave fa per entrare nel bundle è abbastanza\nparticolare da avere ",[78,319,321],{"href":320},"\u002Fblog\u002Freplit-secrets-explained","un articolo suo",". Lo\nstrumento Secrets tiene un valore fuori dai tuoi file, e lo fa bene. Non può\ntenerlo fuori dal browser se è codice del browser a leggerlo, e il modo in cui\nla gente lo fa funzionare è rinominare la variabile ",[176,324,325],{},"VITE_",[176,327,328],{},"NEXT_PUBLIC_",",\nche è un’istruzione allo strumento di build di pubblicarla.",[25,331,333],{"id":332},"i-due-che-sistemi-con-unimpostazione","I due che sistemi con un’impostazione",[10,335,336],{},"Le source map e un file privato finito dove non doveva. Entrambi si decidono in\ncome il progetto viene costruito, ed entrambi sono un’impostazione e non una\nriscrittura.",[10,338,339,340,344],{},"168 app pubblicavano le source map, il che significa che i file originali\ndietro l’app, commenti compresi, si leggono dagli strumenti per sviluppatori di\nqualsiasi browser. Su Replit la configurazione di build è nel tuo progetto,\nquindi l’interruttore è tuo;\n",[78,341,343],{"href":342},"\u002Fblog\u002Fsource-maps-exposed-in-production","cosa espone e cosa non espone una map pubblicata","\nvale la pena leggerlo prima di decidere che non conta.",[10,346,347,348,350,351,353,354,356,357,360],{},"Sette app servivano un file privato da un URL qualunque: un ",[176,349,178],{},", un\n",[176,352,182],{},". Cinque delle nove app valutate D o F avevano questo rilievo, ed è\nla strada più corta verso una brutta giornata di tutta la lista, perché un\n",[176,355,178],{}," a un URL è ogni chiave che contiene in una richiesta sola. In una finestra\nprivata, apri il tuo indirizzo pubblicato con ",[176,358,359],{},"\u002F.env"," in fondo. Deve fallire. Se\nmostra del testo, ruota oggi ogni chiave in quel file, poi togli il file da ciò\nche pubblichi.",[25,362,364],{"id":363},"il-codice-che-scrive-lagente-di-replit-è-sicuro","Il codice che scrive l’agente di Replit è sicuro?",[10,366,367],{},"Non l’abbiamo misurato, e nessuna scansione dall’esterno può farlo. Quello che\nuna scansione vede è il risultato: le 1.050 route aperte e le tre chiavi che\naddebitano le ha scritte qualcuno, un agente o una persona, e le ha pubblicate.",[10,369,370],{},"Quello che è agli atti è un evento. Nel luglio 2025 l’agente di Replit ha\ncancellato un database di produzione nel mezzo di una sessione in cui gli era\nstato detto di non cambiare nulla, e il CEO di Replit lo ha riconosciuto\npubblicamente; separare i database di sviluppo da quelli di produzione è stata\nparte della risposta dell’azienda. Quello che ne segue per te è lo stesso su\nogni builder con un agente dentro: tieni l’agente lontano dal database in\nproduzione, e tieni una copia dei tuoi dati da qualche parte dove l’agente non\narriva.",[10,372,373,374,378],{},"Dove vive quella copia dipende da dove sono i tuoi dati. Se la tua app Replit\nli tiene in Supabase, è ",[78,375,377],{"href":376},"\u002Fsupabase-backups","ciò che Care conserva",". Se sono nel\ndatabase di Replit stesso, non possiamo farne il backup, e la cosa da leggere\nprima di averne bisogno è cosa offre lo strumento database di Replit per un\nripristino. Solo 14 delle 3.042 app Replit scansionate nominavano un progetto\nSupabase, quindi per la maggior parte vale il secondo caso.",[25,380,382],{"id":381},"il-controllo-in-cinque-minuti-della-tua-app-replit","Il controllo in cinque minuti della tua app Replit",[10,384,385],{},"Ognuno è un URL che apri o una ricerca che lanci. Usa una finestra privata,\ncosì il tuo login non risponde al posto di uno sconosciuto.",[36,387,388,398,401,410,413],{},[39,389,390,391,393,394,397],{},"Apri il tuo indirizzo pubblicato con ",[176,392,359],{}," in fondo, poi con\n",[176,395,396],{},"\u002F.git\u002Fconfig",". Entrambi devono fallire. Se uno dei due mostra del testo,\nruota oggi ogni chiave che contiene.",[39,399,400],{},"Apri allo stesso modo una delle tue route API, una che non vorresti far\nleggere a uno sconosciuto. Se risponde, quella route ha bisogno di un\ncontrollo del login.",[39,402,403,404,406,407,409],{},"Cerca ",[176,405,325],{}," e ",[176,408,328],{}," nel tuo progetto. Ogni risultato è un valore\nche il tuo strumento di build pubblica apposta, e ognuno deve essere una\nchiave che era sicuro pubblicare.",[39,411,412],{},"Apri la tua app online, poi la scheda Sources degli strumenti per\nsviluppatori del browser. Se riesci a leggere i tuoi file originali con i\ncommenti, le source map sono attive.",[39,414,415,416,82],{},"Oppure lascia fare alla scansione. Esegue questi quattro e altri cinque\ndall’esterno, impiega circa 20 secondi, non richiede un account, e stampa\n«Impossibile controllare» per tutto ciò a cui non ha potuto rispondere\ninvece di una spunta: ",[78,417,419],{"href":418},"\u002Fsecurity-scanner","scansiona la tua app",[25,421,423],{"id":422},"cosa-cambia-dopo-che-pubblichi-di-nuovo","Cosa cambia dopo che pubblichi di nuovo?",[10,425,426],{},"Qualsiasi cosa. Pubblicare su Replit è un gesto solo, quindi una modifica è\nonline nel momento in cui la fai, e non c’è nessun passaggio di deploy tra te e\ninternet a fermare una route che ha perso il suo controllo del login o una\nchiave incollata a mezzanotte per superare una build che falliva. Una scansione\nfatta il mese scorso descrive l’app del mese scorso.",[10,428,429,433],{},[78,430,432],{"href":431},"\u002Fpricing","Reeve Monitor"," è costruito per questa forma di app: qualcuno che\npassa davanti al negozio ogni ora e prova le porte. Rilancia tutti e nove i\ncontrolli ogni ora su fino a tre app, sorveglia la disponibilità ogni 60\nsecondi, ti avvisa quando un risultato cambia invece di aspettare che tu vada a\nguardare, e manda un report mensile. Costa €12 al mese a listino, con sette\ngiorni gratis prima di addebitarti qualcosa; la pagina dei prezzi a volte sta\nsotto la cifra scritta qui e mai sopra. Monitor sorveglia e niente altro, che\nper un’app Replit è di solito la metà giusta: Care, il nostro piano di backup,\nconserva soltanto una copia di un database Supabase, e la maggior parte delle\napp Replit tiene i dati da un’altra parte.",[25,435,437],{"id":436},"cosa-fare-questa-settimana","Cosa fare questa settimana",[439,440,441],"key-takeaways",{},[442,443,444,452,455,462,465],"ul",{},[39,445,446,447,406,449,451],{},"Apri ",[176,448,359],{},[176,450,396],{}," sul tuo indirizzo pubblicato in una finestra privata. Entrambi devono fallire.",[39,453,454],{},"Apri le tue route API senza login. Qualsiasi route che risponde con dati privati ha bisogno di un controllo del login, e di un 401 per tutti gli altri.",[39,456,403,457,406,459,461],{},[176,458,325],{},[176,460,328],{}," nel progetto. Ogni risultato è pubblicato apposta e deve essere una chiave che era sicuro pubblicare.",[39,463,464],{},"Disattiva le source map nella configurazione di build, a meno che tu non voglia i file originali leggibili dal browser.",[39,466,467],{},"Tieni l’agente lontano dal database in produzione, e tieni una copia dei tuoi dati da qualche parte dove non arriva.",[10,469,470,471,475,476,480],{},"La guida passo passo per questa piattaforma è\n",[78,472,474],{"href":473},"\u002Fis-your-replit-app-safe","la tua app Replit è sicura?",", e la\n",[78,477,479],{"href":478},"\u002Fchecklist","checklist di sicurezza in 10 minuti"," copre ciò che vale la pena\nconfermare su qualsiasi app appena lanciata.",{"title":482,"searchDepth":483,"depth":483,"links":484},"",3,[485,487,488,489,490,491,492,493,494,495],{"id":27,"depth":486,"text":28},2,{"id":68,"depth":486,"text":69},{"id":240,"depth":486,"text":241},{"id":258,"depth":486,"text":259},{"id":302,"depth":486,"text":303},{"id":332,"depth":486,"text":333},{"id":363,"depth":486,"text":364},{"id":381,"depth":486,"text":382},{"id":422,"depth":486,"text":423},{"id":436,"depth":486,"text":437},"Basi della sicurezza","\u002Fblog\u002Fis-replit-safe\u002Fcover-1200x630.png","Il logo di Replit su una piastrella bianca, una freccia verso una pagina con un server dietro, e una freccia verso tre visitatori.","Replit è sicuro? Abbiamo passato 3.042 app Replit online per nove controlli esterni. I rilievi stavano nell’app pubblicata, non nell’host.",false,"md",[503,506,509,512,515],{"q":504,"a":505},"Replit è sicuro per un prodotto vero?","Come host, niente nelle 3.042 app Replit online che abbiamo scansionato puntava all’hosting: ogni certificato che siamo riusciti a leggere era valido e nessun dominio era vicino alla scadenza. I rilievi che hanno deciso un voto stavano tutti dentro l’app che ciascun proprietario ha pubblicato, e hanno la stessa forma su ogni builder che abbiamo misurato. Se il tuo prodotto è sicuro da far girare lì dipende da cosa la tua app consegna a un visitatore, ed è una cosa che puoi controllare in cinque minuti circa.",{"q":507,"a":508},"I Replit Secrets sono davvero segreti?","Per il lavoro che fanno, sì. Il valore è cifrato e tenuto fuori dai file del progetto, quindi condividere o forkare il progetto non lo consegna. Quello che lo strumento non può decidere è dove la tua app porta il valore dopo. Una chiave letta da codice che gira sulla macchina di Replit resta lì. Una chiave letta da codice che gira nel browser del visitatore viene incorporata in ciò che pubblichi, ovunque fosse conservata, e una variabile chiamata VITE_ o NEXT_PUBLIC_ è esattamente questo.",{"q":510,"a":511},"Le persone possono vedere il mio codice sorgente su Replit?","La metà browser, sempre, perché un browser non può disegnare una pagina che non gli è stata inviata. Se la vedono come i file originali che hai scritto o come output compresso dipende dalle source map, che 168 delle 3.041 app Replit controllate stavano pubblicando. Il tuo codice server resta su Replit, a meno che un file privato come .env o .git\u002Fconfig non abbia ricevuto un URL pubblico, cosa che 7 app su 3.023 avevano fatto.",{"q":513,"a":514},"Un’app Replit pubblicata è sicura per impostazione predefinita?","Non c’è un’impostazione predefinita che la renda sicura e nessuna che la renda pericolosa. 2.789 delle 3.042 app scansionate hanno preso una A. Quelle che non l’hanno presa avevano un rilievo nato da ciò che era stato costruito: una route sul proprio server che rispondeva senza login, una chiave nel codice scaricato, o un file privato a un indirizzo pubblico. Niente nell’hosting ha prodotto una D o una F.",{"q":516,"a":517},"Qual è il problema di sicurezza più comune nelle app Replit?","Lasciando da parte le intestazioni, che mancano a quasi ogni app su ogni builder, è una route API che risponde a uno sconosciuto con dei dati. 1.050 delle 3.037 app Replit su cui quel controllo ha potuto rispondere ne avevano almeno una. Un’app Replit di solito porta con sé il proprio server, quindi ha route proprie da lasciare aperte, dove un’app Lovable in genere non ne ha.","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",[520,521,522,523,524,525,526],"replit è sicuro","replit sicurezza","app replit sicura","sicurezza app replit","le app replit sono sicure","sicurezza deployment replit","is replit safe",{},true,"\u002Fblog\u002Fis-replit-safe","2026-09-15",{"title":5,"description":499},"blog\u002Fis-replit-safe",[534,535,536],"Replit è sicuro? Come host, non era lì che stavano i rilievi. Ognuna delle nove app su 3.042 valutate D o F ci è arrivata per qualcosa dentro l’app stessa.","Il rilievo tipico di Replit è un’API propria: 1.050 app su 3.037 avevano una route che consegnava dati a uno sconosciuto senza login, perché un’app Replit di solito esce con il proprio server.","Di 219 app con qualcosa a forma di chiave nel codice scaricato, tre tenevano una chiave che addebita un account. 2.789 delle 3.042 hanno preso una A.","4jfCvsh3O1P5MRILegpA5Bgcxn_jK34E5qzcca1Im4I",[539,546,552,558,564,570,576,582,588,589,595,601,607,613,619,625,631,637,643,649,654,660,666,672,677,683,689,695,701,706,712,718,724,729,735,740,744,750,756,762,767,773],{"path":540,"title":541,"description":542,"published":543,"category":544,"image":545,"draft":500},"\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":547,"title":548,"description":549,"published":550,"category":496,"image":551,"draft":500},"\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":553,"title":554,"description":555,"published":556,"category":496,"image":557,"draft":500},"\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":559,"title":560,"description":561,"published":562,"category":496,"image":563,"draft":500},"\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":565,"title":566,"description":567,"published":568,"category":496,"image":569,"draft":500},"\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":571,"title":572,"description":573,"published":574,"category":496,"image":575,"draft":500},"\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":577,"title":578,"description":579,"published":580,"category":496,"image":581,"draft":500},"\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":583,"title":584,"description":585,"published":586,"category":496,"image":587,"draft":500},"\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":529,"title":5,"description":499,"published":530,"category":496,"image":518,"draft":500},{"path":590,"title":591,"description":592,"published":593,"category":544,"image":594,"draft":500},"\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":596,"title":597,"description":598,"published":599,"category":544,"image":600,"draft":500},"\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":602,"title":603,"description":604,"published":605,"category":544,"image":606,"draft":500},"\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":608,"title":609,"description":610,"published":611,"category":496,"image":612,"draft":500},"\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":614,"title":615,"description":616,"published":617,"category":496,"image":618,"draft":500},"\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":620,"title":621,"description":622,"published":623,"category":496,"image":624,"draft":500},"\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":626,"title":627,"description":628,"published":629,"category":496,"image":630,"draft":500},"\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":632,"title":633,"description":634,"published":635,"category":496,"image":636,"draft":500},"\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":638,"title":639,"description":640,"published":641,"category":496,"image":642,"draft":500},"\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":644,"title":645,"description":646,"published":647,"category":496,"image":648,"draft":500},"\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":250,"title":650,"description":651,"published":652,"category":496,"image":653,"draft":500},"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":655,"title":656,"description":657,"published":658,"category":496,"image":659,"draft":500},"\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":661,"title":662,"description":663,"published":664,"category":496,"image":665,"draft":500},"\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":667,"title":668,"description":669,"published":670,"category":544,"image":671,"draft":500},"\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":320,"title":673,"description":674,"published":675,"category":496,"image":676,"draft":500},"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":678,"title":679,"description":680,"published":681,"category":544,"image":682,"draft":500},"\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":684,"title":685,"description":686,"published":687,"category":496,"image":688,"draft":500},"\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":690,"title":691,"description":692,"published":693,"category":496,"image":694,"draft":500},"\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":696,"title":697,"description":698,"published":699,"category":496,"image":700,"draft":500},"\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":298,"title":702,"description":703,"published":704,"category":496,"image":705,"draft":500},"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":707,"title":708,"description":709,"published":710,"category":544,"image":711,"draft":500},"\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":713,"title":714,"description":715,"published":716,"category":544,"image":717,"draft":500},"\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":719,"title":720,"description":721,"published":722,"category":496,"image":723,"draft":500},"\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":309,"title":725,"description":726,"published":727,"category":496,"image":728,"draft":500},"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":730,"title":731,"description":732,"published":733,"category":544,"image":734,"draft":500},"\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":290,"title":736,"description":737,"published":738,"category":496,"image":739,"draft":500},"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":342,"title":741,"description":742,"published":738,"category":496,"image":743,"draft":500},"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":745,"title":746,"description":747,"published":748,"category":496,"image":749,"draft":500},"\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":751,"title":752,"description":753,"published":754,"category":544,"image":755,"draft":500},"\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":757,"title":758,"description":759,"published":760,"category":496,"image":761,"draft":500},"\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":763,"title":764,"description":765,"published":760,"category":544,"image":766,"draft":500},"\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":768,"title":769,"description":770,"published":771,"category":544,"image":772,"draft":500},"\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":774,"title":775,"description":776,"published":771,"category":496,"image":777,"draft":500},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Quali chiavi API sono sicure nel browser e quali no","La tua chiave anon di Supabase è fatta per essere pubblica. La chiave service_role no, e ignora ogni regola che imposti. Come distinguerle.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150956036]