Wat is SQL injection en hoe kan je het voorkomen?

Al 14 jaar is het gevaar van een SQL Injection gekend. En toch blijft het nog altijd een van de ergste risico's bij dynamische websites, in staat om grote schade toe te brengen zoals het vernietigen van de data in je database. Maar wat is het eigenlijk, en hoe kan je je ertegen wapenen?

1. Wat is een SQL Injection?

SQL injectionHet moderne web bestaat uit dynamische sites, die on-the-fly samengesteld worden. Een scripttaal zoals PHP haalt content uit een database op en giet die in vorm, op basis van instructies of statements. Zo'n instructie bevat de code van de ontwikkelaar, plus de gegevens die de bezoeker via een webformulier ingeeft, bijvoorbeeld bij het invullen van inlog en wachtwoord.

Wanneer een ontwikkelaar onvoldoende hygiëne toepast bij zijn statements, kan iemand met kwalijke bedoelingen code meesmokkelen in de gegevens die hij invult, waardoor hij andere instructies kan laten uitvoeren.

Kort samengevat gebruikt een hacker bepaalde karakters of vergelijkingen in het invulgedeelte van een formulier, waardoor zijn input niet louter als string, maar als functie beschouwd wordt.

 

Deze tekens bijvoorbeeld kunnen een risico leveren:

  • * (asterisk) is een instructie voor de SQL database om alle kolommen te tonen voor de geselecteerde rij van de database
  • = (gelijk aan) is een instructie voor de SQL database om enkel de waarde(n) te tonen die met de gezochte string overeenkomen
  • ' (enkele quote) wordt gebruikt om de SQL database te vertellen waar de zoekstring begint of eindigt
  • ; (puntkomma) wordt gebruikt om de SQL parser te vertellen dat de huidige statement ten einde is
  • -- (dubbel streepje) wordt gebruikt om de SQL parser te vertellen dat de rest van de lijn een commentaar is en niet uitgevoerd moet worden.

Je kan je de mogelijke misbruiken met deze lettertekens al inbeelden!

 

2. Wat zijn de gevaren van een SQL injection?

Bij een SQL injectie wordt dus extra code toegevoegd aan de input. Zijn er in het script geen voorzorgen genomen om op dergelijke situaties te anticiperen, dan wordt de code uitgevoerd, met gevaarlijke situaties tot gevolg.

De aanvaller kan:

  • Content in de database toevoegen, wijzigen of lezen
  • Broncode lezen van bestanden op de database server
  • Bestanden naar de database server schrijven.

 

Een voorbeeld zal dit duidelijk maken.

txtUserId = getRequestString("UserId");

txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

Hierbij is het de bedoeling om een SQL statement te maken om een gebruiker met een bepaalde ID te selecteren. Maar wat als de gebruiker dit invult als UserID in het formulier:

105 OR 1=1

Dan krijgt het statement deze vorm:

SELECT * FROM Users WHERE UserId = 105 OR 1=1;

Met als gevolg: waar het oorspronkelijk de bedoeling was om één lijn te tonen, namelijk die van de UserID, ingevuld bij de input,  worden nu ALLE lijnen getoond, omdat de OR voorwaarde altijd waar is, namelijk 1=1. Wanneer de Users tabel dan niet alleen gebruikersnamen maar ook wachtwoorden bevat, is het hek van de dam!

 

SQL injection cartoon

 

3. Hoe kan je je beschermen tegen een SQL injection?

De drie belangrijkste manieren om jouw website te beschermen tegen dergelijke injectie zijn:

  • Data-types casten (op voorhand bepalen welk datatype je verwacht voor de variabele). Is het een integer, een string of een boolean (true/false)? In PHP doe je dat bijvoorbeeld voor een integer met

$id = (int)$_GET['id'];

  • Escape strings (speciale karakters zoals ' escapen). In PHP gebruik je hiervoor de functie

mysqli_real_escape_string()

  • Prepared Statements (de structuur van een query vooraf vastleggen). In PHP maak je een prepared statement aan met

mysqli_stmt_init

Om vervolgens de prepared statement uit te voeren met

mysqli_stmt_prepare

 

Meer weten? Lees over soorten datatypes casten,  Prepared Statements,  W3Schools over SQL Injection.

Wist je trouwens dat, wanneer je hosting koos bij Combell, je van de strafste beveiliging op de markt geniet? En dat Combell zelfs een automatische patching biedt die je CMS-hosting (WordPress, Magento, Joomla, Drupal)  meteen beschermt tegen pas ontdekte zwakke plekken?

 

Ontdek de ultieme bescherming van Combell hosting