Počítače Windows internet

Relácie. Podrobný popis činnosti a vysvetlenie mechanizmu. Zabezpečenie ID relácie v PHP Organizácia inurl kniha návštev php phpsessid

Relácie v PHP alebo ako sa ukladajú údaje o používateľovi alebo zákazníkovi, ktorý vstúpil na stránku, pri prechádzaní medzi stránkami webu bez väčších ťažkostí. Lekcia je veľmi dôležitá. Relevantné pre vytvorenie 95 % stránok.

Čo je relácia v php

Relácie sa používajú na ukladanie informácií o dočasných údajoch (napríklad o tom, že používateľ vstúpil na stránku) pri navigácii medzi stránkami tej istej lokality. Pri používaní relácií sa údaje ukladajú do dočasných súborov na serveri.
Najčastejšie sa relácie (a však aj súbory cookie) používajú pri vytváraní internetových obchodov, fór, diskusných fór, sociálne siete, blogy a iné zdroje. Pohodlie relačného systému spočíva v ukladaní dočasných informácií o prihlásenom používateľovi/zákazníkovi, o ktorých sú údaje po určitú dobu v rýchlom prístupe. Relácia má prirodzený dátum vypršania platnosti – do zatvorenia prehliadača. Ak zatvoríte iba stránku, po otvorení stránky budú údaje o používateľovi / kupujúcom stále dostupné.

Logika relácie

Relácia (alebo relácia) je druh dočasného úložiska údajov. Hneď vás varujem, že sa oplatí ušetriť malé množstvo dát. Napríklad prihlasovacie meno a heslo prihlasujúceho sa užívateľa alebo jeho sériové číslo v databáze.

Príklad práce
1. Používateľ zadá používateľské meno a heslo a vstúpi na stránku
2. Údaje s prihlasovacím menom a heslom sa ukladajú v relácii jednej zo stránok lokality:

Súbor index.php

Session_start (); // každý súbor, v ktorom chcete použiť dáta relácie, musí na začiatku kódu obsahovať príkaz "start session".

$ login = "admin";
$ heslo = "pass";
$ _SESSION ["login"] = $ prihlásenie; // uložíme premennú obsahujúcu login
$ _SESSION ["heslo"] = $ heslo; // uložíme premennú obsahujúcu heslo

3. Keď prejdete na inú stránku lokality, budú k dispozícii aj tieto údaje:

Súbor example.php(alebo iná stránka)

Echo "Vaše prihlásenie". $ _ SESSION ["prihlásenie"]; // zobrazí "Vaše prihlásenie je admin", aj keď sme na tejto stránke nezaznamenali údaje!
Vidíte, je to jednoduché!

4. Ak chcete vymazať údaje relácie, stačí:

Súbor example.php

Session_start (); // "začať reláciu" znova

Nenastavené ($ _ SESSION ["prihlásenie"]); // takto bola premenná odregistrovaná alebo "zničená"
echo "Vaše prihlásenie". $ _ SESSION ["prihlásenie"]; // zobrazí "Vaše prihlásenie". Keďže sme to zničili v poslednom riadku, nie sú tam ani žiadne údaje.

Session_destroy (); // zničiť reláciu. Všetky údaje vrátane $ _SESSION ["heslo"] sú preč. Na požiadanie sa zobrazí chyba
Vo všeobecnosti je takýto prevod podobný metóda POST, ale len vy už nemusíte písať veľa zbytočného kódu a všetky dáta prenášané zo stránky na stránku sú uložené v dočasných súboroch na serveri. Opäť platí, že relácie by mali obsahovať malé množstvo údajov, takže sú vhodné na ukladanie používateľského mena / hesla, nákupného košíka a iných malých objemov.

Odovzdanie hodnoty alebo poľa pomocou relácie PHP

V relácii môžete zapísať nielen reťazec, ale aj pole údajov. Len to nepreháňajte s veľkosťou poľa, pretože to všetko ovplyvní výkon a obsadené miesto na serveri.

Opäť používame určité úvodná stránka index.php

Session_start ();

$ r = pole ("jeden", "dva", "tri");

$ _SESSION ["arr"] = $ r;

Na stránku, kde je zobrazené všetko
Údaje sme uložili do relácie a kliknite na odkaz na ďalšiu stránku, kde zobrazíme všetky údaje.

Príjemca súboru, strana test.php kde otvoríme pole

Session_start ();
print_r ($ _ SESSION ["arr"]);
// bude výstup
/*
Pole
=> jeden
=> dva
=> tri
*/
?>
Možno si budete chcieť oprášiť nejaký tutoriál. Vo všeobecnosti by malo byť všetko jasné.

Ďalšie funkcie pre prácu s reláciami

session_unregister (reťazec)- relácia zabudne hodnotu zadanej globálnej premennej;
session_destroy ()- relácia je zničená (napríklad ak používateľ opustil systém stlačením tlačidla odhlásenia);
session_set_cookie_params (int lifetime [, cesta reťazca [, doména reťazca]])- pomocou tejto funkcie môžete nastaviť dobu trvania relácie nastavením unix_timestamp, ktorý určuje čas smrti relácie.

