Skydda dig mot SQL Injection was last modified: dec 14th, 2015 by Albin Kiland

Skydda dig mot SQL Injection

9
jun
2015
Albin Kiland blogg

SQL-injectionOm du som vi ofta ansluter till diverse olika databaser för att läsa och skriva data kanske du vet vad en SQL Injection attack är för något?
En SQL Injection attack är när någon med ont uppsåt vill försöka radera hela din databas mm.
Ett exempel kan vara ett kommentarsfält på en webbsida. Här kan vem som helst fylla i valfri data i fältet som sedan ska skrivas till databasen. Om ingen kontroll görs av den data som ska skrivas till databasen kommer det med all säkerhet, förr eller senare, ske en SQL injection attack. Jag tänker inte gå in på hur en SQL Injection attack genomförs utan bara visa hur man kan skydda sig.

Tänk så här: ”Kontrollerar jag den data som skrivs till databasen, eller gör någon annan det?”
Om svaret är ”någon annan”, som i ett kommentarsfält, måste du tänka på att skydda din databas när du skriver din kod…Men hur?

Svaret: Prepared statements!

Min exempelkod är skriven i Xojo och PostgreSQL. Vill du ta reda på hur det fungerar i något annat språk kan du fråga Google.
Utan Prepared statements kan en osäker SQL query se ut så här:

Dim sql as String

sql = ”INSERT INTO kommentarer (firstname, lastname, comment) VALUES (’Tess T.’, ’Persson’, ’Hello, world.’);”
db.SQLExecute(sql)

Det som öppnar upp för en attack här är att den data som anges i ”VALUES” ej kontrolleras på något sätt, den kan innehålla vad som helst och det är detta en ond människa(eller maskin) utnyttjar.

Samma query, fast med en Prepared statement skulle se ut så här:

Dim sql as String
Dim ps as PostgreSQLPreparedStatement

sql = ”INSERT INTO kommentarer (firstname, lastname, comment) VALUES ($1, $2, $3)”
ps = PostgreSQLPreparedStatement(db.Prepare(sql))
ps.Bind(0, ”Tess T.”)
ps.Bind(1, ”Persson”)
ps.Bind(2, ”Hello, world.”)
ps.SQLExecute()

Denna kod är skyddad mot SQL Injection attacks då databasen först tar emot din SQL query med frågetecken som placeholders och kontrollerar dess uppbyggnad så den är korrekt.
Först efter det tas din data emot, kontrolleras, görs säker och förs sedan in i din query.

Jag säger inte att användandet av Prepared statements skyddar dig till 100% mot en SQL Injection attack men det är inte långt bort.

Summa summarum: Ta för vana att alltid använda Prepared statements när den data som skall skrivas till databasen är utom din kontroll. Helst annars också.


© xkcd.com