Računalniki Windows internet

PHP session_id () se posodobi ob vsaki zahtevi, $ _COOKIE je prazen. Zaščita identifikatorja seje v PHP Seja v php

Spletni strežnik ne podpira stalna povezava z naročnikom, vsaka zahteva pa se obdela kot nova, brez povezave s prejšnjimi.
To pomeni, da ne morete niti slediti zahtevam istega obiskovalca, niti shraniti spremenljivk zanj med ogledi. posamezne strani... Seje so bile izumljene za reševanje teh dveh težav.
Pravzaprav so seje, na kratko, mehanizem, ki vam omogoča edinstveno identifikacijo brskalnika in ustvari datoteko za ta brskalnik na strežniku, ki shranjuje spremenljivke seje.

Ne bom podrobno opisoval potrebe po takem mehanizmu. Gre za primere učbenikov, kot so nakupovalni voziček v e-trgovini, avtorizacija, pa tudi ne povsem trivialne težave, kot je na primer zaščita interaktivnih delov spletnega mesta pred vsiljeno pošto.

Načeloma je precej enostavno narediti lasten analog sej, ki ni tako funkcionalen kot vgrajeni PHP, a v bistvu podoben. O piškotkih in bazi podatkov.
Ko zahtevamo skript, pogledamo, ali je prispel piškotek z določenim imenom. Če piškotka ni, ga nastavite in v bazo podatkov napišite novo vrstico z uporabniškimi podatki. Če obstaja piškotek, beremo iz baze podatkov. Z še eno zahtevo izbrišemo stare zapise iz baze in zdaj imamo pripravljen mehanizem seje. Sploh ni težko. Vendar pa obstaja nekaj odtenkov, zaradi katerih je boljša uporaba vgrajenega mehanizma seje.

Če je omogočen samo prvi, potem na začetku seje (ob vsakem klicu session_start ()) za odjemalca je nameščen piškotek. Brskalnik pravilno vrne ta piškotek z vsako naslednjo zahtevo, PHP pa ima identifikator seje. Težave se začnejo, če brskalnik ne vrne piškotkov. V tem primeru bo PHP vedno začel novo sejo, ne da bi prejel piškotke z identifikatorjem, in mehanizem ne bo deloval.

Če je omogočena samo druga, potem piškotek ni nastavljen. In kar se zgodi, je, zaradi česar je pravzaprav vredno uporabiti vgrajeni mehanizem seje. Ko skript opravi svoje delo in je stran v celoti oblikovana, PHP vse to pregleda in vsaki povezavi in ​​vsakemu obrazcu doda ID seje. Izgleda nekako takole:
Indeks se spremeni v
Indeks
in obrazcem je dodano skrito polje

In brskalnik, ko kliknete katero koli povezavo ali ko kliknete gumb v obrazcu, bo v zahtevo poslal spremenljivko, ki jo potrebujemo - identifikator seje!
Iz očitnih razlogov se ID doda samo relativnim povezavam.

Teoretično lahko v naših domačih sejah o piškotkih in bazi podatkov ročno dodelite prenos id-ja vsem povezavam - in potem bodo naše lastne seje delovale neodvisno od piškotkov. Ampak, vidite – bolj prijetno je, ko to dela nekdo drug? ;-)

Privzeto v najnovejše različice PHP sta vključeni obe možnosti. Kako PHP to obravnava? Kuharica je vedno razstavljena. Povezave se samodejno dokončajo le, če PHP ne najde piškotka z ID-jem seje. Ko uporabnik med to sejo prvič obišče spletno mesto, dobi piškotek in dodane so povezave. Ob naslednji zahtevi, če so piškotki podprti, PHP vidi piškotek in preneha dopolnjevati povezave. Če piškotki ne delujejo, potem PHP še naprej pravilno dodaja id povezavam in seja ni izgubljena.
Uporabniki, ki imajo piškotke, bodo videli dolgo povezavo z ID-jem samo enkrat.

Fuh. Ko je prenos identifikatorja končan.
Zdaj je treba nanjo povezati datoteko s podatki na strani strežnika.
PHP bo to naredil namesto nas. Dovolj je samo napisati
začetek_seje ();
$ _SESSION ["test"] = "Pozdravljeni svet!" ;

PHP bo testno spremenljivko zapisal v datoteko, povezano s to sejo.
Tukaj je zelo pomembna točka.
Niz $ _SESSION- poseben.
V njem so pravzaprav spremenljivke, ki jih želimo dati na voljo v različnih skriptah.
Če želite spremenljivko postaviti v sejo, jo preprosto dodelite elementu matrike $_SESSION.
Za pridobitev njegove vrednosti je dovolj, da se sklicujete na isti element. Primer bo spodaj.

Zbiranje smeti - odstranjevanje zastarelih PHP datoteke naredi tudi sam. Pa tudi kodiranje podatkov in kup drugih potrebnih stvari. Zaradi te skrbi je delo s sejami zelo enostavno.
Tukaj smo pravzaprav prišli do primera dela sej.
Primer je zelo majhen:
začetek_seje ();

odmev "Posodobili ste to stran"... $ _SESSION ["števec"] ++. "enkrat.";
odmev "
nadgradnja ";
?>

Preverimo, ali imamo spremenljivko števca v seji, če ne, jo ustvarimo z vrednostjo 0, nato pa izpišemo njeno vrednost in jo povečamo za eno. Povečana vrednost bo zapisana v sejo in naslednjič, ko bo skript poklican, bo imela spremenljivka vrednost 1 itd.
Vse je zelo preprosto.

Če želite imeti dostop do spremenljivk seje na kateri koli strani spletnega mesta, morate na samem začetku VSAKE datoteke napisati SAMO ENO (!) vrstico, v kateri potrebujemo seje:
začetek_seje ();
Nato se sklicujte na elemente matrike $_SESSION. Na primer, preverjanje avtorizacije bi izgledalo nekako takole:
začetek_seje ();
če ($ _SESSION ["avtorizirano"]<> 1 ) {
glava ("Lokacija: /auth.php");
izhod;
}

Odstranjevanje spremenljivk iz seje.
Če imate register_globals = off, potem samo napišite
nenastavljen ($ _ SESSION ["var"]);
Če ne, potem v bližini Moram pisati z njo
session_unregister ("var");

Najpogostejše napake, ki jih PHP daje pri poskusu dela s sejami, so:
dva izmed njih,
Opozorilo: piškotka seje ni mogoče poslati - glave so že poslane
Opozorilo: Omejevalnika predpomnilnika seje ni mogoče poslati - glave so že poslane

zaradi istega razloga, je rešitev opisana v tem dejstvu
tretjič,
Opozorilo: odprtje (/ tmp \ sess_SID, O_RDWR) ni uspelo: ni takšne datoteke ali imenika (2) v full_script_path na številki vrstice(prej je izgledala kot Opozorilo: Podatkov o seji (datoteke) ni bilo mogoče napisati. Preverite, ali je trenutna nastavitev session.save_path pravilna (/ tmp)),
če je preveden iz angleščine, podrobno razloži težavo: pot, podana v php.ini, do imenika, kamor so zapisane datoteke seje, ni na voljo. To napako je najlažje odpraviti. Samo napišite imenik, ki obstaja in je zapisljiv, npr.
session.save_path = c: \ windows \ temp
In po tem ne pozabite znova zagnati Apache.

