PHP:n tietoturva

Mureakuha

Loikkaa: valikkoon, hakuun

On hyvin vaikea puhua tietoturvasta yleisesti, mutta voidaan esittää yleisempiä virheitä. Kyseisiä virheitä tai puutteita näkee jopa myytävissä tuotteissa. Hyvä tietoturva syntyy kun käyttäjä ymmärtää riskit ja tarpeet.


Sisällysluettelo

Superglobaalit

Superglobaali tarkoittaa muuttujaa, jota voidaan lukea ja käsitellä missä tahansa. Näistä keskitytään neljään yleisempään: $_GET, $_POST, $_REQUEST ja $_COOKIE. Näiden muuttujien sisältö on käyttäjän määrittelemä, joten et voi etkä saa ikinä olettaa niiden sisältävän jonkin arvon. $_SESSION ei kuulu listaan, koska käyttäjä ei pysty itse vaikuttamaan sen sisältöön.

Hyvin usein näkee $_POST:ia käytettävän suoraan SQL-kyselyssä, joka sallii käyttäjän tehdä SQL-injektion.

Register globals

Myös hyvin usein näkee käytettävän register_globals -direktiiviä, joka rekisteröi superglobaalit normaaleiksi muuttujiksi. Tämä asetus huonontaa tietoturvaa ja saattaa aiheuttaa odottamattomia tuloksia. Esimerkiksi $_GET['nimi'] muutetaankin $nimi:ksi, jolloin et enään voi tietää tuliko se $_GET:in kautta vai onko se sinun itsesi asettama muuttuja.

Magic quotes

Asetus escapeaa superglobaaleista stringit. Tämä voi kuulostaa järkevältä ja kätevältä ominaisuudelta, mutta mitäpä jos et haluakaan käyttää ko. asetusta. Tai satut käyttämään toista palvelinta, jossa tuota direktiiviä ei ole laitettu päälle. Taaskin tulos on odottamaton ja tarkistaminen vie turhaa aikaa. Asetus ei tee SQL-kyselyitä turvalliseksi, koska kaikki tietokantapalvelimet eivät käytä samoja escape-merkkejä kuin magic quotes. Esimerkkinä SQLite käyttää toista lainausmerkkiä lainausmerkin escapemiseksi (""), kun taas MySQL käyttää kenoviivaa (\"). Asetus ei myöskään huomio muita merkkejä kuin lainausmerkit ja hipsut.

Syötteen tarkistaminen

Syötettä voidaan tarkistaa usella tavalla. Yksi hyvä tapa on tiukka validointi, eli varmistetaan että syöte tosiaankin on jokin haluttu.

<?php
// Esimerkin vuoksi oletetaan syötteen sisältävän merkkijonon "Matti Meikäläinen"
// $_POST['nimi'] = 'Matti Meikäläinen';
 
// Tehokas keino on syötteen tiukka tarkistaminen
if (preg_match('/^[a-zA-ZäöÄÖ]+$/',$_POST['nimi'])) {
   // Tässä esimerkissä syöte voisi sisältää merkkijonon, jossa voi olla vain merkkejä a-zA-ZäÄöÖ.
   print 'Merkkijono: ' . $_POST['nimi'];
} else {
   print 'Syöte on jotakin muuta kuin sallittu.';
}
?>



Tämä artikkeli on tynkä. Voit auttaa Kuhaa täydentämällä tämän sivun tietoja.
Henkilökohtaiset työkalut