SQL-Injections - Att förhinda dom
Förord
SQL-Injections är något som man inte tänker på så ofta eftersom det inte märks på servern förens någonting händer. SQL-Injections går ut på att man börjar med en ' följt av = börjar med ett utbrytstecken för att ta sig ur en textsträng i SQLen som därefter "injicerar" sin egna SQL-sats i databasservern vilket ger en tillgång till det mesta som finns i databasen.Innehåll
»»
Exempel:
Vi ska ha en inloggning på adminsidan och ska kolla om personen skrev in rätt lösenord i formuläret. Då skulle det kunna se ut så här:
Kör man med en SQL-sats lik denna skulle man kunna logga in om tboxAnv och tboxLosen finns med i databasen.
Men tänk om man skulle kunna modifiera SQL-satsen direkt på sidan?
Då skulle det räcka med att man skrev 'OR losen <>' i lösenordsfältet för att SQL-satsen ska bli så här:
Det i sin tur gör att du kommer kunna logga in.
Det här är ett relativt stort problem på många sidor, men det finns sätt att förhindra detta vilket jag går igenom i den här artikeln.
Ett lätt sätt att undvika SQL-Injections är att att använad så kallade Stored procedures som är "lagrade procedurer" vilket du hör på namnet.
Man skapar då sin SQL-sats direkt i databasen och kör sedan med parametrar för att lägga in eller uppdatera data.
I .NET finns det en replace-funktion som du kan använda för att undvika SQL-Injections.
Genom en liten enkel rad skyddar du dig mot SQL-Injections:
Genom att använda raden ovan kommer nu "Variabel" att vara skyddad mot SQL-Injections.
Personligen föredrar jag det sista alternativet då jag är ganska lat och den är smidig att bara lägga till i en färdig rutin.
Vi ska ha en inloggning på adminsidan och ska kolla om personen skrev in rätt lösenord i formuläret. Då skulle det kunna se ut så här:
SELECT * FROM tbl WHERE tblData = '" & tboxAnv.Text & "' AND losen = '" & tboxLosen.Text & "'
Kör man med en SQL-sats lik denna skulle man kunna logga in om tboxAnv och tboxLosen finns med i databasen.
Men tänk om man skulle kunna modifiera SQL-satsen direkt på sidan?
Då skulle det räcka med att man skrev 'OR losen <>' i lösenordsfältet för att SQL-satsen ska bli så här:
SELECT * FROM tblTabellen WHERE anv = '""' AND losen = 'OR losen <>'
Det i sin tur gör att du kommer kunna logga in.
Det här är ett relativt stort problem på många sidor, men det finns sätt att förhindra detta vilket jag går igenom i den här artikeln.
Stored procedures
Ett lätt sätt att undvika SQL-Injections är att att använad så kallade Stored procedures som är "lagrade procedurer" vilket du hör på namnet. Man skapar då sin SQL-sats direkt i databasen och kör sedan med parametrar för att lägga in eller uppdatera data.
.Replace()
I .NET finns det en replace-funktion som du kan använda för att undvika SQL-Injections. Genom en liten enkel rad skyddar du dig mot SQL-Injections:
Variabel.Replace("'","'")
Genom att använda raden ovan kommer nu "Variabel" att vara skyddad mot SQL-Injections.
Personligen föredrar jag det sista alternativet då jag är ganska lat och den är smidig att bara lägga till i en färdig rutin.
Pelle Johansson
En lagrad procedur medför inte per automatik att sql injection förhindras. Använder man däremot command-objektet och adderar fält för fält så går det däremot inte att skicka in skadlig information.