Artikkelit -> PHP-sivun tietoturva

PHP-sivun tietoturva

Luotu: 27.7.2009
Päivitetty: 25.4.2010


Tämä opas osoittaa PHP ja MySQL sivujen tärkeimmät turvallisuusriskit, joiden avulla joku voi hyökätä sivustollesi. Vahinko voi kohdistua sivuusi ja sen käyttäjiin.

Varmista kaikki käyttäjältä tuleva syöte

Käytännössä hyökkääjällä on kolme mahdollisuutta hyökätä sivustollesi:

  • Palvelimen käyttöjärjestelmän tai ohjelmiston tietoturva-aukko. Tähän et voi vaikuttaa muuten kuin pitämällä ohjelmiston päivitettynä.
  • Sivustolle käyttäjältä tuleva syöte. Jokainen monimutkaisempi sivusto vastaanottaa jotain tietoa käyttäjältä.
  • Cross-site scripting. Tällä tekniikalla huonosti tehdyn sivuston ylläpitäjän kone tekee vahingot. Käsitellään oppaan lopussa.

Kaikkein todennäköisin ja helpoin tapa on keskimmäinen. Varmista siis aina käyttäjältä tuleva mikä tahansa syöte. Hyvä sääntö on pitää jokaista vierailijaa potentiaalisena hakkerina. Älä siis koskaan luota siihen, että käyttäjän lähettämä tieto on sitä mitä oletat sen olevan.

Alla on listattu yleisimmät sivuston kohdat, joissa käyttäjän syötettä voidaan hyödyntää huonosti tehdyllä sivustolla.

Tiedoston lukeminen sivulle:

Monet PHP-sivut on jaettu useampaan tiedostoon, joista tarvitut liitetään sivulle. Se on toimiva ja järkevä ratkaisu kunhan se on tehty oikein.
Useimmissa sivustoissa näykyvän sivun valinta perustuu osoiterivillä annettavaan tietoon: esim. index.php?sivu=etusivu tms.

Huonoin mahdollinen tapa on pyytää käyttäjältä suora tiedostonimi esim. sivu=etusivu.html. Tässä tilanteessa hyökkääjä voi lukea minkä tahansa palvelimen tiedoston vain muuttamalla osoiterivin muuttujaa.

Vastaavasti huonosti tehty sivusto saattaa (toteutustavasta riippuen) hyväksyä myös Internet-osoitteen sivuksi: index.php?sivu=www.hyökkäyssivu.hax/lähetävirus.php.
Lähettämällä linkin jollekkin yleiselle sivulle virus näyttää tullevan sinun sivustoltasi ja luotettavasta osoitteesta.

Tämän voi estää joko karsimalla kauttaviivat ja pisteet (myös muut turhat merkit) muuttujasta ja linkittämällä sen suoraan haluttuun kansioon. Vielä turvallisemmin - hyväksymällä vain tietyt muuttujat, esim.:

if ($sivu=="etusivu") include("etusivu.php");
elseif ($sivu=="linkit") include("linkit.php");
else include("404.php");
jne. Näin vain halutut osoitteet hyväksytään ja nekin liittävät ennaltamäärätyn tiedoston.

Internet sivulla näytettävä syöte:

Jos käyttäjän antama syöte tulee näkymään jossain kohtaa sivustollasi (vieraskirjat, blogit, kommentointi, hakutulokset), muista aina korvata HTML erikoismerkit, kuten "<" ja ">" HTML vastineilla "&lt;", "&gt;".
Tämän voi tehdä esimerkiksi PHP:n str_replace funktiolla:

$teksti=str_replace($teksti, "<", "&lt;");
$teksti=str_replace($teksti, ">", "&gt;");

Korvatuilla merkeillä HTML koodi näkyy tavallisena tekstinä: <b>Lihavoituako?</b>

Muussa tapauksessa hyökkääjä voi näyttää omaa HTML koodiaan sivustollasi. Pahimmassa tapauksessa liittää kehyksen (frame) toiselle sivustolle tai suorittaa haluamaansa JavaScript koodia muiden vierailijoiden koneilla. Käyttäjän kannalta hyökkäys näyttää tulevan sinun sivustoltasi. Tämä hyökkästyyppi tunnetaan yleisesti nimellä XSS-hyökkäys (cross-site scripting).

Älä tallenna käyttäjän tietoa PHP päätteiseen tiedostoon:

Jos sivustosi tallentaa käyttäjän lähettämiä tiedostoja tai ylipäätään mitä tahansa tekstiä palvelimellesi, varmista ettei kohdetiedoston pääte ole PHP!

Muussa tapauksessa on mahdollista, että hyökkääjä sisällyttää siihen PHP koodia ja voi käytännössä tehdä mitä tahansa sivustollesi.

Jos tallennat käyttäjän tietoja *.php tiedostoon esim. muodossa:

$nimi="*käyttäjän lähettämä syöte*";
?>
Varmista vähintäänkin ettei viesti sisällä "-merkkejä tai muita merkkejä jotka voivat rikkoa merkkijonon määrityksen.

Edellinen tapaus varmistamattomana sallisi hyökkääjän lähettää nimenään esim.

MiikaH"; sivustontuhoavafunktio(); $joku="

, jolloin se näyttäisi tiedostoon tallennettuna tältä:

$nimi="MiikaH"; sivustontuhoavafunktio(); $joku="";
?>

Kun sivustosi seuraavan kerran hakisi tiedoston (esim. nimen näyttäessä) suorittaisi se samalla kaiken hyökkääjän lisäämän koodin. Ja jos hyökkääjä haluaisi: poistaisi koko sivuston.

Varmenna MySQL-haut:

Edellisen esimerkin tavoin hyökkääjä voi päästä käsiksi myös sivustosi MySQL-tietokantoihin. Jos siis liität hakuun suoraan käyttäjän antaman muuttujan, voi hän oikealla lainaus- tai heittomerkkien käytöllä rikkoa muuttujamäärityksen ja suorittaa haluamansa MySQL komennot.

Tämä on estettävissä korvaamalla erikoismerkit joko käyttämällä itse tehtyä funktiota tai käyttämällä MySQL:n valmista mysql_real_escape_string() -funktiota.

Varmista linkin lähdesivu

Jos sivustollasi on tekemäsi hallintaosio tai muu mahdollisuus vaikuttaa sivun tietoihin, on hyvä käytäntö varmistaa, että muokkauspyyntö tuli sivustoltasi. Tämä tapahtuu varmistamalla$_SERVER['HTTP_REFERER'] -muuttuja. Se on selaimen lähettämä tieto sivusta jolta käyttäjä siirtyi nykyiselle sivulle.

Oletetaan, että hallintapaneelisi toimii osoiterivin avulla, ja sisältää vaikka mahdollisuuden poistaa viestin osoitteella : hallinta.php?toiminto=poistaviesti&viesti=23399.

Hallintasivu vaatii salasanan, joka on liian hankala murrettavaksi. Hyökkääjä kuitenkin tietää, että selaimesi on määritetty automaattisesti kirjautumaan hallintapaneeliisi. Hän siis piilottaa linkin esim. JavaScriptiin tai kuvaan jollain toisella sivustolla jolla vierailet. (Tai lähettää sähköpostina ym. olettaen että avaat sen.)

Jos linkin osoite johtaa hallintapaneeliisi osioon: hallinta.php?toiminto=poistaviesti&viesti=23399, poistaa sivustosi viestin sillä sinulla on oikeat salasanat ja olet kirjautuneena sisään.

Tämä on kuitenkin helppo estää tarkistamalla edellä mainittu $_SERVER['HTTP_REFERER'] -muuttuja. Määritä sivustosi hyväksymään tärkeät toiminnot vain jos ne on suoritettu turvallisesta lähteestä: sinun hallintapaneelistasi. Jos linkki on avattu muusta ohjelmasta tai kirjoitettu osoiteriviin on HTTP_REFERRER tyhjä, jos se on avattu muulta sivustolta, se sisältää toisen sivuston osoitteen.

Huomioi kuitenkin, että HTTP_REFERRER on helppo "väärentää", tämä onnistuu jopa joidenkin selainten asetuksista. Sitä ei siis kannata käyttää ainoana turvatoimena. Se kuitenkin estää ainakin kyseiset oman selaimesi kautta tulevat hyökkäykset.


(Kommentteja, kysymyksiä tai keskustelua artikkelista.)

- Ei kommentteja -

Kommentoi:
Nimi: *
Kotisivu:
Kieli:
Arvio:
Varmistuskoodi: *verification image (?)
Kommentti: *
Tehnyt: Miika HämäläinenViimeksi päivitetty: 07.11.2014 14:18MiikaH:n Sivut a.k.a. MiikaHweb | 2003-2021