Geparametriseerde queries stellen je in staat om waarden in een query door te geven via speciale parameters, in plaats van rechtstreeks door variabelen in te voegen. Dit verhoogt de veiligheid en beschermt tegen SQL-injecties, evenals het versnellen van de uitvoering van herhaalde queries door plan caching.
Dynamische SQL stelt je in staat om queries on-the-fly te bouwen en uit te voeren (bijvoorbeeld via EXEC sp_executesql in MS SQL of PREPARE/EXECUTE in PostgreSQL). Het is noodzakelijk om zeer voorzichtig te zijn: het rechtstreeks invoegen van waarden in de querytekst kan leiden tot SQL-injecties, syntaxisfouten en slechte prestaties.
Voorbeeld van een geparametriseerde query (in Python met de psycopg2-bibliotheek):
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
Voorbeeld van dynamische SQL in PostgreSQL:
EXECUTE format('SELECT * FROM %I WHERE value = %L', tablename, value);
Vraag: Waarom is het simpelweg escapen van aanhalingstekens ('), zoals sommige oudere applicaties doen, niet genoeg om te beschermen tegen SQL-injecties?
Antwoord:
Escapen van aanhalingstekens beschermt niet tegen alle soorten injecties, vooral niet als een aanvaller een SQL-querystructuur invoegt (bijvoorbeeld "; DROP TABLE users;"). Bovendien dekt het niet alle bijzondere eigenschappen van verschillende datatypes en beschermt het niet tegen het omzeilen van filters via codering of speciale tekens. Je moet altijd geparametriseerde queries gebruiken.
Geschiedenis
Geschiedenis
Geschiedenis
In een CRM veroorzaakte de letter “O'Connor” een fout in de applicatie die SQL-queries opbouwde door eenvoudige stringconcatenatie. Door de niet-geëscapete enkele aanhalingstekens werd geen enkele kaart met die achternaam opgeslagen, wat pas een jaar later werd ontdekt.