Veiligheidsgids · Veilig vibecoden
Alles wat van buiten komt is onbetrouwbaar. Valideer vorm, lengte en type op de server, ook als de frontend het al doet.
Formuliervelden, URL-parameters, headers, geüploade bestanden en webhook-berichten: alles kan door een aanvaller gemanipuleerd worden. Validatie in de browser is handig voor de gebruiker, maar beschermt niets. Een aanvaller stuurt zijn verzoek rechtstreeks naar je server.
Een aanvaller omzeilt de browser en stuurt elke waarde die hij wil.
Als je het hele verzoek in de database zet, kan iemand velden als role: 'admin' meesturen.
Enorme invoer kan je server of je AI-kosten laten exploderen.
Het schema bepaalt welke velden zijn toegestaan en in welke vorm. Onverwachte velden zoals role worden weggelaten.
export async function POST(req: Request) {
const body = await req.json();
// Alles wat binnenkomt gaat de database in, inclusief "role"
await db.user.update({ where: { id: userId }, data: body });
}import { z } from "zod";
const ProfileUpdate = z.object({
name: z.string().trim().min(1).max(100),
bio: z.string().max(500).optional(),
});
export async function POST(req: Request) {
const parsed = ProfileUpdate.safeParse(await req.json());
if (!parsed.success) {
return Response.json({ error: "Controleer je invoer." }, { status: 400 });
}
await db.user.update({ where: { id: userId }, data: parsed.data });
}Loop dit na voordat je verder gaat of iets online zet.