Etusivu
Tietokoneet
Elektroniikka
Autot
Webmasters
Download
Linkit
Palaute
Pelit
Sekalaista

eXTReMe Tracker

WWW-sivujen tietoturvasta...

Tässä artikkelissa kerron muutamista tietoturvaan, hakkerointiin ja suoranaiseen ilkivaltaan liittyvistä asioista, jotka kannattaa ottaa huomioon www-sivuja tehdessä. En väitä, että tämä olisi läheskään täydellinen dokumentti aiheesta, mutta kerron muutamia tapoja ja asioita, joilla voi edes hieman hankaloittaa ja hidastaa esimerkiksi hakkerin murtautumisyrityksiä sivuillesi. Muutamat tässä artikkelissa mainituista asioista olen itse oppinut niinsanotusti kantapään kautta, mutta virheistähän oppii...

Valmiit skriptit

Internet on pullollaan valmiita, harrastajien tekemiä PHP-, Perl-, JavaScript- sun muita skriptejä, mutta niihin liittyy muutamia riskejä:

Tekijä on saattanut tehdä skriptin johonkin omaan projektiinsa eikä ole ottanut huomioon epärehellisiä käyttäjiä, jolloin kuka tahansa saattaa päästä vaikuttamaan skriptin toimintaan parametrejä muokkaamalla.

Entäs jos skriptin tekijä onkin itse epärehellinen? Tekijä on voinut tehdä skriptiinä takaoven, jota käyttäen pääsee käsittelemään tai katselemaan skriptin käsittelemiä tietoja tai skripti voi jopa lähettää tietoja (käyttäjätunnuksia, salasanoja, ...) esimerkiksi tekijänsä sähköpostiin.

Näiden riskitekijöiden takia kannattaakin itse tarkistaa huolellisesti skriptin toiminta ennen sen tuotantokäyttöön ottoa. Yleisimmät puutteet ovat salasanasuojauksien heikkous ja ettei käsiteltävän tiedon oikeellisuutta tarkisteta riittävän hyvin. Muunmuassa näitä asioita käsitellään myöhemmin tässä artikkelissa.

Hakemistolistaukset

Kaikki ovat varmaan joskus netissä surffaillessaan päätyneet paikkaan, jossa sivuston tiedostot näkyvät hakemistolistauksen tavoin. Jos tämäntyyppinen ilmiö osuu kohdalle omalla sivustolla, sille kannattaa pikaisesti tehdä jotakin, koska sopivassa hakemistossa tapahtuessa tämä voi paljastaa epärehelliselle kävijälle vaikkapa sivuston hallintaan käytettäviä salasanoja tai muuta arkaluontoista tietoa.

Yleensä kun yritetään hakea sivua, jonka osoite on muotoa http://www.osoite.com/hakemisto/, www-palvelin yrittää ensin lähettää selaimelle hakemistossa olevaa index.htm, index.html, index.php tai jotakin vastaavan nimistä sivua (nimi riippuu palvelimen aseuksista). Jos sivua ei löydy, palvelin yleensä näyttää hakemistossa näkyvät tiedostot edellämainitulla tavalla hakemistolistauksena.

Tämä ongelma on onneksi varsin helppo korjata. Seuraavassa pari helppoa tapaa:

Indeksitiedosto

Otsikko on ehkä hieman hämäävä ja kuullostaa paljon monimutkaisemmalta kuin onkaan. Tehdään esimerkiksi index.htm -niminen (nimi riippuu palvelimen asetuksista) tiedosto hakemistoon, niin palvelin näyttää sen sisällön hakemistolistauksen sijaan.

Tuota edellä mainittua tiedostoa ei välttämättä tarvitse jättää tyhjäksi, vaan siihen voidaan tehdä vaikkapa redirect eli uudelleenohjaus virhesivulle tai sivuston etusivulle. Halutessaan siihen voi jopa viritellä jonkinlaisen tunkeutujan raportointijärjestelmän, joka lähettää asiattoman tunkeutujan tiedot vaikkapa sähköpostin välityksellä sivuston ylläpitäjälle. Näitä tietoja voi hyödyntää tunkeilijan tunnistamiseen ja ne voi esimerkiksi lähettää tunkeilijan yhteydentarjoajalle, joka saattaa parhaimmassa tapauksessa jopa sulkea tunkeilijan internet-yhteyden. Tämä tapa soveltuu myös hakemistoihin, joissa on myös selaimella haettavia dokumentteja. Alla yksinkertainen esimerkki, jossa annetaan tunkeilijalle huomautus asiattomasta tunkeutumisesta.

