⚡ TL;DR (3 Key Takeaways)
- Belangrijk: cursor is essentieel voor je security
- Belangrijk: lovable is essentieel voor je security
- Belangrijk: bolt is essentieel voor je security
SG
Shadow Guard Security Team
• 8+ jaar ervaring in web security
• Laatst geüpdatet: 18 februari 2026
⏱️ 8 min leestijd
De opkomst van de "vibe coder" is real: in een paar uur staat er een werkende webapp met behulp van AI-editors zoals Cursor, v0, Lovable of Bolt. Je beschrijft wat je wilt, en de AI spuugt de Next.js componenten en database-koppelingen er in sneltreinvaart uit.
De keerzijde? Snelheid wint vaak van security. AI schrijft code die werkt, maar niet automatisch code die veilig is. De verantwoordelijkheid voor de architectuur en data-security blijft bij het team (of de solo developer) dat de app deployed.
Dit zijn de 5 fouten die we het vaakst zien in door AI-gegenereerde codebases, en de snelste route naar herstel.
1. Public-by-default data toegang (De beruchte Supabase RLS fout)
Wanneer je een AI vraagt om een backend op te zetten met bijvoorbeeld Supabase of Firebase, ligt de focus op het snel kunnen lezen en schrijven van data. Nieuwe tabellen, endpoints of storage buckets worden aangemaakt, maar vaak zonder strikte toegangsregels.
Het Gevaar:
Bij Supabase vergeet AI (en de developer) heel vaak om Row Level Security (RLS) aan te zetten. Het resultaat? Je users of orders tabel is via de publieke anon-key door iedereen uit te lezen of aan te passen. Dit leidt direct tot gigantische data exposure.
Hoe dat eruitziet:
-- ❌ Hoe AI vaak een tabel aanmaakt (Public by default)
CREATE TABLE users ( id serial primary key, email text );
-- Ontbrekend: ALTER TABLE users ENABLE ROW LEVEL SECURITY;
De Fix:
Hanteer altijd deny-by-default policies. Zet RLS direct aan bij het aanmaken van een tabel en schrijf expliciete policies voor SELECT, INSERT, UPDATE en DELETE.
💡 Shadow Guard Oplossing: Onze tool checkt je database-configuratie continu. Staan er tabellen in je public schema zonder actieve RLS? Dan krijg je direct een alert.
2. API Keys in Client-Side Code (Het NEXT_PUBLIC_ lek)
Als je aan Cursor vraagt: "Maak een chat-interface met OpenAI", is de kans groot dat de AI de API-aanroep direct in je frontend component zet om het snel werkend te krijgen.
Het Gevaar:
Om CORS-errors of build-fouten te voorkomen, stelt de AI vaak voor om je secret in een variabele zoals NEXT_PUBLIC_OPENAI_API_KEY te zetten. Deze sleutel wordt hierdoor direct mee-gebundeld in je frontend code. Iedereen die de browser source code bekijkt, kan jouw OpenAI (of Stripe!) key stelen.
Hoe dat eruitziet:
// ❌ Direct lek in je React/Next.js component:
const response = await fetch('https://api.openai.com/v1/chat', {
headers: { 'Authorization': `Bearer ${process.env.NEXT_PUBLIC_OPENAI_API_KEY}` }
});
De Fix:
Verplaats externe API-calls die secrets nodig hebben altijd naar een server-side endpoint (zoals Next.js Route Handlers of Server Actions). Gebruik pure server-only secrets.
⚠️ Shadow Guard Oplossing: Wij scannen je repo en builds op blootgestelde secrets. Zodra we een actieve API key of Supabase service_role key in je frontend code detecteren, trekken we aan de bel vóórdat je deployed.
3. Ontbrekende security headers (CSP / HSTS)
AI-outputs van tools zoals v0 focussen zich op UI en UX (prachtige Tailwind componenten), niet op server hardening.
Het Gevaar:
Zonder een goede Content Security Policy (CSP) en HTTP Strict Transport Security (HSTS) vergroot je je attack surface enorm. Je app is hierdoor veel kwetsbaarder voor Cross-Site Scripting (XSS) aanvallen of clickjacking, simpelweg omdat de browser niet weet welke scripts hij wel of niet mag vertrouwen.
De Fix:
Start met een duidelijke header baseline. In frameworks zoals Next.js kun je dit eenvoudig instellen in je next.config.js.
💡 Shadow Guard Oplossing: AI voegt vaak inline scripts toe die je strakke CSP breken. Wij monitoren je applicatie op regressies na elke deploy, zodat je headers altijd kloppen.
4. Onveilige direct database queries (Ontbrekende server boundaries)
Snelle implementaties slaan vaak de veilige server boundaries over. AI genereert soms code waarbij de client direct bepaalt wélke data er wordt opgevraagd, zonder dat de server dit valideert.
Het Gevaar:
Als je frontend direct een query bouwt (zoals supabase.from('invoices').select('*').eq('user_id', userId)), en je RLS staat niet 100% strak, kan een slimme gebruiker die API-call aanpassen om facturen van andere gebruikers op te halen.
De Fix:
Dwing server-side data access af waar mogelijk. Valideer alle inkomende data (bijvoorbeeld met Zod schema's) en minimaliseer query privileges. Vertrouw nooit op data die direct van de client komt.
5. Over-permissive CORS configuraties
Je bent aan het bouwen, je test je nieuwe AI-gecodeerde endpoint, en de browser gooit een dikke rode CORS-error (Cross-Origin Resource Sharing). Wat is de fix van de AI?
Het Gevaar:
De AI stelt vaak de "makkelijke" route voor: "Even tijdelijk" Access-Control-Allow-Origin: * toevoegen. Hiermee mag plotseling elke website op het internet data van jouw API opvragen. Die "tijdelijke" fix blijft vervolgens veel te vaak in productie staan.
De Fix:
Whitelist expliciete origins per environment (bijv. alleen jouw vercel.app domein voor staging, en je hoofddomein voor productie).
Jouw AI-Release Checklist
Voorkom dat je snelheid betaalt met security. Loop deze checklist na bij je volgende release:
| Check |
Wat te controleren |
| 🔐 Secrets check |
Niets gevoeligs (geen NEXT_PUBLIC_ keys) in client-side artifacts. |
| 🔑 AuthZ check |
Resource-level toegang klopt (Supabase RLS is actief). |
| 🛡️ Header check |
CSP, HSTS en baseline headers zijn actief. |
| 🗄️ Database check |
Policies en roles zijn niet over-permissive. |
| 📊 Monitoring check |
Regressies worden automatisch gedetecteerd. |
Veelgestelde Vragen over AI-Code Security (FAQ)
Waarom lekken AI-editors zoals Cursor en v0 vaak API keys?
AI-modellen optimaliseren voor code die direct werkt. Omdat frameworks zoals Next.js publieke variabelen (zoals NEXT_PUBLIC_) aanbieden om makkelijk data naar de frontend te sturen, gebruikt de AI deze vaak voor API keys, waardoor ze per ongeluk zichtbaar worden in de browser.
Hoe test ik of mijn Supabase database veilig is na AI-generatie?
Controleer altijd of Row Level Security (RLS) is ingeschakeld op alle tabellen. AI maakt vaak tabellen aan in het public schema zonder toegangsrestricties (deny-by-default). Gebruik een geautomatiseerde scanner zoals Shadow Guard om openstaande tabellen en RLS-fouten direct op te sporen.
Wat is het risico van AI-gegenereerde code zonder CSP headers?
Zonder een Content Security Policy (CSP) is je applicatie vatbaar voor Cross-Site Scripting (XSS). Omdat AI-gegenereerde code soms onverwachte externe libraries of inline-scripts toevoegt, kan dit zonder CSP leiden tot ernstige kwetsbaarheden voor je eindgebruikers.
Auteur: Shadow Guard Team | Security Engineers
Laatst bijgewerkt: 18 februari 2026
Leestijd: 8 minuten
Tags: #AI #Cursor #v0 #Security #Supabase #CSP #VibeCoding