Zoznam funkcií pre prácu s reláciami (session) v php
session_cache_expire - Vráti vypršanie platnosti aktuálnej vyrovnávacej pamäte
session_cache_limiter - Získajte a / alebo nastavte aktuálny limit vyrovnávacej pamäte
session_commit – alias pre session_write_close ()
session_decode – dekóduje dáta relácie z reťazca
session_destroy - Zničí všetky údaje zaregistrované pre reláciu
session_encode - zašifruje údaje aktuálnej relácie ako reťazec
session_get_cookie_params – Získajte parametre súboru cookie relácie
session_id - získa a/alebo nastaví aktuálne ID relácie
session_is_registered – určuje, či je v relácii registrovaná premenná
session_module_name - Získajte a / alebo nainštalujte modul pre aktuálnu reláciu
session_name - získa a / alebo nastaví názov aktuálnej relácie
session_regenerate_id – Zmení aktuálne ID relácie na novo vygenerované
session_register - registruje jednu alebo viac premenných pre aktuálnu reláciu
session_save_path - získa a / alebo nastaví cestu na uloženie aktuálnej relácie
session_set_cookie_params – nastavuje parametre cookies relácie
session_set_save_handler – nastavuje funkcie ukladania relácie na úrovni používateľa
session_start - inicializuje dáta relácie
session_unregister – Zruší registráciu premennej z aktuálnej relácie
session_unset - Uvoľní všetky premenné relácie
session_write_close - Zapisuje dáta relácie a koniec relácie

Príklady relácií

Počítadlo zobrazení stránky počas relácie. Názorná ukážka práce. Po zatvorení prehliadača sa však odpočítavanie začne odznova.

Počítadlo návštev jednej stránky v rámci jednej relácie

// Jednoduchý príklad používania relácií bez súborov cookie.
názov_relácie ("test");
session_start ();
$ _SESSION ["počet"] = @ $ _ SESSION ["počet"] + 1;
?>

Počítadlo


V aktuálnej relácii práce s prehliadačom ste otvorili túto stránku
čas (s).
Ak chcete resetovať toto počítadlo, zatvorte prehliadač.
Kliknutím sem obnovíte stránku!
Pri každom prechode sa počítadlo zvýši o 1)

Ďakujem za pozornosť! Veľa šťastia vo vašom snažení!

Relácie sú v skutočnosti veľmi jednoduché. Musíte len pochopiť, na čo slúžia a ako sú usporiadané. Najprv si odpovedzme na prvú otázku.
Možno viete, že webový server nepodporuje trvalé pripojenie s klientom a každá požiadavka je spracovaná ako nová, bez komunikácie s predchádzajúcimi.

To znamená, že nemôžete sledovať požiadavky od toho istého návštevníka, ani preňho ukladať premenné medzi zobrazeniami. jednotlivé stránky... Na vyriešenie týchto dvoch problémov boli vynájdené relácie.
V skutočnosti sú relácie v skratke mechanizmus, ktorý vám umožňuje jednoznačne identifikovať prehliadač a vytvoriť súbor pre tento prehliadač na serveri, v ktorom sú uložené premenné relácie.

Nebudem podrobne popisovať potrebu takéhoto mechanizmu. Ide o prípady ako nákupný košík v internetovom obchode, autorizáciu, ale aj nie úplne triviálne problémy, akými sú napríklad ochrana interaktívnych častí stránky pred spamom.

V zásade je celkom jednoduché vytvoriť si vlastnú analógiu relácií, ktorá nie je taká funkčná ako vstavané PHP, ale v podstate podobná. O cookies a databáze.

Pri vyžiadaní skriptu sa pozrieme, či súbor cookie prišiel s konkrétnym názvom. Ak tam nie sú žiadne cookies, tak to nastavte a zapíšte do databázy nový riadok s používateľskými údajmi. Ak sú tam cookies, tak čítame z databázy. Ešte jednou požiadavkou vymažeme staré záznamy z databázy a teraz máme pripravený mechanizmus relácie. Nie je to vôbec ťažké. Existujú však určité nuansy, kvôli ktorým je vhodnejšie použiť vstavaný mechanizmus relácie.

Najprv musíte nejakým spôsobom identifikovať prehliadač. Aby ste to urobili, musíte mu dať jedinečný identifikátor a požiadajte o jeho prenos pri každej žiadosti. Hanbím sa priznať, ale keď som sa prvýkrát dozvedel o reláciách, myslel som si, že ide o nejaký špeciálny mechanizmus, nejaký nový spôsob komunikácie medzi prehliadačom a serverom – „relácie“. Že sa identifikátor relácie odovzdáva nejakým špeciálnym spôsobom. Ale sklamanie bolo kruté...

Relácie využívajú štandardné, dobre známe metódy prenosu údajov. V skutočnosti jednoducho neexistujú žiadne iné.
Identifikátor je regulárna premenná. V predvolenom nastavení je jeho názov PHPSESSID.
Úlohou PHP je poslať ho prehliadaču, aby ho vrátil pri ďalšej požiadavke. Z už spomínanej sekcie FAQ je zrejmé, že premennú je možné odovzdať iba dvoma spôsobmi: v súboroch cookie alebo v požiadavke POST / GET.
PHP používa obe možnosti.

Sú za to zodpovedné dve nastavenia v php.ini:

session.use_cookies - ak sa rovná 1, potom PHP odovzdá identifikátor súborom cookie, ak je 0 - potom nie.
session.use_trans_sid, ak sa rovná 1, PHP ho odovzdá, pripojí k URL a formulárom, ak 0 - tak nie.

Tieto a ďalšie parametre relácie môžete zmeniť rovnakým spôsobom ako ostatné nastavenia PHP – v súbore php.ini, ako aj pomocou príkazu ini_set () alebo v konfiguračných súboroch webového servera

Ak je povolená iba prvá, potom na začiatku relácie (pri každom hovore session_start ()) sú klientovi nastavené cookies. Prehliadač správne vracia tento súbor cookie pri každej ďalšej požiadavke a PHP má identifikátor relácie. Problémy začínajú, ak cookies prehliadača nevracia. V tomto prípade PHP bez prijatia cookies s identifikátorom začne stále novú reláciu a mechanizmus nebude fungovať.

