Tietoturva

Takaisin pääsivulle


Tällä sivulla kuvataan kolme yleistä tietoturvaongelmaa ja annetaan ohjeet niiden välttämiseen.

Käyttöoikeus

Ongelma

Hyökkääjä voi tehdä muutoksia sivujen osoitteissa ja lomakkeissa oleviin tietoihin.

Esimerkiksi järjestelmä voi olla toteutettu niin, että jokainen käyttäjä voi katsella henkilökohtaisia tietojaan sivun tiedot.php?id=123 kautta, jossa 123 on käyttäjän id-numero.

Hyökkääjä voi kokeilla vaihtaa osoitteessa olevan id-numeron toiseksi siinä toivossa, että järjestelmä antaa nähdä vieraan käyttäjän tiedot.

Ratkaisu

Ohjelmoija ei saa luottaa, että sivustolle annetut parametrit ovat oikein. Joka vaiheessa täytyy tarkistaa, että käyttäjällä on oikeus nähdä pyytämänsä tiedot. Esimerkissä riittää tarkistaa, että parametrina annettu id-numero vastaa kirjautuneen käyttäjän id-numeroa.

SQL-injektio

Ongelma

SQL-injektiossa hyökkääjä pystyy muuttamaan SQL-kyselyn rakennetta antamalla sopivan syötteen.

Esimerkiksi seuraavan kyselyn on tarkoitus varmistaa, että käyttäjä on antanut oikean tunnuksen ja salasanan:

SELECT id FROM kayttajat
WHERE tunnus = '$tunnus' AND salasana = '$salasana'

Hyökkääjä voi kuitenkin antaa haluamansa käyttäjänimen ja salasanaksi ' OR '' = ', jolloin lopullinen kysely on seuraava:

SELECT id FROM kayttajat
WHERE tunnus = 'ahslaaks' AND salasana = '' OR '' = ''

Nyt kyselyn osana on uusi ehto, joka pitää varmasti paikkansa (tyhjä merkkijono on tyhjä merkkijono), ja OR-sanan ansiosta sen toteutuminen riittää, vaikka salasana ei olisi oikein.

Lokakuussa 2007 hakkeri sai käsiinsä 78000 salasanaa suomalaisilta nettisivustoilta. Murrot perustuivat SQL-injektioon.

Ratkaisu

SQL-kyselyn osaksi ei saa sijoittaa merkkijonoa, joka mahdollistaa kyselyn muuttamisen. Helpoin ratkaisu on käyttää parametroituja kyselyitä, jolloin käyttäjän antamia tietoja ei yhdistetä kyselyyn sellaisenaan vaan erillisen metodin kautta. Metodi tekee sitten tiedoille tarvittavat muutokset kuten lisää merkkijonossa olevien heittomerkkien eteen kenoviivat. Esimerkiksi PHP:n PDO-luokan avulla kyselyt voi muodostaa parametroidusti esimerkin mukaisesti.

XSS-aukko

Ongelma

XSS-aukko tarkoittaa, että hyökkääjä pystyy yhdistämään nettisivun osaksi omaa HTML- tai JavaScript-koodia.

Esimerkiksi jos keskustelupalstan viesti tulostetaan sivulle sellaisenaan, hyökkääjä voi kirjoittaa esimerkiksi seuraavan viestin:

<script>
while (1) {
    alert("Sivuston koodaaja on peelo!");
}
</script>

Nyt kun seuraava käyttäjä avaa keskustelun, selain näyttää koko ajan viesti-ikkunassa tekstin "Sivuston koodaaja on peelo!"

XSS-aukon seuraukset voivat olla vakavampiakin: hyökkääjä voi esimerkiksi pystyä lähettämään JavaScriptin avulla käyttäjän kirjautumistietoja sisältävät evästeet omalle palvelimelleen.

Ratkaisu

Sivulle ei saa tulostaa käyttäjän antamaa tekstiä ilman esikäsittelyä. Esimerkiksi PHP:n funktio htmlspecialchars estää HTML:n ja JavaScriptin lisäämiseen tekstiin. Se muuttaa esimerkiksi merkin < muotoon &lt; ja merkin > muotoon &gt;.


Takaisin pääsivulle