SQL-injectie

Uit Wikipedia, de vrije encyclopedie

Ga naar: navigatie, zoeken

De term SQL-injectie (Engels: SQL injection) wordt gebruikt voor een type kwetsbaarheid van computerapplicaties, meestal webapplicaties. Applicaties die informatie in een database opslaan maken gebruik van SQL om met de database te communiceren. SQL-injectie kan gebeuren als invoer van gebruikers op onvoldoende gecontroleerde wijze wordt verwerkt in een SQL-statement. Om de precieze werking van SQL-injectie te begrijpen is het belangrijk om te weten hoe SQL werkt.

Inhoud

[bewerken] Rol van de apostrof in SQL

In SQL heeft de apostrof een belangrijke functie, namelijk het afbakenen van niet-numerieke gegevens. Om bijvoorbeeld alle personen met de naam "Jansen" te selecteren uit een tabel wordt het volgende statement gebruikt

SELECT * FROM persoon WHERE achternaam = 'Jansen'

In een applicatie waar gezocht kan worden naar personen, zal de gebruiker in het zoekveld uitsluitend "Jansen" invullen. In de applicatie wordt op basis van deze invoer bovenstaande code naar de database gestuurd.

Interessant wordt het als de gebruiker een apostrof in het zoekveld invult, bijvoorbeeld "'t Hart". In een correct statement moet dan namelijk de apostrof worden verdubbeld, of voorzien van een backslash (\).

SELECT * FROM persoon WHERE achternaam = '''t Hart'
SELECT * FROM persoon WHERE achternaam = '\'t Hart'

Als dat niet gebeurt, dan levert het een incorrect SQL-statement op, en volgt een foutmelding van de database. Maar het betekent ook dat de applicatie niet beschermd is tegen SQL-injectie.

[bewerken] SQL-injectie

SQL-injectie bestaat er uit dat een gebruiker in het invoerveld tekens invoert die er voor zorgen dat een ongewenste SQL-query wordt uitgevoerd. Daarbij wordt vaak gebruik gemaakt van de apostrof. Dit kan alleen als bij het genereren van de SQL-code op basis van gebruikersinvoer de apostrof niet goed wordt afgevangen.

De gebruiker typt bijvoorbeeld "Jansen' OR 'a' = 'a" in het zoekveld. Het resulterende statement is dan

SELECT * FROM persoon WHERE achternaam = 'Jansen' OR 'a' = 'a'

Omdat "'a' = 'a'" altijd waar is, voldoet nu elk record aan de gestelde voorwaarde.

Bovenstaand voorbeeld is nog redelijk onschuldig, omdat de hacker alleen extra informatie kan ophalen. Dezelfde methode levert echter de mogelijkheden om nieuwe informatie aan de database toe te voegen, bestaande informatie aan te passen en informatie te verwijderen. Daarvoor is informatie nodig over de structuur (namen van tabellen en kolommen) van de database. De naamgeving van tabellen en kolommen is om begrijpelijke redenen echter meestal logisch en dus voorspelbaar. Daarnaast kan de hacker ook diverse zaken uitproberen.

[bewerken] Vermijden

Door middel van het geven van de minimaal noodzakelijke rechten zal het ongewenst aanpassen van de gegevens vermeden worden.

De injectie met SQL-code kan eenvoudig tegengegaan worden door het juist verwerken van informatie die door een gebruiker wordt aangeleverd. In de programmeertaal PHP kan dat bijvoorbeeld via mysql_real_escape_string(). Deze functie vangt (my)SQL specifieke karakters af door er een backslash (\) voor te plaatsen. Hierdoor weet het systeem dat enkel het letterteken bedoeld wordt, en niet meer de scheidende functie van het afbakenen van gegevens.

Een andere methode om injectie tegen te gaan is door middel van een voorgedefinieerd statement. Hierbij wordt in het aanroepende programma het statement opgebouwd met een variabele. De inhoud van de variabele wordt dan gekoppeld aan de gebruikersinvoer.

Bijvoorbeeld (in de taal Java):

In plaats van

Connection con = (maak verbinding met de database)
Statement stmt = con.createStatement();
ResultSet rset = stmt.executeQuery("SELECT * FROM persoon WHERE achternaam = '" + invoer + "';");

is het beter om het volgende te gebruiken

Connection con = (maak verbinding met de database)
PreparedStatement pstmt = con.prepareStatement("SELECT * FROM persoon WHERE achternaam = ?");
pstmt.setString(1, invoer);
ResultSet rset = pstmt.executeQuery();

[bewerken] Externe links

 
Persoonlijke instellingen
Boek maken