Ak je povolená iba druhá možnosť, súbory cookie sa nenastavia. A čo sa stane, je to, kvôli čomu sa v podstate v skutočnosti oplatí použiť vstavaný mechanizmus relácie. Potom, čo skript vykoná svoju prácu a stránka je úplne vytvorená, PHP si to všetko pozrie a pripojí ID relácie ku každému odkazu a ku každému formuláru. Vyzerá to asi takto:

Index

mení sa v

Index

a do formulárov sa pridá skryté pole

Teoreticky v našich domácich reláciách s vami o súboroch cookie a základni môžete manuálne priradiť prenos ID všetkým odkazom sami - a potom budú naše vlastné relácie fungovať bez ohľadu na súbory cookie. Ale vidíte – je príjemnejšie, keď túto prácu robí niekto iný? ;-)

Obe možnosti sú v najnovších verziách PHP štandardne povolené. Ako to zvláda PHP? Cook je vždy vystavený. A odkazy sa automaticky dopĺňajú iba vtedy, ak PHP nenašlo cookies s ID relácie. Keď používateľ navštívi stránku prvýkrát počas tejto relácie, uložia sa mu cookies a pridajú sa odkazy. Pri ďalšej požiadavke, ak sú cookies podporované, PHP vidí cookies a prestane dopĺňať odkazy. Ak cookies nefungujú, PHP pokračuje v správnom pridávaní id do odkazov a relácia sa nestratí.
Používatelia so súbormi cookie uvidia dlhý odkaz s ID iba raz.

Po dokončení prenosu identifikátora. Teraz zostáva naviazať súbor s údajmi na strane servera. PHP to urobí za nás. Stačí napísať:

session_start ();
$ _SESSION ["test"] = "Ahoj svet!" ;

A PHP zapíše testovaciu premennú do súboru spojeného s touto reláciou.

Je tu veľmi dôležitý bod.

Pole $ _SESSION- špeciálny.
V ňom sú v skutočnosti premenné, ktoré chceme sprístupniť v rôznych skriptoch.
Ak chcete umiestniť premennú do relácie, stačí ju priradiť k prvku poľa $ _SESSION.
Ak chcete získať jeho hodnotu, stačí sa odvolať na rovnaký prvok. Príklad bude uvedený nižšie.

Odvoz odpadu – odstraňovanie zastar PHP súbory robí to aj sám. Rovnako ako kódovanie dát a kopa ďalších potrebných vecí. Vďaka tejto starostlivosti je práca s reláciami veľmi jednoduchá.
Tu sme v skutočnosti a prichádzame k príkladu práce relácií.
Príklad je veľmi malý:

session_start ();

ozvena "Aktualizovali ste túto stránku"... $ _SESSION ["počítadlo"] ++. "raz.";
ozvena"
aktualizovať ";
?>

Skontrolujeme, či máme v relácii premennú počítadla, ak nie, potom ju vytvoríme s hodnotou 0 a potom vypíšeme jej hodnotu a zvýšime ju o jednu. Zvýšená hodnota sa zapíše do relácie a pri ďalšom volaní skriptu bude mať premenná hodnotu 1 atď. Všetko je veľmi jednoduché.

Aby ste mali prístup k premenným relácie na ktorejkoľvek stránke lokality, musíte napísať LEN JEDEN (!) riadok na úplný začiatok KAŽDÉHO súboru, v ktorom potrebujeme relácie:

session_start ();

session_start ();
ak ($ ​​_SESSION ["autorizované"]<> 1 ) {
hlavička ("Umiestnenie: /auth.php");
východ;
}

Odstránenie premenných z relácie. Ak máte register_globals = off, tak stačí napísať

deaktivované ($ _ SESSION ["var"]);

Ak nie, tak v blízkosti s ním treba napísať:

session_unregister ("var");

Je veľmi dôležité pochopiť, na čo by sa relácie mali používať a na čo nie.

Po prvé, nezabudnite, že relácie možno použiť iba vtedy, keď ich používateľ potrebuje, nie na to, aby mu prekážali. Identifikátora sa totiž môže kedykoľvek zbaviť!
Napríklad pri kontrole, že osoba vypĺňa formulár, a nie skript, samotný používateľ má záujem o to, aby relácia fungovala - inak nebude môcť formulár odoslať! Ale na obmedzenie počtu požiadaviek na skript už relácia nie je vhodná - škodlivý skript jednoducho nevráti identifikátor.

Po druhé. Je dôležité jasne pochopiť skutočnosť, že relácia je relácia práce so stránkou, ako ju chápe človek. Prišiel, pracoval, zatvoril prehliadač - relácia sa skončila. Ako filmová relácia. Ak chcete vidieť ďalší - kúpte si nový lístok. Začnite novú reláciu. Existuje na to aj technické vysvetlenie. Je zaručené, že mechanizmus relácie funguje len do zatvorenia prehliadača. Cookies totiž nemusia klientovi fungovať a v tomto prípade samozrejme po jeho zatvorení zmiznú všetky odkazy doplnené o identifikátor.

Relácia sa však môže stratiť bez zatvorenia prehliadača. Vzhľadom na obmedzenia uvedené v tomto článku nemôže modul relácie zistiť, kedy používateľ zatvoril prehliadač. Na tento účel sa používa časový limit - vopred stanovený čas, po ktorom sa domnievame, že používateľ opustil stránku. Štandardne je tento parameter 24 minút.

