SQL injection beveiliging in classic ASP en Microsoft SQL Server databases.

Een SQL injection is aanvalsmethode om een SQL-database te kraken. SQL injectie is verantwoordelijk voor het overgrote deel van gehackte websites, waarbij aanvallers over waardevolle data van bedrijven en instellingen weten buit te maken. Denk hierbij aan financiële, maar ook privacygevoelige gegevens van gebruikers, instellingen, overheden, enz. Kort om, een groot gevaar schuilt in SQL injection, en beveiliging hiertegen is belangrijk!

Naast het gevaar voor het lekken van belangrijke gegevens is SQL injection erg vervelend, bijvoorbeeld als het wordt misbruikt voor het uitvoeren van sleep-aanvallen op MySQL-databaseservers.

Daarom wil je graag een veilige web-applicatie, en daarom SQL injection voorkomen. In dit artikel gaan we in op het voorkomen en tegengaan van SQL injection in, in dit geval, ASP-webapplicaties. We gaan hier in op het gebruik van prepared statements om SQL queries en statements te beveiligen, zodat alleen dat uitgevoerd wordt wat wij willen.

Let op

Deze post is opnieuw gepubliceerd, maar inmiddels wel verouderd. Doe zelf goed onderzoek naar technieken om SQL-injection in jouw website-code tegen te gaan!

Prepared statements in ASP/VBscript om SQL injection tegen te gaan

In ASP is een SQL prepared statement is een goed middel om SQL injection tegen te gaan. De structuur van de query wordt vastgelegd tijdens het prepareren (voorbereiden) van het statement en kan daarna niet meer veranderen. De data waarmee het statement later wordt aangeroepen kan dus de structuur van de query niet meer veranderen, het wordt simpelweg als data behandeld en niet als SQL.

Hierbij maakt het niet uit of je gebruikmaakt van ASP, PHP, Perl of ASP.NET als scripttaal, of Microsoft SQL Server, MySQL of PostgreSQL als databaseserver. Invoervalidatie, prepared statements en beveiliging zijn altijd belangrijk!

Ook interessant voor jou:  Protocol onafhankelijke bronnen in webpagina's

Prepared statement met classic ASP/VBScript en MSSQL

Een voorbeeld stukje ASP-/VBScript code met een prepared statement is:

<%@ Language="VBScript">
<%
<!--#include file="adovbs.inc"-->

Option Explicit

Dim SqlConn, SqlCommand, resultaat
Set SqlConn = Server.CreateObject("ADODB.Connection")
SqlConn.Open "Driver={SQL Server};" & "Server=hostnaam;" &
  "DATABASE=databasenaam;" & "uid=gebruikersnaam;" &
  "pwd=wachtwoord;"

Set SqlCommand = Server.CreateObject("ADODB.Command")
Set SqlCommand.ActiveConnection = SqlConn
SqlCommand.CommandType = adCmdText
SqlCommand.CommandText = "SELECT * FROM logintable WHERE userid = ? AND wachtwoord= ?"
SqlCommand.Prepared = True

' op 1 regel
SqlCommand.Parameters.Append _
  (SqlCommand.CreateParameter("@userid", adVarWChar, adParamInput, _
  Len(Request.Form("user_id")), Request.Form("user_id")))

' op 1 regel
SqlCommand.Parameters.Append _
  (SqlCommand.CreateParameter("@wachtwoord", adVarWChar, adParamInput, _
  Len(Request.Form("passwd")), Request.Form("passwd")))

Set resultaat = SqlCommand.Execute
SqlCommand.Parameters.Delete("@userid")
SqlCommand.Parameters.Delete("@wachtwoord")
%>

Protip

Gebruik zoals hierboven Option Explicit om vooraf verplicht variabelen te declareren! Dit vermindert de kans op fouten en slordigheidjes. Je vindt een PHP equivalent in het artikel over variabelen declareren.

Hier wordt ADODB.Command object gebruikt om een SQL query te prepareren. Voor MySQL is dit niet veel anders.

HTMLEncode

Naast prepared statements is het verstandig om gebruik te maken van de methode Server.HTMLEncode ([2]), om de code verder te beveiligen. Hiermee worden tekens omgezet naar de HTML-geëncodeerde equivalent, wat goed is tegen cross site scripting. Bijvoorbeeld:

<%@ Language="VBScript">
<%
  Response.Write(Server.HTMLEncode("The image tag: <img>"))
%>

Prepared Statements in PHP?

Het artikel Website beveiligen tegen SQL-injection-aanvallen legt je uit hoe je Prepared Statements in PHP gebruikt met MySQLi. Want in PHP is deze beveiliging dit net zo belangrijk!

Conclusie SQL injection voorkomen met ASP en ADODB.Command

Zoals je kunt lezen is beveiliging tegen SQL injection heel erg belangrijk. Niet alleen kunnen kwaadwillende derden vaak eenvoudig inbreken op jouw website en SQL-database, met alle privacygevolgen voor gebruikers van dien Een SQL injection door middel van sleep()-aanvallen kan zelfs een Denial-of-Service (DoS) veroorzaken en alles onderuit trekken!

Ook interessant voor jou:  Beveiliging Windows 8.1 en 10 te verbeteren via registersleutel

MCSA Windows Server 2016

Bereid je met dit boek voor op je MCSA Windows Server 2016 examens 70-740, 70-741 en 70-743, nu via bol.com voor slechts € 69,99! Dit complete studieboek is het enige boek dat je nodig hebt voor jouw MCSA 2016 certificering.


Psst: Koop een Windows 10 Professional OEM licentie bij bol.com (en steun ITFAQ.nl), of doneer via paypal.me/jreilink.