ProgrammatieFullstack ontwikkelaar

Vertel over geparametriseerde queries en dynamische SQL. Wanneer moet je elke benadering gebruiken, welke risico's zijn verbonden aan dynamische SQL en hoe kun je ze vermijden? Geef voorbeelden.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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);

Een vraag met een valstrik.

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

In een van de salarisberekeningssystemen genereerde dynamische SQL rapporten. Vanwege het gebrek aan parameterisatie in het oude framework werden strings handmatig aan elkaar geplakt. Een gebruiker gaf per ongeluk (of niet helemaal) een SQL-fragment in het "achternaam"-veld in — dit stelde hen in staat toegang te krijgen tot andermans salarissen.

Geschiedenis

Een kleine online winkel gebruikte dynamische SQL voor het filteren van producten zonder adequate validatie. Toen een gebruiker probeerde een ongewone waarde op te geven, resulteerde dit in een parserfout in SQL, wat tijdelijk alle productweergaven "platlegde".

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.