Ak chcete ukladať informácie o používateľovi na dlhšiu dobu, použite súbory cookie a v prípade potreby databázu na serveri. Najmä takto fungujú všetky populárne autorizačné systémy:

Po identifikácii užívateľa sa spustí relácia a v nej sa prenesie znak oprávnenia.
- Ak je potrebné si užívateľa "zapamätať", tak sa mu nastaví cookie, ktorá ho identifikuje.
- Keď používateľ nabudúce vstúpi na stránku, aby sa mohol prihlásiť, musí buď zadať heslo, alebo ho systém sám rozpozná podľa predtým nastavených súborov cookie a relácia sa spustí. Nová relácia namiesto pokračovania v starej.

Po tretie, neoplatí sa začínať relácie bez rozdielu pre každého, kto vstupuje na stránku. Vznikne tak úplne zbytočná záťaž. Nepoužívajte relácie na maličkosti - napríklad v pultoch. To, čo spilogue nazýva relácie, sa, samozrejme, počíta na základe štatistiky hovorov a nie pomocou mechanizmu relácie podobného PHP.

Navyše, zoberme si vyhľadávač, ktorý indexuje vašu stránku. Ak vyhľadávací robot nepodporuje cookies, PHP štandardne dodá odkazom PHPSESSID, čo sa nemusí páčiť vyhľadávaču, ktorý podľa fám aj tak neuprednostňuje dynamické odkazy, ale tu platí, , s každým hovorom - nová adresa!

Ak sa relácie používajú na obmedzenie prístupu k uzavretej časti webu, potom je všetko len vyhľadávač a nemalo by sa indexovať. Ak musíte rovnakú stránku zobraziť autorizovaným aj neoprávneným používateľom, potom vám pomôže tento trik - spustiť reláciu iba tým, ktorí zadali heslo, alebo tým, ktorí už reláciu začali.

Ak to chcete urobiť, na začiatku každej stránky namiesto len session_start () píšeme:

if (isset ($ _ REQUEST [názov_relácie ()])) session_start ();

teda reláciu spustíme len tým, ktorí identifikátor poslali.
V súlade s tým je potrebné ho odoslať používateľovi prvýkrát - v momente autorizácie.

Ak je názov a kôlňa správne - napíšte session_start () !

Najčastejšie chyby, ktoré PHP dáva pri pokuse o prácu s reláciami, sú:
Dvaja z nich,

Upozornenie: Nie je možné odoslať súbor cookie relácie - hlavičky už boli odoslané
Upozornenie: Nie je možné odoslať obmedzovač vyrovnávacej pamäte relácie – hlavičky už boli odoslané

spôsobené rovnakým dôvodom, riešenie je popísané v tejto skutočnosti

Upozornenie: otvorenie (/ tmp \ sess_SID, O_RDWR) zlyhalo: Žiadny takýto súbor alebo adresár (2) v ceste full_script_path na čísle riadku

predtým vyzerala

Upozornenie: Nepodarilo sa zapísať údaje relácie (súbory). Skontrolujte, či je aktuálne nastavenie session.save_path správne (/ tmp) ,

ak je preložený z angličtiny, podrobne vysvetľuje problém: cesta uvedená v php.ini k adresáru, kde sú zapísané súbory relácie, nie je dostupná. Túto chybu je najjednoduchšie opraviť. Stačí napísať adresár, ktorý existuje a je zapisovateľný, napr.

session.save_path = c: \ windows \ temp

A potom nezabudnite reštartovať Apache.

Ako sa ukazuje, ľudská inteligencia nemá hraníc, a preto musím vysvetliť:
tretie chybové hlásenie (adresár sa nedá nájsť) bude NEDOSTUPNÉ povedie k prvým dvom, pretože chybové hlásenie sa vypíše do prehliadača a po ňom nemôžete použiť hlavičky. Preto sa neponáhľajte hľadať predčasný záver, ale najprv napíšte správnu cestu!

Ďalším najčastejším problémom pri práci s reláciami je ťažké dedičstvo register_globals. NEDÁVAJTE premenným skriptu rovnaké názvy ako indexy poľa $ _SESSION!

S register_globals = on sa hodnoty navzájom prepíšu a budete zmätení.

Ak to nefunguje, ale nezobrazujú sa ani žiadne správy, pridajte na začiatok skriptu dva riadky, ktoré sú zodpovedné za zobrazenie VŠETKÝCH chýb na obrazovke - je celkom možné, že existujú chyby, ale jednoducho nevidíte ich.

ini_set ("display_errors", 1);
chybové hlásenie (E_ALL);

alebo si pozrite chyby v error_log. Vo všeobecnosti téma zobrazovania chybových hlásení presahuje rámec tohto článku, takže sa uistite, že ich aspoň vidíte. V tejto časti si môžete prečítať trochu viac podrobností o riešení problémov.

Ak ste si istí, že neexistujú žiadne chyby, ale uvedený príklad aj tak nefunguje, je možné, že PHP neumožňuje prenos id cez url, a súbory cookie z nejakého dôvodu nefungujú.
Pozrite sa, čo máte so súbormi cookie.

Vo všeobecnosti, ak vaše relácie „nefungujú“, skúste najskôr preniesť identifikátor relácie ručne, to znamená vytvoriť odkaz a priradiť mu identifikátor:

session_start ();
if (! isset ($ _ SESSION ["počítadlo"))) $ _SESSION ["počítadlo"] = 0;
ozvena "Aktualizovali ste túto stránku"... $ _SESSION ["počítadlo"] ++. "raz.

aktualizovať ";
?>

Keď to robíte, uistite sa, že direktíva session.use_only_cookies nie je povolená, čo bráni PHP akceptovať ID relácie, ak prešlo cez URL.

