När du programmerar mot en databas ifrån .NET - undvik att skicka in parametrar i koden på det här viset:
Dim s As String = TextBox1.TextDim cmd As New SqlClient.SqlCommand("SELECT * FROM tabell WHERE kolumn='" & s & "'", cn)Dim dr As SqlClient.SqlDataReader = cmd.ExecuteReader()
Det kan nämligen leda till SQL Injection. Vad det innebär? Jo, att en illvillig användare anropar din sida med skadlig SQL-kod, genom att i TextBox1 skriva in SQL-kommandon. Tänk dig att en användare skriver in följande i TextBox1:
'; DROP DATABASE minDatabas;SELECT 'You suck!
Vad skulle hända då? Jo, det som skulle hända är att det du egentligen vill göra - nämligen att välja från tabellen "tabell" körs, med en tom sträng som WHERE-villkor för kolumnen "kolumn". Därefter skulle kommandot "DROP DATABASE minDatabas" köras, dvs databasen minDatabas skulle tas bort ifrån SQL Server. Slutligen skulle kommandot "SELECT 'You suck!'" köras. Och det är ju INTE vad vi vill ska hända...
Det absolut enklaste sättet att undvika SQL Injection är att använda parmeteriserade frågor. Såhär kan det se ut:
Dim s As String = TextBox1.TextDim cmd As New SqlClient.SqlCommand("SELECT * FROM tabell WHERE kolumn = @kolumn", cn)cmd.Parameters.Add(New SqlClient.SqlParameter("@kolumn", s))Dim dr As SqlClient.SqlDataReader = cmd.ExecuteReader()
Ytterligare en kodrad, och BETYDLIGT säkrare kod. ADO.NET tar hand om att parametern som jag skickar in omvandlas på ett sådant sätt att den är säker för SQL Server att ta emot. Ingen SQL Injection alltså.
Hade IDG förstått vikten av att använda parametrar i sin kod hade DET HÄR aldrig hänt :)
Remember Me
a@href@title, strike