2005-01-17

Käytä mahdollisimman vähän parametreja

Toinen tyypillinen web-sovelluksista löytyvä tietoturvaongelma ja tyylirikko on tarpeettomien parametrien välittäminen.

Ugly Bench

Oletetaan, että meillä on jonkinlainen webissä toimiva keskustelujärjestelmä. Jokaisella keskustelualueella on numeromuotoinen tunniste, samoin kuin jokaisella ketjulla. Kahdella ketjulla, vaikka ne olisivatkin eri alueilla, ei ole samaa tunnistetta. Jokainen ketju on vain yhdellä alueella.

Ketjuun voi nyt viitata kahdella tavalla: viewthread.php?bid=12&tid=234 tai viewthread.php?tid=234. Väitän, että näistä jälkimmäinen, lyhempi, tapa on lähes aina parempi. Ensimmäistä tapaa käytettäessähän on mahdollista pyytää sivua viewthread.php?bid=11&tid=234, mistä aiheutuvat seuraavat kaksi ongelmaa:

1. Pääsyntarkistus jää helposti puolitiehen, eli se tapahtuu pelkästään bid-parametrissa mainitun keskustelualueen tunnisteen perusteella. Tällöin on ketjun tunnisteen tietämällä mahdollista lukea ketju alueelta, johon pääsyä ei oikeastaan pitäisi olla.

2. Vaikka kummankin parametrin sallittavuus tarkastettaisiinkin erikseen, kyselyn yhtenäisyyden tarkastaminen usein unohtuu, eli ketjun voi saada näyttämään eri alueella olevalta. Tämä voi olla pahakin ongelma jossain muussa järjestelmässä, esimerkiksi sellaisessa jossa parametrina on kuvan tunniste ja siihen liittyvän tekstin tunniste.

Lisäksi:

3. Jos ketju siirretään jollekin toiselle alueelle, eivät siihen aiemmin tehdyt linkit enää toimi.

Mikäli ketju voisi olla useammalla alueella kerrallaan, silloin saatetaan tarvita kahta parametria, jotta tiedetään kumman alueen kontekstissa ketju näytetään. En yritä väittää, että kahden parametrin käyttäminen yhden riittäessä automaattisesti tekisi järjestelmästä epäturvallisen. Yhtenäisyys tulee vain valvotuksi kuin itsestään, jos ketjun alueen hakee aina erikseen tietokannasta, eikä tietokantakyselyä pysty säästämään juuri tämän yhtenäisyyden valvomisen takia.

PS. Ohje pätee, vaikka parametrit välitettäisiinkin selaimen näkökulmasta osana polkua, esim. /11/234, ja vaikka kysely olisikin POST-metodia käyttäen tehty.