Luon portaalin jonne käyttäjät rekisteröityvät tunnus-salasana parilla (tietokanta) ja autentikointi tapahtuu php-sessiolla. Miten turvallinen tämä ratkaisu on käytännössä?
login formista ohjautuu check.php
if {
session_start();
header("Cache-control: private");
$_SESSION["name"] = $_POST['user'];
}
else
ja jokaisella sivulla tarkastetaan sessio
session_start();
if(!isset($_SESSION["name"])) {
header("location: login.php");
return;
}
else
logout.php
session_start();
unset($_SESSION["name"]);
session_destroy();
Kyseessä ei ole mikään pankin järjestelmä, mutta en halua että käyttäjien sessioita voidaan "kaapata" tai väärentää.
login formista ohjautuu check.php
if {
session_start();
header("Cache-control: private");
$_SESSION["name"] = $_POST['user'];
}
else
ja jokaisella sivulla tarkastetaan sessio
session_start();
if(!isset($_SESSION["name"])) {
header("location: login.php");
return;
}
else
logout.php
session_start();
unset($_SESSION["name"]);
session_destroy();
Kyseessä ei ole mikään pankin järjestelmä, mutta en halua että käyttäjien sessioita voidaan "kaapata" tai väärentää.
Vastaukset 4
Vanhimmat
Kyllä tuon on moneen tarkoitukseen ihan turvallinen. Mitä tuohon sinun nimeämis käytäntöön tulee niin jos nimi on määritetty niin pääsee sisään. Mielestäni olisi järkevintä tehdä uusi muuttuja jonka nimeäisit paremmin ja kuvaisi asiaa että liittyy sisäänkirjaantumiseen. Ja sitten lisäksi nimi ja muitakin mikäli niitä tarvitset.
"Kyseessä ei ole mikään pankin järjestelmä, mutta en halua että käyttäjien sessioita voidaan "kaapata" tai väärentää."
Tuo mahdollistaa session kaappaamisen. Ei tarvitse kuin saada tietoon käyttäjän session ID-tunniste, tämä onnistuu esim olantakaa kurkkimalla, tai käyttäjä liittää linkin johonkin foorumiin jne... (mikäli kuletat ID:tä URL:ssa, etkä vain keksissä). Kaikilla ei keksejä sallittu riippuen palvelustasi voit ne vaatia. Toki keksistäkin tiedot saa, mutta se poistaa tuommoset ns helpot tavat ja tietämättään tehdyt jutut.
Mutta voit tietenkin vaikeuttaa session kaappaamista lisäämällä kirjaantumis scriptissä md5(IP-osoite selain) sessioon.
Tällöin vain katsot joka sivunlatauksen yhteydessä onko tarkiste sama, ja uloskirjauksessa poistat sen.
Ja käytä hyväksesi includea niin ei tarvitse käsin lisätä tuommosia juttuja joka sivulle.
"md5(IP-osoite selain)"
Lisätään vielä että tuo tarkoittaa sitä että sessio on sidottu tiettyyn IP-osoitteeseen ja selaimeen.
IP-osoite kannattaa ottaa esim http://mureakuha.com/koodikirjasto/145 näin voi saada kävijän IP-osoitteen vaikka olisi proxyn takana.
Mutta ei tuo silti ihan aukoton ole, sillä esim kouluissa useat koneet näkyvät samalla IP-osoitteella, jolloin periaatteessa tuo on helppo kiertää.
Sekä kannattaa vielä lisätä että sessio on voimassa esim 5 minuuttia viimeisestä sivunlatauksesta, tuo aika riippuu toki mimmoiselle sivulle tulee.
Nuo asiat on helppo tehdä joten ne kannattaa tehdä vaikka kyse onkin ei niin salaisesta jutusta.
Kiitos hyvistä vinkeistä.
En kuljeta mitään käyttäjätietoja url:ssa (formista $_postina tarkistuskriptille), sen vuoksi otin käyttöön session. Miten kaappaus käytännössä voisi tapahtua (itselläni ei mitään ideaa)? Jos palvelin rekisteröi session niin voiko silloin joku toinen väittää omistavansa session jotenkin? Keksejähän on helppo väärentää mutta tuossahan ei mitään kulje kekseissa vaan ilmeisesti selaimen rekistereissä(?) jotka varmasti pystyy myös väärentämään. Jos palvelin tuhoaa session niin silloinhan kukaan ei voi väärentää sessiota, vain silloin kun joku on kirjautuneena sisään? Eli pelkästään 5 min aikaraja sessiolle ratkaisisi 99% tietoturvaongelmista.
"Miten kaappaus käytännössä voisi tapahtua (itselläni ei mitään ideaa)? Jos palvelin rekisteröi session niin voiko silloin joku toinen väittää omistavansa session jotenkin?"
Yksinkertaisesti foorumi.php käyttää sessioneita. Jolloin osoite on http://sivusi.com/foorumi.php?sid=cocii09a1crts9lcirrnb9ske0 tuo sid on sessionin tunniste, mikäli keksit sallittu niin silloin tuo sid on kekseissä piilossa.
Jolloin kaappaajan ei tarvitse kuin tietää tuo sessionin ID. Siis länttäsee osoiteriville http://sivusi.com/foorumi.php?sid=cocii09a1crts9lcirrnb9ske0 (yleensä käytetään session_id, sid tai PHPSESSID, tämä riippuu asetuksista, mut ei muuta asiaa)
Asia muuttuu hitusen vaikeemmaksi jos ID hyväksytään vain kekseistä, ei osoiteriviltä. Esim scriptin alussa ini_set('session.use_only_cookies', 1); tuo toki kannattaa määrittää .htaccess mikäli mahdollista.
Toki tuo tieto on helppo kekseihin laittaa, mutta vaikea se tieto on sieltä saada käyttäjän tietämättä.
Sekä kannattaa käyttää http://fi.php.net/manual/fi/function.session-regenerate-id.php TRUE-parametrillä tuo muuttaa joka sivunlatauksella ID:n ja tuhoaa vanhalla ID:llä olevan jolloin kaappaaminen hitusen vaikeutuu.
"Keksejähän on helppo väärentää mutta tuossahan ei mitään kulje kekseissa vaan ilmeisesti selaimen rekistereissä(?)"
Tuo sessionin ID kulkee joko osoitteen perässä tai keksissä. Juuri tuon takia sessionin kaappaus onnistuu helposti mikäli sitä ei ole yhtään vaikeutettu. Lataas Firefox Live HTTP headers laajennos niin näät miten selain ja palvelin keskustelee ja halutessa pystyt muuttamaan tietoja helposti. Sekä toinen laajennus on Web Developer joka on varsin hyödyllinen.
Mutta kyllä tiedot kannattaa ennemmin sessionissa säilyttää kuin keksissä. Riippuen tietenkin mimmosista tiedoista kyse, jos esim kävijän sivun tekstinkoko niin se ilman muuta kekseissä.
"Jos palvelin tuhoaa session niin silloinhan kukaan ei voi väärentää sessiota, vain silloin kun joku on kirjautuneena sisään?"
Niin kyllä palvelin tuhoaa itse sessionit joskus aika riippuu asetuksista. Toki ne voi itse tuhota kuten teet, mutta tämä edellyttää että käyttäjä kirjaantuu palvelusta ulos eikä vain sammuta selainta siksi tuo aikaraja kannattaa määritellä, ettei kukaan voi käyttää tuota samaa sessionia päivien kuluttua.
"pelkästään 5 min aikaraja sessiolle ratkaisisi 99% tietoturvaongelmista."
Tiedä sitten noista prosenteista, mutta kyllä tuo vaikeuttaa asiaa kun kaappaaminen on tapahduttava 5 minuutin sisällä viimeisestä sivunlataamisesta. Ja kun tuohon lisää vielä tuon md5 jutun ja session_regenerate_id(TRUE) niin silloin voidaan puhua jo aika turvallisesta, kun kaappaus on tapahduttava ennen kuin käyttäjä on kerennyt sivua lataamaan uudestaan, ja pyyntö on tultava samasta IP-osoitteesta ja sisältää saman selain tiedon.
Tietenkin jos haluaa vielä parempaa turvallisuutta niin sitten suojattua yhteyttä kannattaa käyttää.