Direct naar inhoud

Is mijn gevibecodede app veilig?

Kort antwoord

Dat zie je niet aan de buitenkant: een app kan goed werken en toch lekken. De twee lekken die het vaakst voorkomen: een geheime API-sleutel in de code die in de browser draait, en een database zonder regels over wie welke gegevens mag zien. Bij Supabase heet dat Row Level Security. Voordat er echte gebruikers op je app komen, moeten die twee goed staan.

Welke lekken komen het vaakst voor?

Kort: Een geheime sleutel in de front-end, een database zonder toegangsregels, controles alleen in de browser en beheerpagina's die open staan.

Gevibecodede apps lekken zelden door slimme hackers. Ze lekken door een paar fouten die steeds terugkomen:

  • Een geheime sleutel in de front-end. De front-end is alles wat in de browser van je bezoeker draait. Wie op een website rechts klikt en "Inspecteren" kiest, kan die code lezen. Een geheime sleutel die daar staat, is dus openbaar.
  • Een database zonder toegangsregels. De app laat elke gebruiker alleen zijn eigen gegevens zien, maar de database zelf geeft alles aan iedereen die het vraagt.
  • Controles alleen in de browser. De knop "Verwijderen" is verborgen voor gewone gebruikers, maar de server controleert niet wie het verzoek stuurt.
  • Beheerpagina's die open staan. Een pagina als /admin is niet beveiligd, alleen niet gelinkt.

Alle vier zie je niet als je de app gewoon gebruikt. Daarom denkt de maker vaak dat alles goed is.

Wat is het verschil tussen een publieke en een geheime sleutel?

Kort: Een publieke sleutel mag in de browser staan en geeft alleen toegang tot wat je openzet, een geheime sleutel geeft veel of volledige toegang en hoort alleen op een server.

Een API-sleutel is een code waarmee je app zich meldt bij een andere dienst, zoals een database, een betaaldienst of een AI-model. Er zijn twee soorten:

  • Publieke sleutels zijn bedoeld om in de browser te staan. Ze geven alleen toegang tot wat je zelf openzet.
  • Geheime sleutels geven veel of volledige toegang. Die horen alleen op een server, nooit in de browser.

Bij Supabase, de database achter veel vibecode-tools, heet de publieke sleutel de publishable key (vroeger de anon key) en de geheime de secret key (vroeger de service role key). De publieke sleutel mag volgens Supabase (opent in een nieuw tabblad)1 gewoon in je app staan, maar alleen omdat Row Level Security bepaalt wat iemand ermee kan. De geheime sleutel slaat alle regels over. Die mag nooit in de browser, in een app die je verspreidt of in je code op GitHub.

Hetzelfde geldt voor sleutels van bijvoorbeeld OpenAI, Anthropic, Stripe of Mollie. Staat zo'n geheime sleutel in je front-end, dan kan iedereen op jouw kosten AI-opdrachten doen of bij je betaalgegevens.

Waar horen geheime sleutels dan? In een omgevingsvariabele op de server: een instelling die je code kan lezen maar die niet in de code zelf staat. Of er ergens een geheime sleutel in je app staat, zie je niet als je hem gebruikt. Wij zoeken je project erop na en zetten elke geheime sleutel op de plek waar hij hoort.

Wat is Row Level Security?

Kort: Row Level Security is een functie van de database die per rij bepaalt wie die rij mag lezen of wijzigen, ook als iemand je app omzeilt.

Row Level Security (RLS) is een functie van de database (opent in een nieuw tabblad)2 die per rij bepaalt wie die rij mag lezen of wijzigen. Een rij is één record, bijvoorbeeld één afspraak of één bericht.

Zonder RLS geldt: wie de publieke sleutel heeft, kan alles lezen. En die sleutel staat, zoals we zagen, in je app. Met RLS gelden regels als: "een gebruiker mag alleen afspraken zien waarvan hij de eigenaar is". De database controleert dat bij elk verzoek, ook als iemand je app omzeilt.

Let op twee dingen:

  • RLS aanzetten zonder regels sluit alles af. Dan werkt je app niet meer, en de verleiding is groot om een regel te maken die alles toestaat. Dan ben je terug bij af.
  • Een regel als "iedereen die is ingelogd mag alles" beschermt alleen tegen bezoekers zonder account. Iedereen kan een account aanmaken.

Of de regels goed staan, zie je niet aan de buitenkant van je app: alles werkt, ook als iedereen bij alles kan. Het nalopen vraagt kennis van de database. Dat doen we voor je: we kijken elke tabel na en zetten de regels zo dat iedereen alleen ziet wat van hem is.

Waarom is controle in de browser niet genoeg?

Kort: Alles wat in de browser gebeurt kan een gebruiker aanpassen, dus controles op rechten, geld en gegevens van anderen horen op de server of in de database.

Alles wat in de browser gebeurt, kan een gebruiker aanpassen. Een verborgen knop kun je zichtbaar maken. Een verzoek naar de server kun je met eenvoudige hulpmiddelen namaken met andere gegevens.

Een voorbeeld: in je app kan een gebruiker zijn eigen profiel bewerken. De pagina stuurt "werk profiel 42 bij". Wat gebeurt er als iemand daar 43 van maakt? Als alleen de browser controleert wie je bent, wordt profiel 43 aangepast. Daarom moet de controle op de server (opent in een nieuw tabblad)3 of in de database zitten, via RLS of via code op de back-end.

