Veiligheidsgids · Veilig vibecoden
Een van de oudste aanvallen, en nog steeds in AI-gegenereerde code te vinden. Gebruik altijd geparametriseerde queries.
Bij SQL-injectie wordt invoer van een gebruiker onderdeel van een databasecommando. Met de juiste invoer kan een aanvaller dan gegevens lezen, aanpassen of verwijderen.
De oplossing is al decennia bekend: plak nooit invoer in een query-string, maar gebruik parameters of een ORM die dat voor je doet.
Met string-concatenatie of template-strings kan invoer als SQL worden uitgevoerd.
Parameters werken voor waarden, niet voor namen. Sorteerkolommen uit de URL moeten tegen een vaste lijst gecontroleerd worden.
Bij een tagged template of prepared statement stuurt de driver de waarde apart van het SQL-commando. De database behandelt het altijd als data, nooit als code.
Loop dit na voordat je verder gaat of iets online zet.
// Invoer als ' OR '1'='1 geeft alle gebruikers terug
const rows = await sql.unsafe(
`SELECT * FROM users WHERE email = '${email}'`
);// Tagged template: de waarde wordt als parameter meegestuurd
const rows = await sql`SELECT * FROM users WHERE email = ${email}`;