index.htm
---------

<html>
<head>
  <meta name=robots content=noindex>
  <title>Luvaton tunkeutuminen</title>
</head>
<body>
  <h1>Luvaton tunkeutuminen</h1>
  <p>Olet tunkeutunut luvattomasti tähän hakemistoon, mene pois!</p>
</body>
</html>

htaccess

Toinen tapa on jo ehkä hieman hankalampi, mutta kuitenkin lähes jokaisen toteutettavissa. Jos kyseisessä hakemistossa ei ole mitään selaimella haettavia dokumentteja eli kyseisessä hakemistossa on vain jotakin skriptien käyttämiä datatiedostoja, voidaan toteuttaa myös hieman toisenlainen suojaus. Laitetaan hakemistoon alla olevan esimerkin mukainen .htaccess -tiedosto (tai muutetaan olemassaolevaa), joka kieltää hakemiston katselemisen selaimella. Se ei kuitenkaan estä skriptien toimintaa. Tähän tapaan voidaan myös liittää edellinen tapa, mutta siitä tuskin on sanottavaa hyötyä.

.htaccess
---------

Order Deny,Allow
Deny from all

Skriptien virhetarkistus

Skripteissä kannattaa ottaa kaikki mahdolliset virhetilanteet huomioon eikä vain siksi, ettei kävijä saisi esimerkiksi PHP:n vakiovirheilmoitusta ruudulleen, vaan siksi, että joskus virheilmoituksessa saattaa näkyä jotakin sellaista tietoa jota ei kaikkien välttämättä tarvitsisi nähdä. Tällaisia ovat esimerkiksi jotkut palvelimen hakemistopolut tai muuten piilossa majailevat, arkaluontoista tietoa sisältävät tiedostot (salasanatiedostot, konfiguraatiotiedostot, ...).

PHP:ssa saat piilotettua yksittäisten funktioiden mahdollisesti palauttamia virheilmoituksia laittamalla at-merkin (@) funktion nimen eteen. Tällä tavoin voi vaikka piilottaa sellaiset merkityksettömät virheilmoitukset, jotka aiheutuvat vaikkapa jonkun tiedoston puuttumisesta joka ei vaikuta skriptin toimintaan.

Kaikkia virheitä ei kannata edellä mainitulla tavalla piilottaa, vaan mieluummin tekee jonkinlaisen virhekäsittelijän, joka vaikkapa lähettää virheen sähköpostin välityksellä sivuston ylläpitäjälle ja antaa kävijälle jonkin hieman hienostuneemman virheilmoituksen.

Lomakkeella lähetettävät tiedot ja tietojen käsittely skriptissä

Lomakkeella lähetetyt tiedot kannattaa aina tarkistaa. Jos tietona odotetaan esimerkiksi numeroa, niin tarkistetaan onko todella lähetetty numero. Merkkijonon pituus kannattaa myös tarkistaa, tuskin kenelläkään on nimenä 138 merkkiä pitkä nimi. Yleensä lomakkeella lähetetään alfanumeerista tietoa, jossa ei ole välimerkkejä sun muita erikoismerkkejä. Silloin syötteen voi vaikka tarkistaa seuraavanlaisella regexp-lausekkeella: s/[^0-9a-zA-Z]//g joka palauttaa vain alfanumeeriset merkit. Sähköpostikentässä on vain seuraavassa mainitut merkit (40 kpl), joten sekin kenttä kannattaa tarkistaa kaiken varalta.

sähköpostiosoitteessa sallitut merkit
-------------------------------------

abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
. (piste)
_ (alaviiva)
- (väliviiva / miinusmerkki)
@ (at-merkki)

Ylipäätänsäkin kenttien oikeellisuustarkistussääntöjä kannattaa hieman miettiä. Seuraavassa on lueteltu muutamia suomen oloihin kelpaavia sääntöjä: Ikä-kenttään tuskin tulee yli kolmenumeroisia lukuja, vuosilukukenttään riittää neljä numeroa ja päivämääräkentässä ei varmaankaan ole muita merkkejä kuin numerot ja piste. Puhelinnumerokentässäkään ei tarvitse sallia kirjaimia ja sotu-kentässä on aina 11 merkkiä. Listaa voisi jatkaa loputtomiin, mutta idea varmaankin tuli jo selväksi.

Muutenkin kannattaa tarkistaa, tuleeko tieto GET- vai POST-metodilla vaiko kenties COOKIEsta. Tämä on hyvin yksinkertaista ainakin PHP:lla, koska tähän on ihan omat muuttujansa ($_GET, $_POST, $_COOKIE ja $_REQUEST).

Kaikki virheelliset tai väärällä metodilla lähetetyt parametrit kannattaa kirjata lokiin ja/tai lähettää sivuston ylläpitäjälle, koska näin voidaan havaita murtautumisyritykset ja mahdolliset virhetilanteet huomattavasti helpommin. Lokitiedostoja pitää myös säännöllisesti lukea, koska eihän niistä muuten mitään hyötyä ole.

Tästä aiheesta on jopa ihan erillinen sivu, jossa käsitellään asiaa hieman tarkemmin tutkimalla yksinkertaista kuvitteellista esimerkkiä, joka on aluksi aivan turvaton, mutta pikkuhiljaa tietoturvaa parannetaan asteittain.

SQL Injection

SQL Injection on hakkerointitekniikka, jota ei kannata jättää missään nimessä huomiotta. Tällä saa paljon pahaa aikaiseksi kohtuullisella vaivalla, joten käydään tätäkin asiaa hieman läpi. Käsittelen tämän melko pintapuolisesti lähinnä siksi, koska itse en ole hirveästi internetissä olevien SQL-tietokantojen kanssa ollut tekemisissä.

Helpoin tapa aloittaa SQL Injectionin estäminen on edellä mainittu lomakkeen tietojen tarkistaminen, koska hyökkäykseen käytettävien määrä pienenee, koska esimerkiksi pelkästään numeroita sisältävään kenttään on aika hankala tunkea SQL-kyselyn osia. Joissakin kentissä on ikävä kyllä pakko sallia lähestulkoon kaikki mahdolliset merkit, joten tämä ei välttämättä vielä riitä estämään kaikkia hyökkäyksiä.

Lisätietoja SQL Injectionista saa vaikkapa SPI Dynamicsin tai Next Generation Security Softwaren sivuilta tai hakemalla GOOGLElla hakusanalla "sql injection".

Käyttäjien rajaaminen

Joskus on tarvetta rajoittaa tietylle sivulle pääseviä kävijöitä. Käyttökohteita on esimerkiksi vain jäsenille tarkoitettu alue ja sivuston hallintatyökalut. Yleisimmin käytetty tapa on salasanat, mutta niistä lisää vähän myöhemmin.

Myös IP-osoitteen perusteella voidaan rajoittaa tietyille sivuille pääsyä. Seuraavassa PHP-kielinen skriptinpätkä, joka päästää sivulle vain yhdellä IP-osoitteella (esimerkissä 127.0.0.1) ja muille väittää, ettei sivua ole olemassakaan:

rajattu.php
-----------

<?php
  if($REMOTE_ADDR=="127.0.0.1") {
    sisaan();
  } else {
    header("HTTP/1.0 404 Not Found");
  }
?>

Tuostahan on sitten helppo muokata sellainen versio, että se hyväksyy vaikkapa vain välillä 123.45.67.xxx - 123.45.68.xxx olevat IP-osoitteet eli dynaaminen IP-osoite ei välttämättä ole tämänkään keinon käytön esteenä. Tosin, suojauksen taso laskee sen verran, että kaikki saman palveluntarjoajan yhteyttä käyttävät luultavasti pääsevät tämän jälkeen sivulle, mutta parempi sekin kuin kaikki internet-käyttäjät.

Tässä menetelmässä on huomioitava, että IP-osoitteiden "NATtaus" (Network Address Translation) saattaa vaikuttaa tuohon IP-osoitteeseen, joten se on otettava huomioon. Tietenkin voi käyttää esimerkiksi proxyn osoitetta samalla periaatteella, mutta tässäkin tapauksessa suojauksen teho on mietittävä tapauskohtaisesti.

Artikkelin seuraava osa...

  © 2002-2017 Juha Levänen  -=-  Käyttöehdot