Ak tento príklad nefunguje, potom je problém buď v banálnom preklepy(polovica „problémov“ s reláciami pochádza z nesprávne napísaného názvu premennej), alebo v príliš starej verzii PHP: podpora relácií sa objavila vo verzii 4.0 a pole $ _SESSION- v 4.1 (predtým používané $ HTTP_SESSION_VARS).

Ak to funguje, problém je v súboroch cookie. Sledovať – aké súbory cookie server ukladá do prehliadača, či ich prehliadač vracia. Vyhľadávanie je veľmi užitočné pri pohľade na výmenu hlavičiek HTTP medzi prehliadačom a serverom.

Vysvetlenie, ako fungujú súbory cookie, je nad rámec tohto a toľkého textu, ale aspoň sa uistite, že server odosiela súbory cookie s identifikátorom a prehliadač sa vráti. A zatiaľ čo identifikátory sa navzájom zhodujú =)
Nastavenie cookies by malo vyzerať takto

Set-Cookie: PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6;

Set-Cookie: PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6; cesta = /

(ak požadujete skript nie z koreňového adresára)
Odpoveď servera by mala vyzerať takto

Súbor cookie: PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6

Súbor cookie: PHPSESSID = prlgdfbvlg5fbsbshch6hj0cq6; b = b

ak prehliadač vráti súbory cookie iné ako ID relácie.

Ak príklad odtiaľto funguje, ale váš vlastný kód nie, potom problém zjavne nie je v reláciách, ale v algoritme. Vyhľadajte, kde ste stratili premennú, preneste príklad odtiaľto krok za krokom, odlaďte svoj skript.

Ďalší problém môže nastať, ak používate presmerovanie hlavičky alebo JavaScript navigáciu.
Faktom je, že PHP automaticky pripája identifikátor relácie iba k odkazom formulára
, ale nerobí to pre hlavičky, javascript, meta tagy.

Preto musíte identifikátor pridať ručne, napríklad takto:

hlavička ("Umiestnenie: /script.php?". názov_relácie (). "=". ID_relácie ());

Problém je tiež veľmi zriedkavý a nie je úplne jasné, odkiaľ problém pochádza, že nastavenie session.save_handler má inú hodnotu ako súbory. Ak to tak nie je, opravte to.

  • Okrem súborov cookie mechanizmus relácie odosiela aj hlavičky, ktoré zakazujú ukladanie stránok do vyrovnávacej pamäte (rovnaký obmedzovač vyrovnávacej pamäte). Pre html je to správne a potrebné. Keď sa však pokúsite odoslať súbor so skriptom, ktorý kontroluje autorizáciu, Internet Explorer ho odmietne stiahnuť. Je to kvôli tomuto titulu. Zavolajte
    session_cache_limiter ("súkromné");
    musí vyriešiť problém pred začatím relácie.
  • Napodiv, ale v poli $ _SESSION nemôžete použiť číselné indexy - $ _SESSION [1], $ _SESSION ["10"]- relácie nebudú fungovať.
  • Niekde medzi 4.2 a 5.0 nebolo možné nastaviť session.use_trans_sid pomocou ini_set ()... Od 5.0 je to už opäť možné.
  • Pred verziou 4.3.3 súbory cookie PHP odosielalo súbory cookie iba v prípade, že požiadavka na začiatku relácie neobsahovala identifikátor. Teraz sa súbory cookie odosielajú pri každom hovore session_start

    Ak máte ďalšie otázky alebo vám niečo nie je jasné, vitajte u nás

Od samého začiatku všetci prijali PHP s nadšením, no akonáhle začali vytvárať dostatočne veľké projekty v tomto jazyku, vývojári čelili novému problému – v PHP neexistoval koncept globálnych premenných! To znamená, že bol spustený skript, odoslaná vygenerovaná stránka klientovi a všetky zdroje používané týmto skriptom boli zničené. Pre ilustráciu povedzme, že na tej istej lokalite sú dve stránky, index.php a dothings.php. Zdroje pre tieto stránky vyzerajú takto:

index.php veci.php

Ak spustíte tieto dva skripty, tak na prvej stránke uvidíme nápis „Bol som priradený k index.php“ a druhá stránka bude prázdna.

Vývojári webových stránok bez váhania začali používať cookies na ukladanie globálnych premenných na strane klienta. Proces vyzeral asi takto: používateľ príde na domovskú stránku lokality, vykoná nejakú akciu a všetky informácie súvisiace s týmto používateľom, ktoré môžu byť požadované na iných stránkach lokality, sa uložia do jeho prehliadača vo forme koláčika. Táto metóda má dosť vážne nevýhody, kvôli ktorým sa veľa vývojárov naraz otočilo chrbtom k PHP. Napríklad potrebujeme autorizovať používateľa, aby sme mu umožnili prístup do obmedzených (alebo len jeho vlastných) sekcií webu. Používateľovi budete musieť poslať súbor cookie, ktorý bude slúžiť ako jeho následný identifikátor na stránke. Tento prístup sa stáva veľmi ťažkopádnym a nepohodlným, akonáhle stránka začne zhromažďovať stále viac informácií o správaní používateľov, pretože všetky informácie odosielané používateľovi by mali byť prednostne zakódované, aby ich nebolo možné sfalšovať. Prednedávnom bolo možné predstieraním súboru cookie „naskladať“ viac ako jeden rozhovor a niekedy sa dokonca dostať do pošty niekoho iného. Okrem toho sú na svete stále čudní ľudia, ktorých prehliadač nepodporuje cookies.