Vuistregel: alles wat met rechten, geld of gegevens van anderen te maken heeft, moet aan de serverkant gecontroleerd worden. Dat geldt ook voor beheerpagina's: die moeten om een beheerdersrol vragen, ook als iemand het adres direct intypt. Wij lopen na waar je app op de browser vertrouwt en verplaatsen die controles naar de server of de database.

Wat moet er gebeuren als een sleutel gelekt is?

Kort: De sleutel moet worden ingetrokken en vervangen door een nieuwe op de server, er moet worden nagegaan of hij misbruikt is, en een datalek met risico meld je binnen 72 uur.

Staat er een geheime sleutel in je front-end of op GitHub, dan is snel handelen nodig:

  1. De sleutel moet worden ingetrokken bij de dienst zelf, en vervangen door een nieuwe. Alleen de sleutel uit je code halen is niet genoeg: hij kan al gekopieerd zijn en staat nog in de geschiedenis van je code (opent in een nieuw tabblad)4.
  2. De nieuwe sleutel hoort op de server, in een omgevingsvariabele.
  3. In de logboeken en rekeningen van de dienst is na te gaan of de sleutel misbruikt is.
  4. Ging het om persoonsgegevens? Dan kan het een datalek zijn. Een datalek met risico voor mensen moet je volgens de AVG binnen 72 uur melden bij de Autoriteit Persoonsgegevens (opent in een nieuw tabblad)5. Lees meer in Privacy en de AVG.

Het vervangen van de sleutel en het nalopen van de logboeken doen wij. De melding doe jij; wij zetten op een rij wat er gebeurd is. Daarna is het verstandig de rest van je app ook na te lopen, want waar één sleutel stond, staan er vaak meer. Ook het inloggen verdient dan een goede test; zie Inloggen en gebruikers en Testen voordat je live gaat.

Wat we voor je regelen

Je hoeft niet zelf door je code te zoeken. In een gratis adviesgesprek kijken we naar jouw app en zeggen we wat er moet gebeuren om hem veilig te maken.

  • We zoeken je hele project na op geheime sleutels en zetten ze veilig op de server.
  • We zetten Row Level Security aan voor elke tabel met gegevens van gebruikers, met regels die passen bij wie wat mag zien.
  • We verplaatsen controles op rechten, geld en gegevens van anderen naar de server of de database.
  • We sluiten beheerpagina's af voor iedereen zonder beheerdersrol.
  • We testen met meerdere accounts of gebruikers echt niet bij elkaars gegevens kunnen.
  • Is er al een sleutel gelekt, dan vervangen we die en kijken we of hij misbruikt is.
Doe de check

Twee minuten, gratis. Daarna plan je een adviesgesprek, als je wilt.

Veelgestelde vragen

Is de publieke Supabase-sleutel in mijn app een probleem?

Nee, die is bedoeld om in de browser te staan. Het wordt pas een probleem als Row Level Security uit staat of als de regels te ruim zijn. De geheime sleutel (secret key of service role key) mag nooit in de browser.

Mijn tool zegt dat mijn app veilig is. Klopt dat?

Sommige tools hebben een ingebouwde beveiligingscontrole. Die is nuttig, maar vindt niet alles. Of gebruikers bij elkaars gegevens kunnen, blijkt pas als iemand dat met meerdere accounts echt probeert.

Lost de AI dit niet vanzelf op?

Een AI kan helpen, maar het resultaat moet iemand nalopen die de code kan lezen. Een AI die een nieuwe functie bouwt, kan een bestaande regel ongemerkt ruimer maken. Zie Testen voordat je live gaat.

Wanneer laat ik mijn app controleren?

Voordat je echte persoonsgegevens of betalingen verwerkt. In een gratis adviesgesprek kijken we naar jouw app en zeggen we wat er moet gebeuren.

Bronnen

  1. Supabase API keys (opent in een nieuw tabblad) Geraadpleegd op 6 oktober 2026
  2. Supabase Row Level Security (opent in een nieuw tabblad) Geraadpleegd op 6 oktober 2026
  3. OWASP A01 Broken Access Control (opent in een nieuw tabblad) Geraadpleegd op 6 oktober 2026
  4. GitHub Removing sensitive data from a repository (opent in een nieuw tabblad) Geraadpleegd op 6 oktober 2026
  5. Autoriteit Persoonsgegevens Zo meldt u een datalek (opent in een nieuw tabblad) Geraadpleegd op 6 oktober 2026

Vibecodechecker legt uit en geeft geen juridisch of fiscaal advies. We controleren elke regel tegen de officiële bron en zetten de datum erbij. Zo schrijven we.

Dit moet je weten

  • Gevibecodede apps lekken meestal door een paar fouten die steeds terugkomen en die je niet ziet als je de app gewoon gebruikt.
  • Bij Supabase mag de publieke sleutel in je app staan omdat Row Level Security bepaalt wat iemand ermee kan; de geheime sleutel slaat alle regels over.
  • Een RLS-regel als "iedereen die is ingelogd mag alles" beschermt alleen tegen bezoekers zonder account, want iedereen kan een account aanmaken.
  • Een gelekte sleutel alleen uit je code halen is niet genoeg, want hij kan al gekopieerd zijn en staat nog in de geschiedenis van je code.
  • Waar één geheime sleutel stond, staan er vaak meer.