0%

Wijzig gegevens veilig

Behandel tekst die op SQL lijkt als gegevens

Een inventariscode mag een apostrof bevatten. Er kan zelfs tekst in staan die op SQL lijkt. Je functie find_item moet naar die volledige tekst als één waarde zoeken, zonder leestekens de query te laten herschrijven.

Bekijk deze exacte aanroep:

find_item(connection, "X' OR 1=1 --")

De waarde ziet er ongewoon uit, maar de functie gebruikt nog steeds dezelfde instructie en tuple met één element:

OnderdeelWat SQLite ontvangt
SQL-instructieWHERE asset_tag = ?
Afzonderlijke waarden("X' OR 1=1 --",)
ResultaatNone
Aantal voorwerpen achterafongewijzigd

SQLite behandelt elk teken binnen de gebonden waarde als gegevens voor de ene ?-positie. De apostrof, spaties, het gelijkteken en de streepjes worden geen SQL-structuur. Geen opgeslagen code komt overeen met de volledige waarde, dus geeft de zoekopdracht None terug.

De grens wordt onveilig wanneer een programma instructietekst opbouwt uit een veranderende waarde. Een f-string heeft een vorm als deze:

statement = f"... WHERE asset_tag = '{asset_tag}'"

Hier wordt de waarde in de instructie ingevoegd voordat SQLite die leest. Een apostrof kan de waarde tussen aanhalingstekens voortijdig afsluiten en de overgebleven tekens kunnen als SQL worden geïnterpreteerd. Als tekst die een gebruiker kan bepalen de structuur van een instructie verandert, bestaat er een risico op SQL-injectie.

Parameterbinding voorkomt dat risico voor waarden, omdat de instructie en waarden als aparte argumenten worden doorgegeven. Repareer apostrofs niet met de hand en verwijder geen leestekens uit de tekst van de gebruiker. Behoud de volledige waarde en laat de database-interface die binden.

Hier zie je die veilige scheiding als één volledige aanroep:

connection.execute(
    "SELECT id FROM items WHERE asset_tag = ?",
    (asset_tag,),
)

Placeholders zijn geen algemeen vervangingssysteem. Een ? kan staan waar SQL een waarde verwacht, zoals een inventariscode of uitleentermijn. Hij kan niet staan voor een tabelnaam, kolomnaam, operator of sleutelwoord. Die onderdelen bepalen de structuur van de instructie en blijven vast in je programma.

Welke aanroep houdt de veranderende inventariscode als gegevens apart terwijl de SQL-structuur vast blijft?

De veilige regel is prettig kort: houd SQL vast, behoud veranderende waarden volledig en geef die waarden afzonderlijk door.