Kirjautuminen

Haku

Tehtävät

Opasarkisto: Käytännön PHP-opas: Osa 7 - Evästeet ja istunnot

  1. Osa 1 - Johdanto
  2. Osa 2 - Muuttujat ja taulukot
  3. Osa 3 - Komentorakenteet
  4. Osa 4 - PHP ja Internet-sivut
  5. Osa 5 - Tiedostojen käsittely
  6. Osa 6 - Funktiot
  7. Osa 7 - Evästeet ja istunnot
  8. Osa 8 - Tietokannat (MySQL)
  9. Osa 9 - Vinkkejä ja vihjeitä

Kirjoittaja: Antti Laaksonen. Vuosi: 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.

Evästeet

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ästeen luominen ja poistaminen

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ästeen lukeminen

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.

Istunnot

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.

Istuntojen käyttäminen

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";

Salasanat kirjautumisessa

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.

Loppusanat

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


Kommentit

Juho [16.06.2003 19:03:25]

Lainaa #

Toivottavasti tämä opas-sarja ilmestyy ladattavaksi

Gwaur [21.06.2003 17:55:40]

Lainaa #

Jippikaijee! Evästeitä vihdoinkin! :)

Tumpi [24.06.2003 14:54:38]

Lainaa #

Noi session-jutut tuli ihan yllätyksenä, ite oon käyttänyt istunnon aloittamiseen funktiota session_register ja lopetukseen session_unregister.

samlui [10.06.2004 18:52:41]

Lainaa #

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;

samlui [10.06.2004 18:53:54]

Lainaa #

itselläni on asennettuna php 4.3.7

Koipio-ohjelma [15.07.2004 21:37:32]

Lainaa #

eikös tuota hashia voi sanoa suoraan että se on 32-merkkiä pitkä heksadesimaali luku

Puhveli [31.01.2005 18:38:43]

Lainaa #

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!

Lern [15.03.2005 20:14:03]

Lainaa #

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.

edmundos [21.05.2005 19:30:54]

Lainaa #

sessioneista sais olla enemmän

d-hunter [12.06.2005 17:20:53]

Lainaa #

Lyhyehkö oli :(

miiro [11.02.2006 20:20:24]

Lainaa #

mikä on pisin mahdollinen kesto keksin olemassaololle?

u-2623 [23.04.2006 13:44:47]

Lainaa #

ääretön ;)

moptim [27.01.2007 09:01:35]

Lainaa #

teen foorumia ja logini käyttää istuntoja ja md5-algoritmia :)
lienee viimeistään huomenna valmis :P

moptim [27.01.2007 09:02:25]

Lainaa #

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

pophead [20.01.2008 22:31:23]

Lainaa #

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.

apsu [05.07.2008 07:18:00]

Lainaa #

Voisko joku selittää miks noi aaltosulut oikein on tossa?
echo "{$nimi}n auto on $auto";

apsu [05.07.2008 07:23:37]

Lainaa #

samlui kirjoitti:

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

$_session["kayttaja"] = $nimi;

ja $nimi on

$nimi = $_post['nimi'];

Luulisin että onkelma on se että kirjoitit

$_session["kayttaja"] = $nimi;

etkä

$_SESSION["kayttaja"] = $nimi;

rax [10.01.2009 10:15:30]

Lainaa #

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ä.

Rocceri [17.02.2009 15:51:34]

Lainaa #

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

punppis [04.04.2009 23:11:42]

Lainaa #

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);
?>

ErroR++ [17.04.2011 14:13:26]

Lainaa #

Iha hyvä mut salasanalla suojaamisesta ei puhuttu mitään.

Kirjoita kommentti

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.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta