Security-check voor je app
Tien checks die je zonder programmeerkennis doet voordat je app uit Lovable, Bolt, v0, Replit of Cursor live gaat, met gratis tools en een audit-prompt.
In het kort
De meeste lekken in AI-gebouwde apps hebben dezelfde oorzaak: de database is niet afgeschermd (Row Level Security uit of fout) of er staat een geheime sleutel in de frontend. Bij Lovable lekten zo 170 van 1.645 gescande apps (CVE-2025-48757). Test RLS met twee accounts, zoek je site door op sleutels, draai de Supabase Security Advisor en meld een datalek binnen 72 uur bij de Autoriteit Persoonsgegevens.
- Beginner
- 7 min
- gratis
- Feiten gecheckt op 2 november 2026
- Voltooid
Je app werkt, dus hij is klaar? Nee: AI-bouwers maken apps die werken, niet per se apps die dicht zitten. Doe deze check vóór je echte gebruikers binnenlaat.
Na deze les heb je: je app langs tien checks gehaald, met gratis tools, en je weet wat je doet als er toch iets lekt.
Zo ging het mis bij anderen
Section titled “Zo ging het mis bij anderen”| Wat | Wanneer | Oorzaak | Gevolg |
|---|---|---|---|
| Lovable (CVE-2025-48757) | gemeld mrt 2025 | RLS ontbrak of was fout in gegenereerde apps | 170 van 1.645 gescande apps lekten e-mails, betaalgegevens en API-sleutels. Bij één app zetten de onderzoekers zelf de betaalstatus op “paid”. |
| Moltbook | jan-feb 2026 | Supabase-sleutel in de frontend én geen RLS | 1,5 miljoen API-tokens en 35.000 e-mailadressen leesbaar en aanpasbaar. |
| Base44 | jul 2025 | Registratie-endpoints van het platform zonder controle | Met alleen een publiek zichtbaar app-ID kon je een account maken op “private” apps. Binnen 24 uur gefikst. |
Het patroon: niemand brak in, de deur stond open. Twee begrippen die je moet kennen:
- RLS (Row Level Security): regels in je database die bepalen welke rijen iemand mag zien. Uit = iedereen met je project-URL kan alles lezen, wijzigen en verwijderen.
- Publishable vs. secret key: de publishable key (
sb_publishable_…, vroegeranon) mag in de browser. De secret key (sb_secret_…, vroegerservice_role) omzeilt RLS en hoort alleen op een server.
De tien checks
Section titled “De tien checks”| # | Check | Zo test je het |
|---|---|---|
| 1 | RLS op elke tabel | Supabase → Advisors → Security Advisor: nul errors. Maak dan twee testaccounts en kijk of account B iets van account A ziet of kan wijzigen. |
| 2 | Geen geheime sleutels in de frontend | Open je live site → DevTools (F12) → zoek in alle bestanden (Ctrl+Shift+F, Mac: Cmd+Option+F) op sb_secret, service_role, sk- en sk-ant-. Eén treffer = probleem. |
| 3 | Login op elke pagina, serverzijdig gecheckt | Log uit en open elke pagina en elke /api/…-URL direct in je browser. Kom je erin, dan controleert alleen de knop, niet de server. |
| 4 | Rate limiting | Vraag je AI-bouwer: “Waar zit een limiet op login, aanmelden en elke AI-aanroep?” Zonder limiet betaal jij de AI-rekening van een ander. |
| 5 | Invoercontrole | Typ <script>alert(1)</script> en een enorm lange tekst in elk formulier. Popup of crash? Dan wordt invoer niet gecontroleerd. Alleen op je eigen app. |
| 6 | Dependency-audit | npm audit --omit=dev in je projectmap, of zet Dependabot alerts aan op GitHub. |
| 7 | Security headers | Scan je URL met securityheaders.com of de MDN HTTP Observatory. Streef naar een A. |
| 8 | Backups | Kijk in je Supabase-dashboard welke backups je plan heeft, en exporteer zelf maandelijks je data. |
| 9 | Logging en alarmen | Weet waar je Supabase-logs staan en zet een budgetalarm bij elke AI-provider. |
| 10 | Privacyverklaring en AVG | Privacyverklaring online, verwerkersovereenkomst met elke dienst die persoonsgegevens krijgt, EU-regio gekozen waar het kan. |
Gratis tools
Section titled “Gratis tools”| Tool | Wat het vindt | Waar |
|---|---|---|
| Supabase Security Advisor | Tabellen zonder RLS (lint 0013_rls_disabled_in_public), policies die niet actief zijn |
Supabase Studio → Advisors |
| npm audit | Bekende kwetsbaarheden in je packages | Terminal, in je projectmap |
| Dependabot + secret scanning | Kwetsbare packages en gelekte sleutels in je repo | GitHub → je repo → Settings → Advanced Security |
| securityheaders.com / MDN HTTP Observatory | Ontbrekende security headers | In je browser |
| OWASP ZAP baseline | Passieve scan: kijkt rond, valt niet aan | docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py -t https://jouw-app.nl |
Scan alleen je eigen app. Andermans site scannen zonder toestemming kan strafbaar zijn.
Laat de AI zijn eigen code auditen
Section titled “Laat de AI zijn eigen code auditen”Open een nieuwe sessie (of een ander model) en plak:
Je bent een security-reviewer. Verander nog niets.1. Maak een lijst van elke databasetabel. Per tabel: staat RLS aan, welke policies zijn er voor anon en authenticated, en kan gebruiker A rijen van gebruiker B lezen of wijzigen? Toon de SQL.2. Zoek in alle frontend-code naar sleutels, tokens en URL's met wachtwoorden. Welke horen op de server? Geef bestand en regel.3. Maak een tabel van alle routes en API-endpoints: welke vereisen login, en welke controleren of de gebruiker eigenaar is van de data? Markeer elke route zonder eigenaarscheck.4. Schrijf een test die met twee testaccounts probeert elkaars data te lezen, te wijzigen en te verwijderen. Rapporteer wat lukte.Dit is geen garantie. Het model dat de fout maakte, ziet hem vaak niet: in een Lovable-app met 18.697 gelekte records (feb 2026) had de AI de inlogcontrole precies omgekeerd geschreven. Vraag daarom om bewijs (een test die faalt of slaagt), niet om een geruststelling.
Checklist
0/10
Je voortgang wordt alleen in deze browser bewaard.
Test jezelf
1Welke Supabase-sleutel mag in je frontend staan?
De secret key omzeilt RLS volledig; die hoort alleen op een server.
2Waarom test je RLS met twee accounts?
3Je ontdekt op maandag 9:00 dat er e-mailadressen lekten. Wanneer meld je uiterlijk bij de AP?
Art. 33 AVG: zonder onredelijke vertraging en indien mogelijk binnen 72 uur na ontdekking.
Klaar met het leerpad Security-basis? Doe de security-scan nog eens en kijk hoeveel er nu op groen staat.