Teknisk Guide
5 saker du måste tänka på när du bygger en app med Lovable: Säkerhet, prestanda & drift
Av Rasmus, RSHO Media | Publicerad 17 maj 2026 | Lästid 5 min
Du har byggt en app i Lovable över en helg. Auth fungerar, den ser proffsig ut och databasen sparar data precis som den ska. Då är det väl bara att publicera?
Det är precis där det går fel.
Enligt Don Zvi, säkerhetsforskare och VD på cybersäkerhetsföretaget Redaccess, har tusentals appar byggda med AI-verktyg som Lovable, Replit, Base44 och Netlify läckt personlig data på internet, inte för att verktygen är dåliga, utan för att de gör sin uppgift lite för väl. Lovable levererar en app som ser helt felfri ut. Inloggningen fungerar. Datan sparas. Allt ser professionellt ut.
Men det är just det som är faran.
Lovable bygger din frontend – det vill säga det användaren ser och interagerar med i webbläsaren. Allt som lever i frontenden är i princip offentligt: en tillräckligt motiverad användare kan öppna DevTools och inspektera precis vad som helst. AI:n optimerar för att saker ska fungera i demo-format, inte för att hålla i produktion. Att ta en app från demo till produkt kräver att du själv tar ansvar för det AI:n inte ser.
Här är de fem vanligaste säkerhetsmissarna i Lovable-appar och hur du åtgärdar dem.
1. Row Level Security (RLS) i Supabase
Vad är RLS?
RLS, Row Level Security, eller säkerhet på radnivå, är en funktion i Supabase som låter dig styra vilka rader i databasen en specifik användare får läsa eller skriva. Utan RLS kan en inloggad användare i teorin läsa all data i din databas, inte bara sin egen. Genom att implementera RLS flyttas säkerhetsansvaret från applikationskoden (frontend) till databasnivån, vilket resulterar i en avsevärt säkrare lösning.
Tänk dig en app där användare sparar privata anteckningar. Utan RLS kan användare tekniskt sett hämta varandras anteckningar via API:et – även om din frontend aldrig visar dem. Med RLS sätter du en regel direkt i databasen: "En användare får bara se rader där user_id matchar deras egen session."
Hur aktiverar du det?
Gå till Supabase dashboard → Table Editor → välj din tabell → klicka på "RLS disabled" för att aktivera det. Sedan behöver du skapa policies. Be Lovable om hjälp med följande prompt:
"Aktivera RLS på tabellen [tabellnamn] och skapa policies så att inloggade användare bara kan läsa och skriva sina egna rader baserat på user_id."
Gör det här för varje tabell som innehåller användardata.
Varning: Säkerställ att du aldrig råkar använda din service_role-nyckel i Lovable. Denna masternyckel rundar all RLS och ska ALDRIG finnas i frontenden.
Authentication
Row Level Security (RLS)
public.notes
Säkrad
public.profiles
Sårbar
2. Hårdkodade API-nycklar i frontend
Kom ihåg: Lovable bygger frontend och allt i frontenden kan inspekteras av vem som helst. Om din app anropar ett externt API som OpenAI, Stripe eller en vädertjänst finns det en stor risk att API-nyckeln ligger direkt i din frontend-kod. Det innebär att vem som helst som öppnar webbläsarens DevTools kan se och kopiera den.
Varför är det ett problem?
En exponerad API-nyckel kan användas av vem som helst för att göra anrop på ditt konto. Beroende på tjänst kan det innebära oväntade kostnader, missbruk eller att din nyckel blockeras.
Lösningen: Supabase Edge Functions
Edge Functions agerar som en säker, serverlös funktion (Serverless Function) mellan din frontend och omvärlden. De körs på Supabase servrar, utanför användarens räckvidd – det är här hemliga nycklar ska leva.
Istället för att låta frontend anropa det externa API:et direkt skapar du en Edge Function som mellanhand:
- Frontend anropar din Edge Function
- Edge Function hämtar API-nyckeln från Supabase Secrets (inte från koden)
- Edge Function anropar det externa API:et och returnerar svaret
Be Lovable skapa det åt dig:
"Skapa en Supabase Edge Function som anropar [extern tjänst] med API-nyckeln lagrad i Supabase Secrets. Frontend ska anropa Edge Function istället för tjänsten direkt."
Lovable har en inbyggd hemlighetshanterare, men för produktionssystem rekommenderar jag Supabase Secrets – det är säkrare eftersom nycklarna aldrig exponeras i Lovable-projektets miljö.
Säker dataflöde via Edge Function
Klient
Frontend / Webbläsare
Säker backend
Supabase Edge Function
Externt API
Stripe / OpenAI
API-nyckeln lämnar aldrig backend. Frontend ser bara svaret.
3. Autentisering som ser rätt ut men inte är det
Det vanligaste autentiseringsmisstaget i Lovable-appar är inte att inloggningen saknas – det är att den bara ser ut att fungera.
Du har en inloggningssida, ett dashboard och en navbar som visar "Logga ut". Allt känns rätt. Men om någon skriver in din-app.lovable.app/dashboard direkt i adressfältet; kommer de in ändå?
I många Lovable-appar är svaret ja.
Varför händer det?
Lovable genererar skydd på komponentnivå – komponenten kollar om du är inloggad och renderar rätt innehåll. Det som ofta saknas är skydd på rutnivå, det vill säga att själva sidan är blockerad innan den laddas.
- Komponentskydd (otillräckligt): Sidan laddas, och om du inte är inloggad döljs innehållet.
- Rutskydd (korrekt): Du omdirigeras till login innan något laddas överhuvudtaget.
Så här fixar du det
Be Lovable skapa en Protected Route-komponent:
"Skapa en ProtectedRoute-komponent som använder Supabase auth. Om användaren inte är inloggad ska den omdirigera till /login. Använd den för att wrappa alla skyddade sidor i routern."
Kontrollera sedan att varje känslig sida i din router faktiskt är wrappade med den.
Glöm inte backend-validering
Även med rutskydd på frontend måste du validera sessionen i varje Edge Function som hanterar känslig data. En angripare kan anropa dina Supabase-endpoints direkt utan att gå via din app. Lägg alltid in det här i dina Edge Functions:
// Initiera supabase-klienten med Auth-headern från anropet
const { data: { user } } = await supabase.auth.getUser()
if (!user) return new Response('Unauthorized', { status: 401 })Den här raden ska finnas i varje Edge Function som hanterar känslig data. Utan den litar du på att frontenden alltid beter sig rätt och det kan du aldrig göra.
4. Öppna databastabeller och felaktiga behörigheter
RLS skyddar vilka rader användare kan se men du måste också tänka på vad inloggade användare kan göra med data de har tillgång till.
Ett vanligt scenario: en användare kan se sin egen profil. Men kan de även uppdatera en annan användares profil om de känner till rätt ID? I en Lovable-app utan korrekta write-policies är svaret ofta ja.
Fyra behörigheter att kontrollera
I Supabase sätter du separata policies för SELECT, INSERT, UPDATE och DELETE. En vanlig miss är att sätta en läspolicy men glömma skrivpolicyn.
Gå igenom varje tabell och ställ dig frågorna:
- Ska anonyma användare kunna läsa den här tabellen?
- Ska en inloggad användare kunna skriva till rader de inte äger?
- Finns det admin-data som bara du ska kunna ändra?
Be Lovable generera policies för varje tabell och granska dem manuellt. Det tar fem minuter per tabell och kan spara dig en allvarlig incident.
5. Miljövariabler som läcker i källkoden
I Lovable och Vite-baserade projekt har miljövariabler som börjar med VITE_ ett viktigt beteende: de kompileras in i frontend-koden och är synliga för vem som helst som inspekterar sidan.
Det är avsiktligt för icke-känsliga värden men om du lägger en hemlig nyckel i en VITE_-variabel är den i praktiken publik.
Tumregel: vad som hör hemma var
✓ OK i frontend (VITE_-prefix)
| Variabel | Prefix | Förklaring |
|---|---|---|
| Supabase URL | VITE_ | Publik – behövs i frontend |
| Supabase Anon Key | VITE_ | Publik – skyddas av RLS |
✗ Måste ligga i backend (Supabase Secrets)
| Variabel | Prefix | Förklaring |
|---|---|---|
| OpenAI API-nyckel | Inget | Anropas enbart från Edge Function |
| Stripe Secret Key | Inget | Anropas enbart från Edge Function |
| Övriga hemliga nycklar | Inget | Aldrig i frontend-koden |
Allt med VITE_-prefix hamnar i frontend-koden och kan läsas av användaren. Hemliga nycklar ska aldrig ha VITE_-prefix – de ska lagras i Supabase Secrets och enbart anropas från en Edge Function på serversidan.
Om du är osäker på om en nyckel ska vara publik, anta att den inte ska det och lägg den i Supabase Secrets.
VITE_SUPABASE_ANON_KEY="abc..."# OK i frontend — skyddas av RLSOPENAI_API_KEY="sk-..."# MÅSTE ligga i Supabase Secrets, ALDRIG med VITE_ prefix!Checklista
Innan du går live
- RLS är aktiverat på alla tabeller med användardata
- Policies finns för SELECT, INSERT, UPDATE och DELETE där det behövs
- Inga hemliga API-nycklar finns i frontend-koden
- Externa API-anrop går via Supabase Edge Functions
- Alla skyddade sidor använder en ProtectedRoute-komponent
- Varje Edge Function validerar användarens session
- Hemliga miljövariabler saknar VITE_-prefix
Redan live? Prioritera så här
Om din app redan är publicerad – åtgärda i den här ordningen:
- RLS och databehörigheter – störst risk för dataintrång
- Exponerade API-nycklar – kan ge direkta ekonomiska konsekvenser
- Rutskydd i autentisering – förhindrar obehörig åtkomst
- Miljövariabler – gå igenom alla och flytta känsliga till Secrets