Nebudem sa venovať technologickým otázkam štruktúry mechanizmu relácie, ale len popíšem, ako správne pracovať so reláciami v PHP.

Ako pracovať s reláciami?

Ak otestujete príklady z článku (alebo vaše skripty) na akomkoľvek komerčnom hostingu, nemali by byť s prácou s reláciami žiadne problémy. Ak si svoj server nastavíte sami (či už ide o skutočný server alebo emulátor), môžu sa objaviť chyby s nasledujúcim obsahom:

"Upozornenie: otvorenie (/ var / stav / php / sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) zlyhalo: Žiadny takýto súbor alebo adresár (2)".

Znamená to len, že váš PHP je nesprávne nakonfigurovaný. Tento problém môžete vyriešiť zapísaním správnej cesty (do existujúceho adresára) na uloženie relácií do súboru php.ini a reštartovaním servera.

Každý skript, ktorý bude používať premenné (údaje) z relácií, by mal obsahovať nasledujúci riadok:

Session_start ();

Tento príkaz hovorí serveru, že daná stránka potrebuje všetky premenné, ktoré sú priradené k danému používateľovi (prehliadaču). Server vezme tieto premenné zo súboru a sprístupní ich. Je veľmi dôležité otvoriť reláciu pred odoslaním akýchkoľvek údajov používateľovi; v praxi to znamená, že funkciu session_start () je vhodné volať hneď na začiatku stránky, napríklad:

Session_start (); ?> ... Na nastavenie adresára, do ktorého sa budú súbory relácie ukladať, použite funkciu session_save_path (): session_save_path ($ _ SERVER ["DOCUMENT_ROOT"]. "/ Session"); session_start ();

Po spustení relácie môžete nastaviť globálne premenné. Pri priraďovaní hodnoty ľubovoľnému poľu v poli $ _SESSION sa premenná s rovnakým názvom automaticky zaregistruje ako premenná relácie. Toto pole je dostupné na všetkých stránkach používajúcich reláciu. Napríklad, poďme analyzovať program:

index.php Všetko OK. Relácia bola načítaná! Poďme cez to, pozrime sa, čo tam je: veci.php

Keď sa tieto súbory spúšťajú postupne, prvý skript „index.php“ vytvorí nasledujúci výsledok:

Všetko OK. Relácia bola načítaná! Poďme cez to, pozrime sa, čo tam je:

A druhý "dothings.php" je toto:

Pýtali sa ma na index.php

Premenná $ a je teraz k dispozícii na všetkých stránkach tohto webu, ktoré začali relácie.

Ďalšie užitočné funkcie a techniky na prácu s reláciami:

  • nenastavené ($ _ SESSION ["a"])- relácia "zabudne" hodnotu premennej nastavenej reláciou;
  • session_destroy ()- relácia je zničená (napríklad ak používateľ opustil systém stlačením tlačidla "exit");
  • session_set_cookie_params (int lifetime [, cesta reťazca [, doména reťazca]])- pomocou tejto funkcie môžete nastaviť, ako dlho bude relácia "žiť" nastavením unix_timestamp, ktorý určuje čas, kedy relácia "zomrie". V predvolenom nastavení relácia „žije“, kým klient nezavrie okno prehliadača.
  • session_write_close ()- zaznamenávanie premenných relácie a jej zatvorenie. Toto je potrebné na otvorenie stránky v novom okne, ak stránka vykonáva dlhé spracovanie a zablokovala súbor relácie pre váš prehliadač.

Príklady

Teraz prejdime k praktickej aplikácii mechanizmu relácie. Tu sa pozrieme na niekoľko pomerne jednoduchých, ale užitočných príkladov.

Autorizácia používateľa

Otázky týkajúce sa autorizácie používateľov pomocou relácií PHP sú neustále kladené na konferenciách o webovom programovaní. Mechanizmus autorizácie používateľov v systéme pomocou relácií je z bezpečnostného hľadiska celkom dobrý (pozri časť).

Náš príklad bude pozostávať z troch súborov: index.php, authorize.php a secretplace.php. Súbor index.php obsahuje formulár, kde užívateľ zadá svoje užívateľské meno a heslo. Tento formulár odovzdá údaje do súboru authorize.php, ktorý v prípade úspešnej autorizácie umožní užívateľovi prístup k súboru secretplace.php a v opačnom prípade zobrazí chybové hlásenie.

Príklady: index.php Zadajte svoje heslo

Prihlásiť sa:
heslo:
autorizovať.php stránka ... hlavička ("Umiestnenie: secretplace.php"); východ; )) // ak niečo nebolo v poriadku, používateľ dostane // chybové hlásenie. ?> Zadali ste nesprávne heslo! tajné miesto.php ahoj, ste na tajnej stránke !!! :)

Bezpečnosť

Dokážeme teda preniesť identifikátor z jednej stránky (PHP skript) na druhú (až do ďalšieho hovoru z našej stránky), čo znamená, že dokážeme rozlíšiť všetkých návštevníkov stránky. Keďže identifikátor relácie je veľmi veľké číslo (128 bitov), ​​nie je prakticky žiadna šanca, že bude hrubou silou. Útočníkovi teda zostávajú nasledujúce možnosti:

  • v počítači používateľa je trójsky kôň, ktorý kradne čísla relácií;
  • Útočník zachytáva komunikáciu medzi počítačom používateľa a serverom. Samozrejme, existuje bezpečný (šifrovaný) protokol SSL, no nie každý ho používa;
  • sused prišiel k počítaču nášho používateľa a ukradol číslo relácie.

Takéto situácie založené na tom, že niekto niekomu niečo ukradne, vo všeobecnosti nie sú v kompetencii programátora. O to by sa mali postarať správcovia a samotní používatelia.

