[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info (at) builder.cz   Inzerce: reklama (at) grafika.cz
Diskuzní fóra
.Net (68472)
ASP (1591)
ActiveX (168)
Allegro (136)
Assembler (3926)
C++ Builder (23160)
C/C++ (44499)
Databáze (30680)
Delphi (78808)
DelphiX (1655)
DirectX (1464)
Java (39508)
JavaScript (12598)
Matematické programy (2178)
OOP a UML (732)
OpenGL (6920)
Php (65225)
PowerBuilder (464)
Problémy a algoritmy (10473)
Programování v Linuxu (2000)
Právo a programování (3384)
Python (1353)
Ruby (136)
Visual Basic (12078)
Visual C++ (12956)
Wap (56)
Web (10895)
Web servery (5549)
Win32 (13553)
Windows CE (865)
XML/XSL (1860)
Textová inzerce
Služby Builder.cz
  • Bazar - koupím(0)
  • Bazar - prodám(0)
  • Hledám práci(0)
  • Nabízíme práci(0)
  • Projekty(0)
  • Session v PHP
    Co to vlastně session jsou? Co nám nabízejí a jak nám usnadňují práci? Proč a jak je používat? Článek se snaží na tyto otázky odpovědět.

    Obsah článku

    - úvod
    - Praktická ukázka
    Autor: Petr Macek
    Rubrika: PHP
    Publikováno: 19.03. 2003
     Tisk článku
    Poslat odkaz emailem
     

    Jak jistě víte protokol HTTP, který slouží ke komunikaci mezi www serverem a prohlížečem je bezstavový (mezi jednotlivými přechody stránek se neudržuje žádné spojení. Když kliknete na odkaz, pouze se spojí klient se serverem, server pošle stránku a spojení se ukončí). To je dost velká nevýhoda, hlavně pokud píšete větší aplikaci. Zjistíte, že by bylo vhodné znát obsah hodnotu proměnné, kterou uživatel odeslal formulářem asi tak o 3 stránky dříve. Pokud je to jedna dvě proměnné, není problém si ji předávat v odkazech (př: <A href="neco.php?promenna=hodnota&...">) nebo ve formulářích jako pole typu hidden ( <INPUT type=hidden name="promenna" value="hodnota">). Pokud by ale udajů mělo být hodně, skripty by byly dost nepřehledné a místo ladění chyb byste zkoumali, co jste zapomněli kde předat. Proto máme v PHP session.

    Co od session můžeme očekávat a co potřebujeme?
    1) identifikaci uživatele - abysme mohli nějaké proměnné uchovávat, musíme vědět od koho pocházejí
    2) uchovávání obsahu proměnných

    Abychom jednotlivé uživatele od sebe rozeznali, potřebujeme nějaký identifikátor prohlížeče (standardně býva v PHP pojmenován PHPSESSID, často se používá i authid). Jeho název můžeme nastavit v php.ini nebo pomocí funkce session_name (o tom více později). Ten musí být předáván s každým požadavkem na server. Skript vygeneruje identifikátor a předá ho uživateli (není vhodné generovat identifikátor hned na úvodní stránce, komplikuje to práci vyhledávačů a často ani neregistrují URL, které předává parametry (metoda GET)). Lepší je generovat ho později, třeba při úspěšném přihlášení uživatele nebo třeba při vložení prvního zboží do nákupního koše. Jsou dvě možnosti předávání:
    Cookies - při každém dalším přístupu se v požadavku klienta posílají i cookies (a samozřejmě i ta naše s identifikátorem).
    URL parametr - přímo v odkazech (metoda get) a formulářích (post nebo get). Ke každému skriptu volanému odkazem se přidá identifikátor (např. <A href="pokus.php?authid=5465967416161654964664">odkaz</A>) nebo ve formuláři:
    <FORM action="pokus.php">
    <INPUT type=hidden name="authid" value="5454657469487912314564654">
    .
    .
    .
    </FORM>



    Oba způsoby mají své výhody a nevýhody. Použití cookie je jednodušší, ale uživatel je může vypnout. Potom přestávají správně fungovat i session. V druhém případě nás uživatel nemůže překvapit, když cookies nepoužívá. Bohužel je to ale trochu náročnější na tvůrce skriptu. Když ve skriptu identifikátor zapomenete, skript by nefungoval správně. Další a hlavní nevýhodou při předávání v URL je možnost zjištění identifikátoru jinou osobou (například pomocí proměnné HTTP_REFERRER, v logu proxy serveru, ...). Pokud by skript spoléhal jen na identifikátor, mohla by jiná osoba se znalostí identifikátoru získat přístup na stránky, z jejichž URL identifikátor získal. Při použití v URL je proto vhodné kombinovat session ještě třeba s kontrolou IP adresy a času.

    Možná se ptáte proč session jsou, když stejně musím předávat identifikátor. Mohl bych přece předávat rovnou proměnné. Uvědomte si, že ale stačí předávat jednu proměnnou (v aplikaci bez session by se jich mohlo předávat o dost více). A hlavně: php lze nastavit tak, že se o předávání starat nemusíte a php ho bude předávat automaticky.


    Nastavení

    Nastavit chování můžeme několika způsoby. Vše lze nastavit v php.ini pomocí následujících direktiv:
    session.save_handler - určuje, co se použije pro ukládání dat session (soubor, databáze)
    session.save_path - adresář pro ukládání souborů session (použije se v případě session.save_handler = files)
    session.name - jméno identifikátoru. Stejně se bude jmenovat i cookie, pokud k předávání identifikátoru cookie použijete
    session.auto_start - Pokud nastavíme na 1, budou se session spouštět automaticky, jinak je musíme spouštět ručně funkcí session_start().
    session.use_cookies - určuje, že se pro předávání identifikátoru použije cookie
    session.use_only_cookies - dovoluje k přenosu identifikátoru použít pouze cookie
    session.cookie_lifetime - nastavení doby platnosti cookie ve vteřinách. Je možné nastavit 0, cookie pak platí do ukončení prohlížeče
    session.cookie_path - cesta uložená v cookie
    session.cookie_domain - doména uložená v cookie
    session.cookie_secure - dovoluje poslat cookie jen na zabezpečeném spojení (HTTPS)
    session.gc_probability - pravděpodobnost, že se garbage collection spustí při každém požadavku. Udává se v procentech. Není dobré nastavovat vysokou hodnotu. Garbage collector je poměrně náročný na výkon. Je lepší aby se spouštěl méně a mazal více dat, než aby se spouštěl při každém požadavku a nemazal nic.
    session.gc_maxlifetime - určuje po kolika vteřinách budou nepoužívaná data považovaná za smetí a vyčištěna
    session.referer_check - kotrola HTTP Referer
    session.entropy_file - cesta k externímu souboru, který se použije jako externí zdroj ke generování identifikátoru
    session.entropy_length - určuje kolik bajtů se přečte z externího souboru
    session.cache_limiter - nastavení způsobu kešování
    session.cache_expire - nastavení expiračního času pro kešování
    session.use_trans_sid - nastavuje automatické předávání identifikátoru
    url_rewriter.tags - určuje, které html tady budou upraveny (bude do nich přidán identifikátor, pokud je nastaveno session.use_trans_sid)

    Vždy ale přístup k php.ini nemáme (např. hosting). Potom můžeme použít funkci ini_set. Funkce změní hodnotu konfigurační volby a vrátí předchozí hodnotu. Při chybě vrátí FALSE.
    Př: ini_set('session.name','authid');

    Ini_set nám dovolí nastavit téměř vše z nastavení session. Všechny direktivy patří mají příznak PHP_INI_ALL a je možné je nastavovat z uživatelských skriptů. Jedinou vyjímkou je session.use_trans_sid (PHP_INI_SYSTEM, PHP_INI_PERDIR). Lze měnit v php.ini, httpd.conf nebo .htaccess. Podrobnosti jak a co lze nastavit je nad rámec tohoto článku. Podrobnosti naleznete na www.php.net.

    Dalším způsobem jak něco nastavit je možné pomocí funkcí přímo k tomu určených, například: session_set_cookie_params, session_cache_limiter.


    Funkce

    Pro práci se session se nám budou hodit následující funkce:
    session_start - nastaví session data
    session_register - registrování proměnné do session
    session_is_registered - zjišťuje, jestli je proměnná registrovaná v session
    session_id - nastaví nebo vrátí session id
    session_name - nastaví nebo vrátí session name

    Ještě se nám budou hodit fce isset a empty. Nebudu zde vypisovat jak přesně která funkce pracuje, to si jistě najdete na www.php.net v přehledu funkcí.


    SID

    Pro usnadnění práce při předávání identifikátoru slouží konstanta SID. Dala by se zapsat jako jmeno_identifikatoru=hodnota ( stejného výsledku dosáhnete zápisem echo session_name()."=".session_id(); ).

    Př. 1:
    header ('Location: http://'.$_SERVER['SERVER_NAME'].'/index2.php?'.SID);


    Př. 2:
    <A href=index2.php?<? echo SID ?>>



    Bezpečnost

    Než přejdeme k ukázce skriptu, ještě je třeba zmínit jednu důležitou věc. Už jste určitě slyšeli o superglobálních polích, globálních proměnných, register_globals, ... Z důvodu vyšší bezpečnosti se ve verzi php 4.1.0 objevilo superglobální pole $_SESSION (stejné jako známe například $_GET, $_POST,...).
    Ve starších verzích php, ale pole $_SESSION nemáme a proměnné musíme registrovat pomocí funkcí session_register. Při nastavení register_globals = off ale takový způsob registrace nefunguje.

    Je bezpečnější používat pole $_SESSION. V opačném případě (session_register a register_globals =on) nemáme totiž jistotu, odkud data pocházejí. Pokud máme například skript, ve kterém je v session proměnné $prihlaseny určeno, zda uživatel může do systému, můžeme narazit:
    session_register ("prihlaseny");

    if ( $prihlaseny == 1 ) {
    // jsem v systemu
    }


    Pokud ale skript zavolám index.php?prihlaseny=1 dostanu se také do systému. Protože podmínka je splněna. Když ale budu testovat podle následujícího skriptu, už budeme mít jistotu, že v proměnné je skutečně hodnota ze session.


    if ($_SESSION['prihlaseny'] == 1) {
    // jsem v systemu
    }



     Následující kapitola (Praktická ukázka) >> 


    Zpět na začátek stránky

    Autor: Petr Macek
    Klikni pro další články autora

    Hodnocení článku
    1 | 2 | 3 | 4 | 5
    Aktuální známka: 2.63
    (Počet známek: 9154)

    Komentáře k článku
    mat10.08.23:36proc tak slozite?
    pm17.04.13:53nefunguje...
    Petr Macek18.04.15:04RE: nefunguje...
    Jack0607.07.20:24Jak pls.
    Petr01.05.15:43Registrace a přihlášení
    Kubicq08.09.16:28Díky
    desi10.05.21:54Sessions a overovanie uzivatela
    Slash13.06.9:32RE: Sessions a overovanie uzivatela
    xdeimosx11.02.18:54problem
    jardos05.03.15:41RE: problem
    Merle27.06.14:03problemy se session na webzdarma
    JimmyFLASH17.04.23:24RE: problemy se session na webzdarma
    Zbynek Voracek07.05.15:13session.save_handler
    etienne26.03.10:54redirect
    Petr Macek26.03.11:28RE: redirect
    Michal30.05.18:03RE: RE: redirect
    peter20.03.15:44bezpecnost
         





    info@builder.cz
    Vydává Grafika Publishing, s.r.o.
    Copyright (c) 1997-2002 Všechna práva vyhrazena