Kot se je izkazalo, človeška inteligenca nima meja, zato moram pojasniti:
tretje sporočilo o napaki (imenika ni mogoče najti) bo NEDOSTOPNO vodilo do prvih dveh, ker se sporočilo o napaki izpiše v brskalnik in za njim ne morete uporabiti glav. Zato ne hitite iskati prezgodnjega zaključka, ampak najprej napišite pravilno pot!

Naslednja najpogostejša težava pri obravnavi sej je težka zapuščina register_globals. NE dajajte skriptnih spremenljivk enakih imen kot indeksi matrike $_SESSION!
Z register_globals = on bodo vrednosti prepisali druga drugo in boste zmedeni.
In če register_globals = off, se prikaže še ena napaka: "Vaš skript se verjetno zanaša na stranski učinek seje, ki je obstajal do PHP 4.2.3." ... Če se ga želite znebiti, morate vedno inicializirati spremenljivke pred uporabo (ali vsaj preveriti obstoj) in ne dajati globalnih imen spremenljivk, ki se ujemajo z indeksi matrike $_SESSION.

Če ne deluje, vendar se tudi ne prikažejo nobena sporočila, dodajte dve vrstici na samem začetku skripta, ki sta odgovorni za prikaz VSEH napak na zaslonu - povsem možno je, da so napake, vendar jih preprosto ne vidite njim.
ini_set ("display_errors", 1);
poročanje o napaki (E_ALL);

ali si oglejte napake v dnevniku napak. Na splošno tema o prikazovanju sporočil o napakah presega obseg tega članka, zato se prepričajte, da jih vsaj vidite. V tem razdelku si lahko preberete nekaj več podrobnosti o odpravljanju težav.

Če ste prepričani, da ni napak, a dani primer vseeno ne deluje, potem je možno, da PHP ne omogoča prenosa id-ja preko url-a, in piškotki iz nekega razloga ne delujejo.
Poglejte, kaj imate s piškotki.
Na splošno, če vaše seje "ne delujejo", najprej poskusite ročno prenesti identifikator seje, torej ustvarite povezavo in ji dodelite identifikator:
začetek_seje ();
če (! isset ($ _ SESSION ["števec"])) $ _SESSION ["števec"] = 0;
odmev "Posodobili ste to stran"... $ _SESSION ["števec"] ++. "enkrat.

nadgradnja ";
?>

Ko to počnete, se prepričajte, da direktiva session.use_only_cookies ni omogočena, kar preprečuje, da bi PHP sprejel ID seje, če je bil posredovan prek URL-ja.

Če ta primer ne deluje, je težava bodisi v banalnem tipkarske napake(polovica "težav" s sejami izvira iz napačno črkovanega imena spremenljivke) ali tudi stara različica PHP: podpora za sejo je bila uvedena v različici 4.0 in matriki $ _SESSION- v 4.1 (Prej uporabljeno $ HTTP_SESSION_VARS).
Če deluje, je težava v piškotkih. Spremljajte, kakšen piškotek strežnik postavi v brskalnik, ali ga brskalnik vrne. Iskanje je zelo uporabno pri ogledu izmenjave glave HTTP med brskalnikom in strežnikom.
Razlaga delovanja piškotkov je izven obsega tega že tako prevelikega besedila, vendar se vsaj prepričajte, da strežnik pošlje piškotek z identifikatorjem, brskalnik pa se vrne. In medtem ko identifikatorji sovpadajo med seboj =)
Nastavitev piškotka bi morala izgledati tako
Set-Cookie: PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6;
ali kako
Set-Cookie: PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6; pot = /
(če zahtevate skript, ki ni iz korenskega imenika)
Odgovor strežnika bi moral izgledati tako
Piškotek: PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6
oz
Piškotek: PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6; b = b
če brskalnik poleg ID-ja seje vrne še druge piškotke.

Če brskalnik ne vrne piškotkov, preverite, ali piškotki sploh delujejo.
Prepričajte se, da ima domena, do katere dostopate, običajno ime (ki ima vsaj eno piko in ne vsebuje prepovedanih znakov, kot so podčrtaji) in počistite predpomnilnik brskalnika – to sta dva glavna razloga, zakaj piškotki morda ne delujejo.

Če primer od tukaj deluje, vaša lastna koda pa ne, potem težava očitno ni v sejah, ampak v algoritmu. Poiščite, kje ste izgubili spremenljivko, prenesite primer od tu korak za korakom, razhroščite svoj skript.

Druga težava se lahko pojavi, če uporabljate preusmeritev glave ali navigacijo JavaScript.
Dejstvo je, da PHP samodejno doda identifikator seje samo povezavam obrazca , vendar tega ne stori za glave, javascript, meta oznake.
Zato morate identifikator dodati ročno, na primer tako:
header ("Lokacija: /script.php?". ime_seje (). "=". id_sesije ());

Prav tako zelo redko in popolnoma nejasno je, od kod prihaja težava, težava je v tem, da ima nastavitev session.save_handler drugo vrednost kot datoteke. Če temu ni tako, popravite.

Varnost
Varnost seje je obsežna tema. Zato se bom osredotočil na nekaj glavnih točk.
Najbolj učbeniška stvar je, da identifikatorja ne prenesete skozi naslovna vrstica... To je zapisano celo v php.ini, vendar to omejuje funkcionalnost sej. Če se odločite upoštevati ta nasvet, potem poleg session.use_trans_sid = 0, ne pozabite na session.use_only_cookies = 1
Priporočljivo je, da sejo povežete z naslovom IP: na ta način, če je identifikator ukraden, ga zlobnež v večini primerov še vedno ne bo mogel uporabiti.
Priporočljivo je, da uporabite direktivo session.save_path, s pomočjo katere lahko nastavite svoj imenik za shranjevanje datotek seje. To je bolj varno, kot če so shranjeni v privzetem začasnem imeniku v skupni rabi strežnika.