PHP sa však často dá oklamať. Pozrime sa na možné hackerské body v programe autorizácie používateľov:

  • Súbor authorize.php - pokus uhádnuť heslo pomocou skriptu tretej strany;
  • Súbor secretplace.php je pokus oklamať program zadaním hodnôt premennej $ log_user do panela s adresou prehliadača, napríklad:
    "http://www.yoursite.ru/secretplace.php? prihlásený_používateľ = hacker"

V našom programe sú teda jasne viditeľné dve „diery“, jedna je malá a nie je nijak zvlášť nápadná, no druhá je jednoducho obrovská, cez ktorú väčšina hackerov prelezie tam, kde nepotrebuje.

Ako "zaplátať" dieru číslo 1?

Nebudeme písať tony kódu na zablokovanie IP adresy a pod., ale len skontrolujeme, odkiaľ požiadavka pochádza, respektíve z ktorej stránky požiadavka prišla, ak je to nejaká stránka z nášho webu, tak je všetko v poriadku, ale vo všetkých ostatných prípadoch to dnu nevpustíme. Opravme súbor authorize.php:

autorizovať.php V2 stránka ... hlavička ("Umiestnenie: secretplace.php"); východ; )))?> Zadali ste nesprávne heslo!
Ako sa zbaviť "diery" číslo 2?

Predpokladajme, že máte webovú stránku, na ktorej sa môže každý smrteľník zaregistrovať a prispievať do fóra. Prirodzene, vo fóre majú niektorí užívatelia (administrátori, moderátori) viac možností ako iní, napríklad môžu mazať správy od iných užívateľov. Úroveň prístupu používateľa uložíte v relácii do premennej $ user_status, kde $ user_status = 10 zodpovedá plný prístup do systému. Útočníkovi, ktorý príde na stránku, sa stačí bežným spôsobom zaregistrovať a potom pridať do panela s adresou prehliadača ? user_status = 10... Takže máte nového admina na vašom fóre!

V podstate je možné nastaviť akúkoľvek premennú skriptu cez adresný riadok jednoduchým pridaním otáznika a názvu premennej s jej hodnotou za celú adresu do skriptu. Opravme náš kód, aby sme tomu zabránili:

secretplace.php V2 premenná nie je nastavená ($ _ SESSION ["logged_user"]); // otvorenie relácie session_start (); / * na túto stránku nemôžete len tak prejsť ... ak používateľské meno nie je zaregistrované, presmerujeme ho na stránku index.php, kde zadáte používateľské meno a heslo ... tu môžete urobiť skutočne veľa, napr. napríklad si zapamätajte IP používateľa a po treťom pokuse o prístup k súborom ho zablokujte. * / if (! isset ($ _ SESSION ["logged_user"])) (hlavička ("Umiestnenie: index.php"); exit;)?> ahoj, ste na tajnej stránke! výsledky

Mechanizmus relácie je celkom skvelá funkcia jazyk PHP... Relácie sú jednoduché, veľmi flexibilné na použitie. Mimochodom, existuje jedna, zriedka zdokumentovaná príležitosť PHP relácie(dostupné od verzie 4.0.3) - v reláciách je možné ukladať nielen premenné, ale aj objekty.

Príklady

?>
// Automatické vkladanie SID do odkazov. ini_set ("session.use_trans_sid", true); session_start (); ?> Kliknite tu!
Kliknite tu !!

// Príklad práce s reláciami. session_start (); // Ak ste stránku práve navštívili, vynulujte počítadlo. if (! isset ($ _ SESSION ["počet"])) $ _SESSION ["počet"] = 0; // Zvýšenie počítadla v relácii. $ _SESSION ["počet"] = $ _SESSION ["počet"] + 1; ?>

Počítadlo

čas (s).
Zatvorte prehliadač a vynulujte počítadlo.
"target =" _blank "> Otvorte podriadené okno prehliadača.
// Jednoduchý príklad používania relácií bez súborov cookie. názov_relácie ("test"); session_start (); $ _SESSION ["počet"] = @ $ _ SESSION ["počet"] + 1; ?>

Počítadlo

V aktuálnej relácii práce s prehliadačom ste otvorili túto stránkučas (s).
Ak chcete resetovať toto počítadlo, zatvorte prehliadač.
?"> Kliknutím sem obnovíte stránku!

Relácie predstavujú jednoduchý spôsob ukladania informácií pre jednotlivých používateľov s jedinečným ID relácie. Toto možno použiť na pretrvávanie stavu medzi požiadavkami na stránku. ID relácie sa zvyčajne odosielajú do prehliadača prostredníctvom súboru cookie relácie a používajú sa na získanie dostupných údajov relácie. Neprítomnosť ID relácie alebo cookie relácie hovorí PHP, aby vytvorilo novú reláciu a vygenerovalo nové ID relácie.

Relácie využívajú jednoduchú technológiu. Keď je vytvorená relácia, PHP buď získa existujúcu reláciu pomocou odovzdaného identifikátora (zvyčajne zo súboru cookie relácie), alebo ak nič neprešlo, vytvorí sa nová relácia. PHP vyplní superglobálnu $ _SESSION informáciami o relácii po spustení relácie. Keď PHP skončí, automaticky serializuje obsah superglobálu $ _SESSION a odošle na uloženie pomocou obsluhy relácie na zaznamenanie relácie.

PHP štandardne používa na ukladanie relácií internú obsluhu súborov, ktorá je nastavená v premennej session.save_handler INI. Tento handler ukladá údaje na serveri do adresára špecifikovaného v konfiguračnej direktíve session.save_path.

