Kirjoittaja: Antti Laaksonen (2003).
⚠ Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi. ⚠
Kun käyttäjä kirjautuu tunnuksellaan ja salasanallaan sisälle Internet-palveluun, kirjautuminen on voimassa sivulta toiselle. Verkkokaupoissa taas ostoskorin sisältö säilyy tallessa aina maksuun saakka. Tällaisia tilanteita varten tarvitaan tekniikka käyttäjäkohtaisen tiedon pysyvään säilyttämiseen. Tekniikoista suosituimmat ovat evästeet ja istunnot.
Vanhin ja varmaan yleisin toteutustapa on käyttää evästeitä (cookies, "keksit"). Eväste on pieni tiedonmurunen, tekstinpätkä, jonka selain tallentaa käyttäjän koneelle. Evästeet liittyvät aina yhteen palveluun, ja niillä on tietty voimassaoloaika. Selaimen asetuksista voi kuitenkin kytkeä pois evästeet, minkä vuoksi niiden ei voi olettaa toimivan kaikilla käyttäjillä. Jotkut näet pitävät evästeitä uhkana yksityisyydelle.
Eväste luodaan PHP:n setcookie
-funktiolla. Ensimmäinen parametri on nimi, jolla evästeeseen myöhemmin viitataan. Toinen parametri on evästeen arvo, tallennettava tieto. Kolmas parametri kertoo, kuinka kauan eväste säilyy käyttäjän koneella. Jos kolmatta parametria ei ole annettu, eväste on voimassa istunnon ajan eli niin kauan kuin selainikkunaa ei suljeta.
(maaritys_e.php) <?php //luo evästeen nimi, jonka arvo on Juho setcookie("nimi", "Juho"); //tämä eväste on voimassa seuraavat 10 minuuttia setcookie("auto", "Honda", time() + 60 * 10); ?>
Joillakin sivuilla kirjautuminen tuntuu olevan voimassa selauskerrasta toiseen, kun käyttäjätunnuksen ja salasanan kerran syöttää. Tällöin evästeen voimassaoloaika on sijoitettu kauas tulevaisuuteen, esimerkiksi vuoden päähän (time()
+ 60 * 60 * 24 * 365).
Evästeen poistaminen tapahtuu samalla funktiolla, mutta nyt arvo on tyhjä merkkijono. Tällä kertaa voimassaoloaika on asetettava menneisyyteen, jotta poistaminen onnistuu oikein kaikilla selaimilla. Seuraava skripti poistaa ne evästeet, jotka edellinen skripti loi.
(poisto_e.php) <?php //poistetaan edellisessä esimerkissä luodut evästeet setcookie("nimi", ""); setcookie("auto", "", time() - 60 * 10); ?>
Evästeet on luotava ja poistettava ennen kuin mitään muuta kirjoitetaan sivulle, koska ne kulkevat sivun otsikkotietojen mukana.
Evästeiden lukeminen on mahdollista $_COOKIE
-taulukon kautta (vanhemmissa PHP:n versioissa taulukon nimi oli $HTTP_COOKIE_VARS
) tai - PHP:n asetuksista riippuen - samannimisistä muuttujista. Seuraava skripti tulostaa evästeiden sisältämät tiedot, jos toinen skripti on ne ensin asettanut.
(luku_e.php) <?php //haetaan ensimmäisessä esimerkissä luodut evästeet muuttujiin $nimi = $_COOKIE["nimi"]; $auto = $_COOKIE["auto"]; //tulostetaan evästeiden tiedot echo "{$nimi}n auto on $auto"; ?>
Jos odotetaan kymmenen minuuttia, auton merkki ei enää näy sivulla. Jos selain avataan uudestaan, nimi häviää. Jos suoritetaan toinen esimerkkiskripti tai tuhotaan evästeet selaimen asetuksista, kummatkin tiedot katoavat.
Istuntojen toiminta perustuu siihen, että palvelun käyttäjälle muodostetaan yksilöllinen id-tunnus, joka joko tallennetaan evästeeseen tai kulkee URL:n mukana. Palvelimelle luodaan PHP:n asetuksissa määriteltyyn hakemistoon id-tunnusta vastaava tiedosto, johon istunnossa käytetyt muuttujat tallentuvat.
Istunto aloitetaan session_start
-funktion avulla. Tämän jälkeen istunnon muuttujia käsitellään $_SESSION-taulukon kautta (entinen $HTTP_SESSION_VARS
). Esimerkki määrittää kaksi istuntomuuttujaa.
(maaritys_i.php) <?php //aloitetaan istunto session_start(); //määritetään istuntomuuttujat $_SESSION["nimi"] = "Juho"; $_SESSION["auto"] = "Honda"; ?>
Muuttujien lukeminen onnistuu suoraan samasta taulukosta. Tämä skripti lukee ja tulostaa edellisessä esimerkissä määritetyt istuntomuuttujat.
(luku_i.php) <?php //aloitetaan istunto session_start(); //luetaan istuntomuuttujat $nimi = $_SESSION["nimi"]; $auto = $_SESSION["auto"]; //tulostetaan tiedot echo "{$nimi}n auto on $auto"; ?>
Istuntomuuttujat poistetaan unset
-funktiolla.
(poisto_i.php) <?php //aloitetaan istunto session_start(); //poistetaan istuntomuuttujat unset($_SESSION["nimi"]); unset($_SESSION["auto"]); ?>
Palvelimella oleva istuntotiedosto, johon edellisissä esimerkeissä käytetyt muuttujat on tallennettu, voisi näyttää tältä tekstieditorissa:
auto|s:5:"Honda";nimi|s:4:"Juho";
Sekä evästeiden että istuntojen avulla on mahdollista tehdä kirjautumisjärjestelmä, mutta kuinka salasanat pitäisi tallentaa? Eräs turvallinen tapa on käyttää MD5-algoritmia (PHP:ssä md5
-funktio).
MD5-algoritmi ei kryptaa salasanaa, vaan laskee siitä 32 merkkiä pitkän numeroista ja kirjaimista a - f koostuvan tarkistussumman, "hashin". Tarkistussummaa voisi verrata jakojäännökseen: siitä ei ole mahdollista selvittää alkuperäistä salasanaa, mutta kahden tarkistussumman vertaaminen paljastaa salasanan oikeellisuuden.
Tämän menetelmän varjopuoli on se, että jos käyttäjä unohtaa salasanansa, sitä ei tiedä edes sivun ylläpitäjä. Lisäksi on syytä muistaa, että turvallisesta tekniikasta huolimatta lyhyet salasanat murtuvat nopeasti kaikkia vaihtoehtoja kokeilemalla, jos tarkistussumma ajautuu ulkopuolisten tietoon.
Opassarjaan on tulossa näillä näkymin vielä kaksi osaa, joista seuraava, muutaman viikon päästä ilmestyvä osa käsittelee MySQL-tietokannan käyttämistä PHP:n kautta.
Antti Laaksonen, 15.6.2003
Toivottavasti tämä opas-sarja ilmestyy ladattavaksi
Jippikaijee! Evästeitä vihdoinkin! :)
Noi session-jutut tuli ihan yllätyksenä, ite oon käyttänyt istunnon aloittamiseen funktiota session_register ja lopetukseen session_unregister.
mikä on vikana kun tulee ilmoitus
Parse error: parse error, unexpected T_VARIABLE in c:\palvelin\kirjaudu.php on line 8
ja line 8 on tämännäköinen
$nimi = $_post['nimi']; $_session["kayttaja"] = $nimi;
itselläni on asennettuna php 4.3.7
eikös tuota hashia voi sanoa suoraan että se on 32-merkkiä pitkä heksadesimaali luku
Heh, ihmettelin miksen saa keksiä "topiklubi.tunnus" toimimaan. Sitten kun vaihdoin pisteen undescoreksi niin johan toimii. Olisi oppaassakin voinut lukea että siinä pitää olla urli-kompatiplejä merkkejä. Mutta sitähän ohjelmointi onkin, yrityksen ja erehdyksen kautta =). Kiitos keksioppaasta!
Mikshän mulle ei tuu kekseistä outputtiin mitään, ku oon omalla koneella, mutta toiselta koneelta näkee? Selaimessa ei vikaa. Näkyy, jos siirrään esim. toiselle servulle.
sessioneista sais olla enemmän
Lyhyehkö oli :(
mikä on pisin mahdollinen kesto keksin olemassaololle?
ääretön ;)
teen foorumia ja logini käyttää istuntoja ja md5-algoritmia :)
lienee viimeistään huomenna valmis :P
samlui, toisinpäin se line 8, funktioon ei voi sijoittaa arvoa :)
EDIT: ja kai muistit md5-kryptauksen?
EDIT2: omg lol, eihä toi sessiohärpäkke ookkaa funcktio
Voi veljet :D Muutaman tunnin taistot piti käydä jotta hokasin missä menee pieleen. Path määrittely puuttui kokonaan. Eli kun meni eri hakemistoon niin keksipä hävisi bittiavaruuteen.
setcookie ("koodi",$koodi,0,"/");
Eli keku kestää ja toimii domainin kaikissa hakemistoissa.
Voisko joku selittää miks noi aaltosulut oikein on tossa?
echo "{$nimi}n auto on $auto";
samlui kirjoitti:
mikä on vikana kun tulee ilmoitus
Parse error: parse error, unexpected T_VARIABLE in c:\palvelin\kirjaudu.php on line 8ja line 8 on tämännäköinen
$_session["kayttaja"] = $nimi;ja $nimi on
$nimi = $_post['nimi'];
Luulisin että onkelma on se että kirjoitit
$_session["kayttaja"] = $nimi;
etkä
$_SESSION["kayttaja"] = $nimi;
apsu kirjoitti:
Voisko joku selittää miks noi aaltosulut oikein on tossa?
echo "{$nimi}n auto on $auto";
Jos laitettaisiin että:
echo "$nimin auto on $auto"; niin php tajuaisi $nimin kohdan yhtenä muuttujana, eikä silleen että tulostaa $nimi muuttujan sisällön ja laittaa ännän perään.
Aaltosulut on siis siksi että erotetaan muuttuja muusta tekstistä.
Oisiko jollakin esimerkkiä näyttää ja koodia antaa, miten saisi tehtyä sellaisen skriptin, että on tälläinen normaali textarea boxi johon kirjoitetaan tekstiä, ja sitten alapuolella olisi nappi "Tallenna". Sitten ne tiedot tallentuisivat, ja ensikerralla näkisit samat asiat samassa paikassa ja pystyisi muokkaamaan.
Kukakohan tajus? :s
Millä perusteella käyttäjän sessio säilyy? Tietääkseni php-skripti tekee sessioid-cookien, jossa on sitten jonkinlainen uniikki id. Tuleeko tämä id ip-numeron vai minkä perusteella vai onko se vain random? Mitä jos käyttäjä poistaa cookien?
Edit: Noh, päätinpä sitten itse testailla tätä ja tulin siihen tulokseen, että joka kerta kun cookieta ei ole ja sessio_start():ia kutsutaan, niin generoidaan random (uniikki) sessioid. Jos siis haluaa säilyttää sessio datan vaikka käyttäjä tyhjentää cookiet, niin sessioid tulee tallentaa tietokantaan. Sessio id:tä pystyy vaihtamaan session_id()-funktiolla. Ilman parametrejä se palauttaa nykyisen sessio id:n ja jos laittaa uuden sessioid:n parametriksi, niin se vaihtaa nykyisen sessioid:n täksi. Tässä vielä koodipätkä havainollistamaan toimintaa:
<?php $yhteys = mysql_connect("localhost", "root", ""); mysql_select_db("database"); $user = 1; if(!isset($_COOKIE["PHPSESSID"])) { $q = mysql_query("SELECT session FROM data WHERE user = $user"); $session = mysql_result($q, 0, 0); session_id($session); } session_start(); if(@$_GET["register"] == 1) { $session = session_id(); mysql_query("UPDATE data SET session = '$session' WHERE user = $user"); $_SESSION["datatesting"] = "apina ja gorilla, kävelivät torilla"; } echo $_SESSION["datatesting"]; mysql_close($yhteys); ?>
Iha hyvä mut salasanalla suojaamisesta ei puhuttu mitään.
Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.