SQL-injektio

SQL-injektio () on tekniikka tietoturva-aukkojen hyödyntämiseksi järjestelmiin tunkeutumisessa. Niitä esiintyy tietokantapohjaisissa sovelluksissa. Ne ovat varsin yleisiä WWW-pohjaisissa sovelluksissa joissa käyttäjät käyttävät tietokantaa WWW-rajapinnan yli, mutta SQL-injektiot eivät sinällään ole WWW-sidonnaisia.

SQL-injektiossa hyökkääjä antaa tietokantapalvelimelle SQL-komentoja, joita hänen ei pitäisi pystyä antamaan. Tämä hyökkäys tapahtuu useimmiten puuttuvan tai väärin toteutetun syöttötiedon tarkistuksen kautta, ja joissain tapauksissa myös itse tietokantarajapinnassa tapahtuvan tiedon väärästä käsittelystä. SQL-injektioiden torjumiseksi kaiken käyttäjältä tulevan tiedon oikeellisuus pitää tarkistaa: merkkijonojen SQL-erikoismerkit kuten lainausmerkki pitää merkitä erikoismerkeiksi (useimmiten tietokantarajapinnassa valmiiksi löytyvällä quote-operaatiolla), ja muiden tietotyyppien kohdalla pitää varmistaa, että ne ovat oikeassa muodossa (esimerkiksi lukuarvo on todella lukuarvo). Erityyppisiä SQL-injektio hyökkäystyyppejä ovat esimerkiksi virheperustainen, union-perustainen, boolean-perusteinen ja aikaperustainen SQL-injektio.

Klassinen esimerkki on seuraavan tyyppinen ohjelmakoodissa annettu komento (pseudokoodina):

 execute("SELECT * FROM users WHERE user_name = '" + user_name + "';");

Jos muuttujan user_name sisältö tulee suoraan käyttäjältä, voi käyttäjä antaa nimeksi "'; DROP TABLE users; --" jolloin seuraava käsky suoritetaan tietokantapalvelimella:

 SELECT * FROM users WHERE user_name = ''; DROP TABLE users; --';

Jälkimmäinen komento suoritetaan, vaikka ohjelmoijan tarkoitus oli sallia vain SELECT-lauseen suoritus.

Täten käyttäjältä tuleva tieto tulee aina käsitellä niin, että SQL-komentojen erikoismerkit (esimerkiksi heittomerkki) ovat aina lainattuja.

Tästäkin huolimatta tilanne, jossa SQL-komento muodostetaan yhdistelemällä muuttujien arvoja, on riskialtis. Useimmissa tietokantarajapinnoissa voi käyttää parametreja:

 prepare("SELECT * FROM users WHERE user_name = ?;");
 set_parameter(1,user_name,STRING);
 execute_prepared();

Tällöin itse ohjelman ei tarvitse varmistua merkkijonon oikeellisuudesta, vaan tietokantarajapinta tekee tarvittavat toimenpiteet.

 Lähteet 

Luokka:Turvallisuushaavoittuvuudet
Luokka:SQL