Dodatne informacije:

  • Mehanizem seje poleg piškotkov pošilja tudi glave, ki prepovedujejo predpomnjenje strani (isti omejevalnik predpomnilnika). Za html je to pravilno in potrebno. Ko pa poskušate poslati datoteko s skriptom, ki preverja avtorizacijo, Internet Explorer zavrne prenos. Prav zaradi tega naslova. Pokliči
    session_cache_limiter ("zasebno");
    morate rešiti težavo pred začetkom seje.
  • Nenavadno, vendar v nizu $ _SESSION ne morete uporabljati številčnih indeksov - $ _SESSION [1], $ _SESSION ["10"]- seje ne bodo delovale.
  • Nekje med 4.2 in 5.0 ni bilo mogoče nastaviti session.use_trans_sid z ini_set ()... Od 5.0 je že spet možno.
  • Pred različico 4.3.3 je piškotek PHP poslal piškotek le, če zahteva na začetku seje ni vsebovala identifikatorja. Zdaj se piškotek pošlje ob vsakem klicu session_start ()

    Primer avtorizacije z uporabo sej
    Ponazorimo vse zgoraj navedeno z majhnim primerom:
    ustvarimo datoteko auth.php:
    if (isset ($ _ POST ["auth_name"]))
    {
    $ sql = "IZBERI * IZ uporabnikov KJE ime =? S";
    $ vrstica = $ db -> getRow ($ sql, $ _POST ["auth_name"]);
    če ($ vrstica && password_verify ($ _POST ["auth_pass"], $ vrstica ["pass"])) (
    $ _SESSION ["user_id"] = $ vrstica ["id"];
    }
    glava ("Lokacija: http: //". $ _SERVER ["HTTP_HOST"]. $ _SERVER ["REQUEST_URI"]);
    izhod;
    }

    if (isset ($ _ GET ["action"]) IN $ _GET ["action"] == "odjava") (
    začetek_seje ();
    seja_uniči ();
    glava ("Lokacija: http: //". $ _SERVER ["HTTP_HOST"]. "/");
    izhod;
    }

    če (! isset ($ _ SESSION ["user_id"])) (
    ?>








    izhod;
    }

    Zdaj je dovolj, da v vse zaščitene skripte napišete vrstico
    zahtevajte "auth.php";
    V tem primeru se domneva, da se je seja že začela in je bila povezava z bazo podatkov ustvarjena z uporabo Class za varno in priročno delo z MySQL. Predpostavlja tudi, da je bilo geslo zgoščeno s priporočeno funkcijo password_hash.
    Primer zaščitene datoteke:

    začetek_seje ();
    vključujejo "safemysql.class.php";
    $ db = nov safemysql (["db" => "test"]);
    vključujejo "auth.php";
    ?>
    skrivnost

    Odjava

    OPS! Zelo uporabne povezave:
    http://www.php.net/manual/ru/ref.session.php - najnovejše in najnovejše informacije o podpori sejam v PHP v uradni dokumentaciji ter številni komentarji uporabnikov. Branje zelo priporočljivo.
    http://phpclub.ru/manrus/f/ref.session.html - ZELO zastarel prevod tega poglavja v ruščino, iz dokumentacije, ki jo je prevedel Alexander Pyramidin.
    http://phpclub.ru/detail/article/sessions
    Članek s pretencioznim naslovom "Resnica o sejah". Pusti ambivalenten vtis. Na začetku avtor ZELO enostavno govori o sesijskem mehanizmu, metode, ki jih predlaga proti koncu članka, pa so popolnoma blatne.

    Članek iz učbenika Dmitrija Borodina s spletnega mesta
    http://php.spb.ru/ močno NE priporočamo.
    Fantje, strašno je zastarela. Ne samo, da so v njem dejanske netočnosti, ampak seje v PHP že dolgo niso bile uporabljene.
    Najlepša hvala Dimi zanjo, to je bil prvi članek o sejah v ruščini, sam sem ga študiral, zdaj pa jo moram poslati na zaslužen počitek.
    Prav tako so na žalost zastareli tudi številni drugi članki, ki so na internetu in niso bili posodobljeni že leta.

  • Seje v PHP so mehanizem za shranjevanje informacij o odjemalčevem računalniku na strani strežnika. Dejansko seje v PHP-ju niso tako težka tema, a da bi jo razumeli, morate vedeti, kako piškotki delujejo v PHP. Torej, če ne veste, kako piškotki delujejo v PHP, potem najprej preberite ustrezen članek in se nato vrnite sem.

    Beseda session iz angleščine je prevedena kot seja, zato je sam pomen sej v PHP-ju bolj jasen, vendar se je izraz "sessions" zataknil med programerje in ga bomo uporabili v tem članku.

    Seje v PHP so zelo podobne mehanizmu piškotkov, enaki pari ključ => vrednosti, le da so shranjeni na strani strežnika.

    Funkcija Session_start ().

    Začeti moramo sejo, za to obstaja funkcija session_start (). Ta funkcija začne sejo ali sejo, kakor koli jo imenujete.

    Funkcijo session_start () je zaželeno poklicati na samem začetku strani, vendar v mojih primerih ne.

    matrika $_SESSION

    Seje so skupine spremenljivk, ki so shranjene na strežniku, vendar se nanašajo na enega edinstvenega obiskovalca. Ponavljam, to ključni trenutek: seje so shranjene na strežniku.

    Da bi zagotovili interakcijo vsakega obiskovalca z njegovimi podatki iz njegove seje, se uporablja piškotek, ukaz za ustvarjanje, ki ga PHP daje sam, vam ni treba skrbeti. Ta piškotek je smiseln samo za strežnik in ga ni mogoče uporabiti za pridobivanje uporabniških podatkov.

    Na strežniku so shranjeni podatki o seji besedilna datoteka in so na voljo v programu PHP v nizu $ _SESSION. Če želite shraniti spremenljivko v seji, ji morate dodeliti vrednost v tem nizu.

    Končno začnimo uporabljati primere. Vse je zelo preprosto.

    Seje v PHP vrednost.";?>

    Zdaj pa poskusimo dobiti vrednost iz matrike $_SESSION v drugem primeru.

    Seje v PHP

    Upoštevajte, da če v drugem primeru odstranimo funkcijo session_start (), potem ne bomo imeli dostopa do podatkov matrike $ _SESSION.

    Funkcija Session_id ().

    Ko je seja ustvarjena, samodejno dostopate do edinstvenega identifikatorja seje s funkcijo session_id (). Ta funkcija vam omogoča, da nastavite in pridobite vrednost identifikatorja seje.

    Seje v PHP

    V orodni vrstici lahko poiščete razvijalce svojega brskalnika (v Chromu za to pritisnite Ctrl + Shift + I, nato Viri in tam boste našli piškotek), ta domena je postavila piškotek za vaš brskalnik z imenom PHPSESSID in nekaj takole: "7g5df9rkd1hhvr33lq1k6c72p7".

    Po vrednosti PHPSESSID bo strežnik določil vaš brskalnik in deloval z ustreznim naborom spremenljivk, ki bodo na voljo skriptu prek matrike $ _SESSION, kot je bilo že omenjeno.

    Funkcija Ime_seje ().

    Če vam funkcija session_id () omogoča pridobitev vrednosti identifikatorja seje, funkcija session_name () omogoča, da ugotovite ime seje.

    Seje v PHP

    Še enkrat o funkciji session_start ().

    Zdaj vemo več o mešanju sej v PHP in ponovno se moramo vrniti k funkciji session_start (). Ta funkcija inicializira mehanizem seje za trenutnega uporabnika. Kako točno se to zgodi:

    • Če je uporabnik prvič zagnal spletno mesto, session_start () nastavi piškotek na odjemalcu in ustvari začasno shranjevanje na strežniku, povezano z ID-jem uporabnika.
    • Definira shrambo, povezano s posredovanim trenutnim identifikatorjem.
    • Če so podatki v shrambi na strežniku, so postavljeni v polje $_SESSION.
    • Če je register_globals iz datoteke php.ini On, potem vsi elementi matrike $_SESSION postanejo globalne spremenljivke.

    Primer uporabe seje

    Zdaj si bomo ogledali primer, ki vam bo omogočil, da malo eksperimentirate s sejami.

    Seje v PHP

    Števec

    V trenutni seji ste odprli stranenkrat.

    Odprite primer v "> tem zavihku.

    Vse delo sej temelji na matriki $_SESSION, to je jasno vidno v tem primeru.

    Če zaprete okno brskalnika, bo seja prekinjena, naš števec se bo ponastavil na nič. To vedenje sej v PHP je mogoče spremeniti, k temu vprašanju se bomo vrnili malo dlje v članku.

    Konec seje

    Za zaključek seje potrebujemo:

    1. Počistite matriko $ _SESSION.
    2. Izbrišite začasno shranjevanje na strežniku.
    3. Izbriši piškotek seje.

    Matriko $ _SESSION lahko počistite s funkcijo session_unset ().

    Funkcija session_destroy () odstrani začasno shranjevanje na strežniku. Mimogrede, nič drugega ne počne.

    Sejni piškotek morate odstraniti s funkcijo setcookie (), ki smo se je naučili v lekciji o delu s piškotki v PHP.

    Primer konca seje:

    Konec seje

    Seja se je končala.

    Zdaj lahko izvedete poskus: zaženite primer s števcem v enem oknu, navijte števec in nato zaženite primer z brisanjem seje in znova osvežite stran s števcem.

    Piškotek lahko izbrišete takole:

    setcookie (ime_seje (), "", čas () - 60 * 60 * 24 * 32, "/")

    Še enkrat o funkcijah session_name () in session_id ().

    Funkciji session_name () in session_id () se v praksi redko uporabljata, vendar pišem o njih, saj mora članek razkriti sam mehanizem sej v PHP.

    Te funkcije lahko uporabite za definiranje lastnih imen in ID-jev sej, vendar to ni priporočljivo. Če jih želite nastaviti, napišite te funkcije z argumenti pred funkcijo session_start (), kot v spodnjem primeru:

    Seje v PHP

    V tem primeru bo vsem uporabnikom dodeljen isti ID seje.

    Ustavimo se tukaj podrobneje, če zaženete primer iz razdelka o funkciji session_name () (tu je povezava) v različnih brskalnikih (na primer v Chromu in Internet Explorerju), potem bo imel vsak brskalnik svojo edinstveno sejo identifikator. Brskalniki shranijo piškotke vsak v svojo mapo, zato bo funkcija session_start () vsakemu brskalniku dala svoj edinstven identifikator in v skladu s tem bo za vsak brskalnik ustvarjen edinstven pomnilnik na strežniku. Zato bo primer števca (ta) deloval neodvisno drug od drugega v vsakem brskalniku.

    Če nastavite isti identifikator seje za vse uporabnike, bodo delali z istim repozitorijom na strežniku. Tukaj je primer števca, ki bo štel obiske iz različnih brskalnikov:

    100) (session_unset (); session_destroy ();)?> Seje v PHP

    Števec številka 2

    Odprl stran v različnih brskalnikihenkrat.

    Odprite primer v "> tem zavihku.

    Če zaženete ta primer, ni dejstvo, da boste tam videli enoto. Drugi obiskovalci so morda že spremenili vrednosti v shrambi sej na strežniku. Ne vem, kdaj strežnik v tem primeru izbriše pomnilnik, tako da, če števec preseže 100, bom končal sejo.

    Nastavitev čakalne dobe

    Privzeto seja "živi", dokler obiskovalec ne zapre okna brskalnika. To je posledica dejstva, da funkcija session_start () odjemalcu nastavi tak piškotek.

    Življenjsko dobo seje lahko spremenite s funkcijo session_set_cookie_params (), tukaj je njena sintaksa.

    session_set_cookie_params (int življenjska doba [, pot niza [, domena niza [, bool secure]]])

    V praksi je dovolj, da uporabite samo prvi parameter (lifetime), tu zapišete čas v sekundah, ki določa, koliko naj si strežnik zapomni stanje seje po zaprtju brskalnika.

    Funkcija session_set_cookie_params () velja samo za trajanje skripta.

    Tukaj je primer uporabe te funkcije:

    Seje v PHP

    Števec št. 3

    Števec vrednosti:.

    Odprite števec v "> tem zavihku.

    Zaprite števec in zaprite brskalnik, po 30 sekundah znova odprite ta primer. Vaša seja bo shranjena.

    Seje so pravzaprav zelo preproste. Samo razumeti morate, čemu so namenjeni in kako so urejeni. Odgovorimo najprej na prvo vprašanje.
    Morda veste, da spletni strežnik ne vzdržuje stalne povezave z odjemalcem in se vsaka zahteva obdela kot nova, brez komunikacije s prejšnjimi.

    To pomeni, da ne morete niti slediti zahtevam istega obiskovalca, niti zanj shraniti spremenljivk med ogledi ločenih strani. Seje so bile izumljene za reševanje teh dveh težav.
    Pravzaprav so seje, na kratko, mehanizem, ki vam omogoča edinstveno identifikacijo brskalnika in ustvari datoteko za ta brskalnik na strežniku, ki shranjuje spremenljivke seje.

    Ne bom podrobno opisoval potrebe po takem mehanizmu. Gre za primere, kot so nakupovalni voziček v spletni trgovini, avtorizacija, pa tudi ne povsem trivialne težave, kot je na primer zaščita interaktivnih delov strani pred vsiljeno pošto.

    Načeloma je precej enostavno narediti lasten analog sej, ki ni tako funkcionalen kot vgrajeni PHP, a v bistvu podoben. O piškotkih in bazi podatkov.

    Ko zahtevamo skript, pogledamo, ali je piškotek prišel z določenim imenom. Če piškotkov ni, ga nastavite in v bazo podatkov napišite novo vrstico z uporabniškimi podatki. Če obstajajo piškotki, beremo iz baze podatkov. Z še eno zahtevo izbrišemo stare zapise iz baze in zdaj imamo pripravljen mehanizem seje. Sploh ni težko. Vendar pa obstaja nekaj odtenkov, zaradi katerih je boljša uporaba vgrajenega mehanizma seje.

    Najprej morate nekako prepoznati brskalnik. Če želite to narediti, mu morate dati edinstven identifikator in ga prositi, da ga prenese z vsako zahtevo. Sram me je priznati, a ko sem prvič izvedel za seje, sem pomislil, da je to nekakšen poseben mehanizem, nek nov način komunikacije med brskalnikom in strežnikom - "sessions". Da se identifikator seje posreduje na nek poseben način. Toda razočaranje je bilo kruto ...

    Seje uporabljajo standardne, dobro znane metode prenosa podatkov. Pravzaprav drugih preprosto ni.
    Identifikator je običajna spremenljivka. Privzeto je njegovo ime PHPSESSID.
    PHP-jeva naloga je, da ga pošlje brskalniku, da ga vrne z naslednjo zahtevo. Iz že omenjenega razdelka s pogostimi vprašanji je jasno, da je spremenljivko mogoče posredovati le na dva načina: v piškotkih ali v zahtevi POST/GET.
    PHP uporablja obe možnosti.

    Za to sta odgovorni dve nastavitvi v php.ini:

    session.use_cookies - če je enak 1, potem PHP posreduje identifikator piškotkom, če je 0 - potem ne.
    session.use_trans_sid, če je enak 1, potem ga PHP posreduje in doda URL-ju in obrazcem, če je 0 - potem ne.

    Te in druge parametre seje lahko spremenite na enak način kot druge nastavitve PHP - v datoteki php.ini, pa tudi z ukazom ini_set () ali v konfiguracijskih datotekah spletnega strežnika

    Če je omogočen samo prvi, potem na začetku seje (ob vsakem klicu session_start ()) piškotki so nastavljeni odjemalcu. Brskalnik pravilno vrne ta piškotek z vsako naslednjo zahtevo, PHP pa ima identifikator seje. Težave se začnejo, če brskalnik ne vrne piškotkov. V tem primeru, ne da bi prejel piškotke z identifikatorjem, bo PHP ves čas začel novo sejo in mehanizem ne bo deloval.

    Če je omogočena samo druga, potem piškotki niso nastavljeni. In kar se zgodi, je, zaradi česar je pravzaprav vredno uporabiti vgrajeni mehanizem seje. Ko skript opravi svoje delo in je stran v celoti oblikovana, PHP vse to pregleda in vsaki povezavi in ​​vsakemu obrazcu doda ID seje. Izgleda nekako takole:

    Indeks

    se spremeni v

    Indeks

    in obrazcem je dodano skrito polje

    Teoretično lahko v naših domačih sejah z vami o piškotkih in bazi sami ročno dodelite prenos id-ja vsem povezavam - in potem bodo naše lastne seje delovale ne glede na piškotke. Ampak, vidite – bolj prijetno je, ko to dela nekdo drug? ;-)

    Obe možnosti sta privzeto omogočeni v zadnjih različicah PHP. Kako PHP to obravnava? Kuharica je vedno razstavljena. Povezave se samodejno dokončajo samo, če PHP ni našel piškotkov z ID-jem seje. Ko uporabnik med to sejo prvič obišče spletno mesto, se mu namestijo piškotki in dodajo se povezave. Ob naslednji zahtevi, če so piškotki podprti, PHP vidi piškotke in preneha dopolnjevati povezave. Če piškotki ne delujejo, potem PHP še naprej pravilno dodaja id povezavam in seja ni izgubljena.
    Uporabniki s piškotki bodo dolgo povezavo z ID-jem videli samo enkrat.

    Ko je prenos identifikatorja končan. Zdaj je treba nanjo povezati datoteko s podatki na strani strežnika. PHP bo to naredil namesto nas. Dovolj je samo napisati:

    začetek_seje ();
    $ _SESSION ["test"] = "Pozdravljeni svet!" ;

    PHP bo testno spremenljivko zapisal v datoteko, povezano s to sejo.

    Tukaj je zelo pomembna točka.

    Niz $ _SESSION- poseben.
    V njem so pravzaprav spremenljivke, ki jih želimo dati na voljo v različnih skriptah.
    Če želite spremenljivko postaviti v sejo, jo preprosto dodelite elementu matrike $_SESSION.
    Za pridobitev njegove vrednosti je dovolj, da se sklicujete na isti element. Primer bo spodaj.

    Zbiranje smeti – PHP sodeluje tudi pri odstranjevanju zastarelih datotek. Pa tudi kodiranje podatkov in kup drugih potrebnih stvari. Zaradi te skrbi je delo s sejami zelo enostavno.
    Tukaj smo pravzaprav prišli do primera dela sej.
    Primer je zelo majhen:

    začetek_seje ();

    odmev "Posodobili ste to stran"... $ _SESSION ["števec"] ++. "enkrat.";
    odmev "
    nadgradnja ";
    ?>

    Preverimo, ali imamo spremenljivko števca v seji, če ne, jo ustvarimo z vrednostjo 0, nato pa izpišemo njeno vrednost in jo povečamo za eno. Povečana vrednost bo zapisana v sejo in naslednjič, ko bo skript poklican, bo imela spremenljivka vrednost 1 itd. Vse je zelo preprosto.

    Če želite imeti dostop do spremenljivk seje na kateri koli strani spletnega mesta, morate na samem začetku VSAKE datoteke napisati SAMO ENO (!) vrstico, v kateri potrebujemo seje:

    začetek_seje ();

    začetek_seje ();
    če ($ _SESSION ["avtorizirano"]<> 1 ) {
    glava ("Lokacija: /auth.php");
    izhod;
    }

    Odstranjevanje spremenljivk iz seje. Če imate register_globals = off, potem samo napišite

    nenastavljen ($ _ SESSION ["var"]);

    Če ne, potem v bližini z njim morate napisati:

    session_unregister ("var");

    Zelo pomembno je razumeti, za kaj je treba seje uporabiti in za kaj ne.

    Najprej ne pozabite, da se seje lahko uporabljajo samo, ko jih uporabnik potrebuje, ne pa da bi ga ovirali. Konec koncev se lahko identifikatorja kadar koli znebi!
    Na primer, ko preveri, ali oseba izpolni obrazec in ne skripta, se uporabnik sam zanima, da seja deluje - sicer ne bo mogel oddati obrazca! Toda za omejitev števila zahtev za skript seja ni več primerna - zlonamerni skript preprosto ne bo vrnil identifikatorja.

    Drugič. Pomembno je jasno razumeti dejstvo, da je seja seja dela s spletnim mestom, kot jo razume oseba. Prišel, delal, zaprl brskalnik - seja se je končala. Kot filmska seja. Če želite videti še enega - kupite novo vstopnico. Začnite novo sejo. Za to obstaja tudi tehnična razlaga. Zagotovljeno je, da mehanizem seje deluje le, dokler se brskalnik ne zapre. Navsezadnje piškotki morda ne bodo delovali za odjemalca in v tem primeru bodo seveda vse povezave, dopolnjene z identifikatorjem, izginile, ko bo ta zaprt.

    Vendar pa je sejo mogoče izgubiti, ne da bi zaprli brskalnik. Zaradi omejitev, obravnavanih v tem članku, motor seje ne more zaznati, kdaj je uporabnik zaprl brskalnik. Za to se uporablja časovna omejitev - vnaprej določen čas, po katerem menimo, da je uporabnik zapustil spletno mesto. Privzeto je ta parameter 24 minut.

    Če želite podatke o uporabniku hraniti dlje časa, uporabite piškotke in po potrebi bazo podatkov na strežniku. Zlasti tako delujejo vsi priljubljeni sistemi avtorizacije:

    Ob identifikaciji uporabnika se seja začne in vanjo se prenese znak avtorizacije.
    - Če je treba uporabnika "zapomniti", se mu nastavi piškotek, ki ga identificira.
    - Ko uporabnik naslednjič vstopi na spletno mesto, mora za prijavo vnesti geslo ali pa ga sistem sam prepozna po prej nastavljenih piškotkih in seja se začne. Nova seja, namesto da bi nadaljevala staro.

    Tretjič, ni vredno začeti sej neselektivno, za vse, ki vstopajo na spletno mesto. To bo ustvarilo popolnoma nepotrebno obremenitev. Ne uporabljajte sej za malenkosti - na primer v pultih. Kar spilog kliče seje, se seveda šteje na podlagi statistike klicev in ne z uporabo mehanizma sej, podobnega PHP.

    Poleg tega vzemimo iskalnik, ki indeksira vaše spletno mesto. Če iskalni robot ne podpira piškotkov, potem bo PHP povezavam privzeto dostavil PHPSESSID, kar morda ni preveč prijetno za iskalnik, ki po govoricah tako ali tako ne daje prednost dinamičnim povezavam, tukaj pa na splošno z vsakim klicem - nov naslov!

    Če se seje uporabljajo za omejevanje dostopa do zaprtega dela spletnega mesta, potem je vse le iskalnik in ga ne bi smeli indeksirati. Če morate isto stran prikazati tako pooblaščenim kot nepooblaščenim uporabnikom, bo tukaj pomagal tak trik - začeti sejo samo tistim, ki so vnesli geslo, ali tistim, ki so sejo že začeli.

    Če želite to narediti, na začetku vsake strani, namesto samo session_start () pišemo:

    if (isset ($ _ REQUEST [ime_seje ()])) session_start ();

    tako začnemo sejo samo tistim, ki so poslali identifikator.
    V skladu s tem ga je treba uporabniku poslati prvič - v trenutku avtorizacije.

    Če sta ime in lopa pravilna - napiši session_start () !

    Najpogostejše napake, ki jih PHP daje pri poskusu dela s sejami, so:
    dva izmed njih,

    Opozorilo: piškotka seje ni mogoče poslati - glave so že poslane
    Opozorilo: Omejevalnika predpomnilnika seje ni mogoče poslati - glave so že poslane

    zaradi istega razloga, je rešitev opisana v tem dejstvu

    Opozorilo: odprtje (/ tmp \ sess_SID, O_RDWR) ni uspelo: ni takšne datoteke ali imenika (2) v full_script_path na številki vrstice

    prej je bila videti kot

    Opozorilo: Podatkov o seji (datoteke) ni bilo mogoče napisati. Preverite, ali je trenutna nastavitev session.save_path pravilna (/ tmp) ,

    če je preveden iz angleščine, podrobno razloži težavo: pot, podana v php.ini, do imenika, kamor so zapisane datoteke seje, ni na voljo. To napako je najlažje odpraviti. Samo napišite imenik, ki obstaja in je zapisljiv, npr.

    session.save_path = c: \ windows \ temp

    In po tem ne pozabite znova zagnati Apache.

    Kot se je izkazalo, človeška inteligenca nima meja, zato moram pojasniti:
    tretje sporočilo o napaki (imenika ni mogoče najti) bo NEDOSTOPNO vodilo do prvih dveh, ker se sporočilo o napaki izpiše v brskalnik in za njim ne morete uporabiti glav. Zato ne hitite iskati prezgodnjega zaključka, ampak najprej napišite pravilno pot!

    Naslednja najpogostejša težava pri obravnavi sej je težka zapuščina register_globals. NE dajajte skriptnih spremenljivk enakih imen kot indeksi matrike $_SESSION!

    Z register_globals = on bodo vrednosti prepisali druga drugo in boste zmedeni.

    Če ne deluje, vendar se tudi ne prikažejo nobena sporočila, dodajte dve vrstici na samem začetku skripta, ki sta odgovorni za prikaz VSEH napak na zaslonu - povsem možno je, da so napake, vendar jih preprosto ne vidite njim.

    ini_set ("display_errors", 1);
    poročanje o napaki (E_ALL);

    ali si oglejte napake v dnevniku napak. Na splošno tema o prikazovanju sporočil o napakah presega obseg tega članka, zato se prepričajte, da jih vsaj vidite. V tem razdelku si lahko preberete nekaj več podrobnosti o odpravljanju težav.

    Če ste prepričani, da ni napak, a dani primer vseeno ne deluje, potem je možno, da PHP ne omogoča prenosa id-ja preko url-a, in piškotki iz nekega razloga ne delujejo.
    Poglejte, kaj imate s piškotki.

    Na splošno, če vaše seje "ne delujejo", najprej poskusite ročno prenesti identifikator seje, torej ustvarite povezavo in ji dodelite identifikator:

    začetek_seje ();
    če (! isset ($ _ SESSION ["števec"])) $ _SESSION ["števec"] = 0;
    odmev "Posodobili ste to stran"... $ _SESSION ["števec"] ++. "enkrat.

    nadgradnja ";
    ?>

    Ko to počnete, se prepričajte, da direktiva session.use_only_cookies ni omogočena, kar preprečuje, da bi PHP sprejel ID seje, če je bil posredovan prek URL-ja.

    Če ta primer ne deluje, je težava bodisi v banalnem tipkarske napake(polovica "problemov" s sejami izvira iz napačno črkovanega imena spremenljivke) ali v prestari različici PHP: podpora za seje se je pojavila v različici 4.0 in matrika $ _SESSION- v 4.1 (Prej uporabljeno $ HTTP_SESSION_VARS).

    Če deluje, je težava v piškotkih. Sledenje - kakšne piškotke strežnik postavi v brskalnik, ali jih brskalnik vrne. Iskanje je zelo uporabno pri ogledu izmenjave glave HTTP med brskalnikom in strežnikom.

    Razlaga delovanja piškotkov je zunaj obsega tega in toliko besedila, vendar se vsaj prepričajte, da strežnik pošlje piškotke z identifikatorjem, brskalnik pa se vrne. In medtem ko identifikatorji sovpadajo med seboj =)
    Nastavitev piškotkov bi morala izgledati tako

    Set-Cookie: PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6;

    Set-Cookie: PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6; pot = /

    (če zahtevate skript, ki ni iz korenskega imenika)
    Odgovor strežnika bi moral izgledati tako

    Piškotek: PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6

    Piškotek: PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6; b = b

    če brskalnik vrne piškotke, ki niso ID seje.

    Če primer od tukaj deluje, vaša lastna koda pa ne, potem težava očitno ni v sejah, ampak v algoritmu. Poiščite, kje ste izgubili spremenljivko, prenesite primer od tu korak za korakom, razhroščite svoj skript.

    Druga težava se lahko pojavi, če uporabljate preusmeritev glave ali navigacijo JavaScript.
    Dejstvo je, da PHP samodejno doda identifikator seje samo povezavam obrazca
    , vendar tega ne stori za glave, javascript, meta oznake.

    Zato morate identifikator dodati ročno, na primer tako:

    header ("Lokacija: /script.php?". ime_seje (). "=". id_sesije ());

    Prav tako je zelo redka in popolnoma nerazumljiva, od kod prihaja težava, težava v tem, da ima nastavitev session.save_handler drugo vrednost kot datoteke. Če temu ni tako, popravite.

    • Mehanizem seje poleg piškotkov pošilja tudi glave, ki prepovedujejo predpomnjenje strani (isti omejevalnik predpomnilnika). Za html je to pravilno in potrebno. Ko pa poskušate poslati datoteko s skriptom, ki preverja avtorizacijo, Internet Explorer zavrne prenos. Prav zaradi tega naslova. Pokliči
      session_cache_limiter ("zasebno");
      morate rešiti težavo pred začetkom seje.
    • Nenavadno, vendar v nizu $ _SESSION ne morete uporabljati številčnih indeksov - $ _SESSION [1], $ _SESSION ["10"]- seje ne bodo delovale.
    • Nekje med 4.2 in 5.0 ni bilo mogoče nastaviti session.use_trans_sid z ini_set ()... Od 5.0 je že spet možno.
    • Pred različico 4.3.3 piškotki PHP je pošiljal piškotke le, če zahteva ni vsebovala identifikatorja na začetku seje. Zdaj se piškotki pošiljajo ob vsakem klicu session_start

      Če imate še kakšno vprašanje ali vam kaj ni jasno - dobrodošli pri nas

    Seje so preprost način za shranjevanje informacij za posamezne uporabnike z edinstvenim ID-jem seje. To lahko uporabite za obstojno stanje med zahtevami strani. ID-ji seje se običajno pošljejo brskalniku prek piškotka seje in se uporabljajo za pridobivanje razpoložljivih podatkov seje. Odsotnost ID-ja seje ali piškotka seje pove PHP-ju, da ustvari novo sejo in ustvari nov ID seje.

    Seje uporabljajo preprosto tehnologijo. Ko je seja ustvarjena, bo PHP bodisi dobil obstoječo sejo z uporabo posredovanega identifikatorja (običajno iz piškotka seje) ali, če ni bilo posredovano nič, bo ustvarjena nova seja. PHP bo naselil superglobal $_SESSION z informacijami o seji po začetku seje. Ko PHP zapusti, bo samodejno serializiral vsebino superglobala $ _SESSION in oddal v shranjevanje z uporabo upravljalnika seje za snemanje seje.

    PHP privzeto uporablja notranji upravljalnik datotek za shranjevanje sej, ki je nastavljen v spremenljivki session.save_handler INI. Ta upravljalnik shrani podatke na strežnik v imenik, podan v konfiguracijski direktivi session.save_path.

    Seje lahko zaženete ročno s funkcijo session_start ()... Če je direktiva session.auto_start nastavljena na 1, se bo seja samodejno začela na začetku zahteve.

    Seja se običajno konča, ko PHP konča z izvajanjem skripta, vendar jo lahko prekinete tudi ročno s funkcijo session_write_close ().

    Opozorilo

    Pozor

    Komentar:

    Seje z uporabo datotek (privzeto v PHP) blokirajo datoteko seje takoj po odprtju seje s funkcijo session_start () ali posredno z navedbo session.auto_start. Po blokiranju noben drug skript ne more dostopati do iste datoteke seje, dokler se ne zapre ali ko se skript konča ali ko se pokliče funkcija. session_write_close ().

    To je najverjetneje težava za spletna mesta, ki močno uporabljajo AJAX in dajejo več sočasnih zahtev. Najpreprostejši način za rešitev te težave je klic funkcije session_write_close () takoj ko so narejene vse zahtevane spremembe v seji, po možnosti bližje začetku skripta. Uporabite lahko tudi drug mehanizem seje, ki podpira sočasnost.

    Od vsega začetka so vsi s pokom sprejeli PHP, a takoj, ko so začeli ustvarjati dovolj velike projekte v tem jeziku, so se razvijalci soočili z novo težavo – v PHP-ju ni bilo koncepta globalnih spremenljivk! To pomeni, da je bil skript izveden, ustvarjena stran je poslana odjemalcu in vsi viri, ki jih uporablja ta skript, so bili uničeni. Za ponazoritev recimo, da sta na istem mestu dve strani, index.php in dothings.php. Viri za te strani so videti takole:

    index.php dothings.php

    Če izvedete ta dva skripta, bomo na prvi strani videli napis "Dodeljen sem bil index.php", druga stran pa bo prazna.

    Razvijalci spletnih mest so brez zadržkov začeli uporabljati piškotke za shranjevanje globalnih spremenljivk na strani odjemalca. Postopek je izgledal nekako takole: uporabnik pride na domačo stran spletnega mesta, izvede nekaj dejanj in vsi podatki v zvezi s tem uporabnikom, ki bodo morda potrebni na drugih straneh spletnega mesta, bodo shranjeni v njegovem brskalniku v obliki piškotka. Ta metoda ima precej resne pomanjkljivosti, zaradi katerih so mnogi razvijalci naenkrat obrnili hrbet PHP. Uporabnika moramo na primer pooblastiti, da mu omogoči dostop do omejenih (ali samo njegovih) delov spletnega mesta. Uporabniku boste morali poslati piškotek, ki bo služil kot njegov kasnejši identifikator na spletnem mestu. Ta pristop postane zelo okoren in neprijeten, takoj ko začne spletno mesto zbirati vse več informacij o vedenju uporabnikov, saj je treba vse informacije, poslane uporabniku, po možnosti kodirati, da jih ni mogoče ponarediti. V zadnjem času je bilo s ponarejanjem piškotka mogoče "zlagati" več kot en klepet, včasih pa celo priti na pošto nekoga drugega. Poleg tega na svetu še vedno obstajajo čudni ljudje, katerih brskalnik ne podpira piškotkov.

    Ne bom se spuščal v tehnološka vprašanja strukture mehanizma sej, ampak bom le opisal, kako pravilno delati s sejami v PHP.

    Kako delati s sejami?

    Če preizkusite primere iz članka (ali svoje skripte) na katerem koli komercialnem gostovanju, pri delu s sejami ne bi smelo biti težav. Če strežnik nastavite sami (naj bo to pravi strežnik ali emulator), se lahko pojavijo napake z naslednjo vsebino:

    "Opozorilo: odprtje (/ var / state / php / sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) ni uspelo: ni takšne datoteke ali imenika (2)".

    To samo pomeni, da je vaš PHP napačno konfiguriran. To težavo lahko rešite tako, da napišete pravilno pot (do obstoječega imenika), da shranite seje v datoteko php.ini in znova zaženete strežnik.

    Vsak skript, ki bo uporabljal spremenljivke (podatke) iz sej, mora vsebovati naslednjo vrstico:

    Začetek_seje ();

    Ta ukaz pove strežniku, da dana stran potrebuje vse spremenljivke, ki so povezane z danim uporabnikom (brskalnikom). Strežnik vzame te spremenljivke iz datoteke in jih da na voljo. Zelo pomembno je, da odprete sejo, preden se kateri koli podatki pošljejo uporabniku; v praksi to pomeni, da je priporočljivo poklicati funkcijo session_start () na samem začetku strani, na primer:

    Začetek_seje (); ?> ... Če želite nastaviti imenik, v katerem bodo shranjene datoteke seje, uporabite funkcijo session_save_path (): session_save_path ($ _ SERVER ["DOCUMENT_ROOT"]. "/ Session"); začetek_seje ();

    Ko se seja začne, lahko nastavite globalne spremenljivke. Ko dodelite vrednost kateremu koli polju v matriki $ _SESSION, se spremenljivka z istim imenom samodejno registrira kot spremenljivka seje. Ta niz je na voljo na vseh straneh, ki uporabljajo sejo. Na primer, analizirajmo program:

    index.php Vse v redu. Seja je bila naložena! Pojdimo skozi, poglejmo, kaj je tam: dothings.php

    Ko se te datoteke izvajajo zaporedno, bo prvi skript "index.php" ustvaril naslednji rezultat:

    Vse v redu. Seja je bila naložena! Pojdimo skozi, poglejmo, kaj je tam:

    In drugi "dothings.php" je ta:

    Vprašali so me na index.php

    Spremenljivka $ a je zdaj na voljo na vseh straneh tega spletnega mesta, ki so začele seje.

    Druge uporabne funkcije in tehnike za delo s sejami:

    • nenastavljen ($ _ SESSION ["a"])- seja "pozabi" vrednost spremenljivke, ki jo je nastavila seja;
    • session_destroy ()- seja je uničena (če je uporabnik na primer zapustil sistem s pritiskom na gumb "izhod");
    • session_set_cookie_params (int življenjska doba [, pot niza [, domena niza]])- s to funkcijo lahko nastavite, kako dolgo bo seja "živela" z nastavitvijo unix_timestamp, ki določa čas, ko seja "umre". Privzeto seja "živi", dokler odjemalec ne zapre okna brskalnika.
    • session_write_close ()- snemanje spremenljivk seje in zapiranje. To je potrebno za odpiranje spletnega mesta v novem oknu, če stran izvaja dolgotrajno obdelavo in je blokirala datoteko seje za vaš brskalnik.

    Primeri

    Zdaj pa se obrnimo na praktično uporabo mehanizma seje. Tukaj si bomo ogledali nekaj dokaj preprostih, a uporabnih primerov.

    Pooblastilo uporabnika

    Na konferencah o spletnem programiranju se nenehno postavljajo vprašanja o avtorizaciji uporabnikov s pomočjo PHP sej. Mehanizem za avtorizacijo uporabnikov v sistemu z uporabo sej je z varnostnega vidika precej dober (glej razdelek).

    Naš primer bo sestavljen iz treh datotek: index.php, authorize.php in secretplace.php. Datoteka index.php vsebuje obrazec, kamor bo uporabnik vnesel svoje uporabniško ime in geslo. Ta obrazec bo posredoval podatke v datoteko authorize.php, ki bo v primeru uspešne avtorizacije uporabniku omogočila dostop do datoteke secretplace.php in sicer prikazala sporočilo o napaki.

    Primeri: index.php Vnesite svoje geslo

    Vpiši se:
    geslo:
    avtorize.php stran ... glava ("Lokacija: secretplace.php"); izhod; )) // če je bilo kaj narobe, bo uporabnik prejel // sporočilo o napaki. ?> Vnesli ste napačno geslo! secretplace.php Zdravo,, ste na skrivni strani !!! :)

    Varnost

    Tako lahko identifikator prenesemo z ene strani (PHP skript) na drugo (do naslednjega klica z naše strani), kar pomeni, da lahko ločimo vse obiskovalce strani. Ker je identifikator seje zelo veliko število (128 bitov), ​​praktično ni možnosti, da bo šlo za brutalno silo. Zato ima napadalec naslednje možnosti:

    • na uporabnikovem računalniku je trojanec, ki krade številke sej;
    • Napadalec ujame promet med uporabnikovim računalnikom in strežnikom. Seveda obstaja varen (šifriran) protokol SSL, vendar ga ne uporabljajo vsi;
    • sosed je prišel do računalnika našega uporabnika in ukradel številko seje.

    Takšne situacije, ki temeljijo na dejstvu, da nekdo nekomu nekaj ukrade, na splošno niso v pristojnosti programerja. Za to bi morali poskrbeti skrbniki in uporabniki sami.

    Vendar pa je PHP pogosto lahko zaveden. Oglejmo si možne točke vdora v programu za avtorizacijo uporabnikov:

    • Datoteka authorize.php - poskus uganiti geslo z uporabo skripta tretje osebe;
    • Datoteka secretplace.php je poskus prevare programa z vnosom vrednosti spremenljivke $logged_user v naslovno vrstico brskalnika, na primer:
      "http://www.yoursite.ru/secretplace.php? logged_user = heker"

    Tako sta v našem programu dobro vidni dve "luknji", ena je majhna in ni posebej opazna, druga pa preprosto ogromna, skozi katero večina hekerjev pleza tja, kjer jim ni treba.

    Kako "zakrpati" luknjo številka 1?

    Ne bomo napisali na tone kode za blokiranje naslova IP ipd., ampak samo preverimo, od kod prihaja zahteva, oziroma s katere strani je prišla zahteva, če je katera stran z našega spletnega mesta, potem je vse v redu, ampak v vseh drugih primerih ga ne bomo spustili. Popravimo datoteko authorize.php:

    authorize.php V2 stran ... glava ("Lokacija: secretplace.php"); izhod; )))?> Vnesli ste napačno geslo!
    Kako se znebiti "luknje" številka 2?

    Recimo, da imate spletno stran, kjer se lahko vsak smrtnik registrira za objavo na forumu. Seveda imajo na forumu nekateri uporabniki (administratorji, moderatorji) več možnosti kot drugi, na primer lahko izbrišejo sporočila drugih uporabnikov. Raven dostopa uporabnika shranite v sejo, v spremenljivko $ user_status, kjer $ user_status = 10 ustreza polnemu dostopu do sistema. Napadalec, ki pride na spletno mesto, se mora samo na običajen način registrirati in nato dodati v naslovno vrstico brskalnika ? status_uporabnika = 10... Torej imate novega administratorja na vašem forumu!

    Načeloma lahko katero koli spremenljivko skripta nastavite preko naslovne vrstice, preprosto tako, da skriptu za polnim naslovom dodate vprašaj in ime spremenljivke z njeno vrednostjo. Popravimo našo kodo, da se temu izognemo:

    secretplace.php V2 spremenljivka ni nastavljena ($ _ SESSION ["logged_user"]); // odpremo sejo session_start (); / * ne morete samo iti na to stran ... če uporabniško ime ni registrirano, ga preusmerimo na stran index.php, da vnesete prijavo in geslo ... tukaj lahko dejansko naredite veliko, za na primer, zapomnite si uporabnikov IP in ga po tretjem poskusu dostopa do datotek blokirajte. * / if (! isset ($ _ SESSION ["logged_user"])) (glava ("Location: index.php"); izhod;)?> Zdravo,, ste na skrivni strani! Rezultati

    Mehanizem seje je precej kul lastnost jezika PHP. Seje so preproste, zelo prilagodljive za uporabo. Mimogrede, obstaja ena, na nekaj mestih dokumentirana možnost sej PHP (na voljo od različice 4.0.3) - v sejah lahko shranite ne le spremenljivke, ampak tudi predmete.

    Primeri

    ?>
    // Samodejno vstavljanje SID-jev v povezave. ini_set ("session.use_trans_sid", true); začetek_seje (); ?> Klikni tukaj!
    Klikni tukaj !!

    // Primer dela s sejami. začetek_seje (); // Če je bila stran pravkar obiskana, ponastavite števec. če (! isset ($ _ SESSION ["count"])) $ _SESSION ["count"] = 0; // Povečaj števec v seji. $ _SESSION ["count"] = $ _SESSION ["count"] + 1; ?>

    Števec

    čas (s).
    Zaprite brskalnik, da ponastavite števec.
    "target =" _blank "> Odprite okno podrejenega brskalnika.
    // Preprost primer uporabe sej brez piškotkov. session_name ("test"); začetek_seje (); $ _SESSION ["count"] = @ $ _ SESSION ["count"] + 1; ?>

    Števec

    V trenutni seji dela z brskalnikom ste odprli to strančas (s).
    Zaprite brskalnik, da ponastavite ta števec.
    ?"> Kliknite tukaj za osvežitev strani!