AMVA50,php ja mysql

8.1 SQL-injektio

8.2 mysql_real_escape_string()-funktio

8. SQL-LAUSEIDEN TURVALLISUUS

 

8.1 SQL-injektio

SQL-injektiolla tarkoitetaan sitä, että sql-kieltä osaava käyttäjä voi syöttää web-lomakkeelta kyselyyn lauseita, jotka saavat aikaan sen, että käyttäjä pääsee käsittelemään tietokannan tietoja ilman oikeuksia.

PHP.netin dokumentaatioossa on sivulla http://fi.php.net/manual/fi/function.mysql-real-escape-string.php esimerkkinä skripti:

<?php
// etsikään käyttäjä-taulusta tunnusta ja salasanaa
$query = "SELECT * FROM users WHERE user='{$_POST['username']}'
   AND password='{$_POST['password']}'"
mysql_query($query);

// Lomakkeelta tulevaa syötettä ei käsitelty, joten käyttäjä voi syöttää mitä tahansa, esimerkiksi:
$_POST'username' = 'aidan';
$_POST'password' = "' OR ''='";
$salasana= $_POST['salasana']; ;
// Tällöin tietokantaan lähetettäisiin kysely:
echo $query;
?>

Esimerkin kysely olisi muotoa:

SELECT * FROM users WHERE name='aidan' AND password='' OR ''=''

Eli kuka tahansa voisi kirjautua järjestelmään ilman salasanaa.

8.2. mysql_real_escape_string()-funktio

Funktiolla mysql_real_escape_string() voidaan eliminoida injektio. Funktio muokkaa erityismerkit kuten ('), ("), ja (\) sql-lauseesta.

Lomakkeelta tulevat tiedot kannattaa siis muuttaa funktiolla turvalliseen muotoon ennen lauseiden suorittamista tietokannassa.

Esimerkkisovelluksen kirjautuminen.php-tiedoston lomaketiedot voitaisiin käsitellä ko. funktiolla ennen kayttaja- tauluun syötettävän sql-lauseen suorittamista.

$tunnus= mysql_real_escape_string( $_POST['tunnus']);
$salasana= mysql_real_escape_string($_POST['salasana']); 

Huom! Palvelimen asetuksissa voidaan määritellä ominaisuus Magic Quotes olemaan joko päällä tai pois päältä. Jos asetus on päällä, niin em. erikoismerkit eliminoidaan automaattisesti. Sen onko asetus päällä, saa selville joko phpinfo()-funktiolla tai get_magic_quotes_gpc() -funktiolla. Funktio palauttaa arvon 0 (off) tai 1 (on). Asetus ei useinkaan ole päällä, mutta Students.osao.fi-palvelimella kyseinen asetus on päällä.