Relácie je možné spustiť manuálne pomocou funkcie session_start ()... Ak je direktíva session.auto_start nastavená na 1, relácia sa automaticky spustí na začiatku požiadavky.

Relácia sa zvyčajne končí, keď PHP dokončí vykonávanie skriptu, ale možno ju ukončiť aj manuálne pomocou funkcie session_write_close ().

Pozor

Pozornosť

Komentujte:

Relácie využívajúce súbory (predvolené v PHP) blokujú súbor relácie ihneď po otvorení relácie s funkciou session_start () alebo nepriamo zadaním session.auto_start. Po zablokovaní nemôže žiadny iný skript pristupovať k rovnakému súboru relácie, kým nie je zatvorený alebo keď sa skript neskončí alebo keď sa nezavolá funkcia. session_write_close ().

S najväčšou pravdepodobnosťou to bude problém pre stránky, ktoré vo veľkej miere využívajú AJAX a odosielajú viaceré súbežné požiadavky. Najjednoduchší spôsob, ako vyriešiť tento problém, je zavolať funkciu session_write_close () hneď po vykonaní všetkých požadovaných zmien v relácii, najlepšie bližšie k začiatku skriptu. Môžete tiež použiť iný mechanizmus relácie, ktorý podporuje súbežnosť.

Neviem prečo, ale vyskúšal som všetky odpovede / google .. nič som nenašiel. Tu je situácia:

Localhost kód

výsledok:

Sekvenčné session_id () na stránkach aplikácie a pri obnovovaní stránky. $ _COOKIE ["PHPSESSID"] zodpovedá session_id ()

Priamy server

Session_start (); echo session_id (); print_r ($ _ COOKIE ["PHPSESSID"]);

výsledok:

session_id () sa mení pri každej požiadavke, opätovnom načítaní stránky alebo návšteve inej stránky. $ _COOKIE ["PHPSESSID"] má hodnotu NULL / prázdne. Rovnaký kód sa používa v hornej časti stránky. žiadny iný obsah.

Tento problém mi spôsobil skutočnú bolesť hlavy. Aká konfigurácia servera alebo chyba to môže spôsobovať? Prečo je súbor cookie PHPSESSID prázdny, domnievam sa, že je to preto, že priradené session_id () sa tiež resetuje pri každej žiadosti?

Akákoľvek pomoc, prosím, chlapci!

EDIT: Na svojom lokálnom vzdialenom serveri som vytvoril jednoduchý testovací súbor s 3 riadkami. Nesúvisí to s mojím kódom. $ _COOKIE ["PHPSESSID"] je stále prázdny a pri každej aktualizácii sa na skutočnom hostiteľovi objaví nový session_id ().

error_reporting SET TO ALL Toto dostávam na živom hostiteľovi:

Upozornenie: Nedefinovaný index: PHPSESSID v /home/vivaplug/public_html/dev/wp-content/plugins/test.php na riadku 5

Hlavičky Google Chrome

LOCALHOST

Adresa URL požiadavky: http: //localhost/wp-content/plugins/test.php Metóda požiadavky: GET Stavový kód: 200 OK Žiadosť Zdroj zobrazenia hlavičky Prijať: text / html, aplikácia / xhtml + xml, aplikácia / xml; q = 0,9, image / webp, * / *; q = 0,8 Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US, en; q = 0,8 Cache-Control: no-cache Pripojenie: keep-alive Cookie: PHPSESSID = 68b7m4arpsacks4aetgmd3rs Hostiteľ: localhost Pragma: no-cache User-Agent: Mozilla / 5.0 (Windows NT 6.1) AppleWebKit / 537.36 (KHTML, ako Gecko) Chrome / 30.0.1599.101 Safari / 537.36 Response Headersview source Cache-Control: no-store, no- cache, must-revalidate, post-check = 0, pre-check = 0 Pripojenie: Keep-Alive Content-Type: text / html Dátum: Ut, 05 Nov 2013 07:10:51 GMT Expires: Thu, 19 Nov 1981 08 : 52: 00 GMT Keep-Alive: časový limit = 5, max = 100 Pragma: bez cache Server: Apache / 2.4.4 (Win32) PHP / 5.4.16 Transfer-Encoding: chunked X-Powered-By: PHP / 5.4 .16

ODSTRÁNIŤ SERVER

Adresa URL požiadavky: http: //vivaplugins.com/dev/wp-content/plugins/test.php Metóda požiadavky: GET Stavový kód: 200 OK Žiadosť Zdroj zobrazenia hlavičky Prijať: text / html, aplikácia / xhtml + xml, aplikácia / xml; q = 0,9, image / webp, * / *; q = 0,8 Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US, en; q = 0,8 Cache-Control: max-age = 0 Pripojenie: keep- živý Hostiteľ: vivaplugins.com User-Agent: Mozilla / 5.0 (Windows NT 6.1) AppleWebKit / 537.36 (KHTML, ako Gecko) Chrome / 30.0.1599.101 Safari / 537.36 Response Headersview source Vek: 0 Cache-Control: no-store, no -cache, must-revalidate, post-check = 0, pre-check = 0 Kódovanie obsahu: gzip Typ obsahu: text / html Dátum: Ut, 05 Nov 2013 07:07:49 GMT Pragma: no-cache Server: Pokročilý hosting od http://www.unixy.net/varnish Transfer-Encoding: kusové Vary: Accept-Encoding Via: 1.1 lak X-Cache: HIT X-Cache-Hits: 2 X-Cacheable: ÁNO X-Powered-By : PHP / 5.4.20 X-lak: 1984840969 1984839805