Sesiuni în php

În diverse conferințe dedicate programării, în primul rând am fost întotdeauna interesat de astfel de secțiuni precum "Web-programming" și "Scripts". Pentru cea mai mare parte, întrebări despre PHP în astfel de forumuri este destul de simplu, care necesită doar o înțelegere generală a PHP, cu toate acestea, cel mai frecvent întrebat întrebarea în experiența mea, este: „Ce este o sesiune în PHP și ce / cum pot mânca?“. Aș dori să clarific această problemă o dată pentru totdeauna.







De la început, PHP toate au un bang, dar de îndată ce limba a început să creeze o serie de proiecte suficient de mari, dezvoltatorii se confruntă cu o nouă problemă - în PHP nici un concept de variabile globale! Adică, a fost executat un anumit script, a trimis pagina generată clientului și toate resursele folosite de acest script au fost distruse. Voi încerca să ilustrez: să presupunem că există două pagini ale unui site, index.php și dothings.php. Sursele pentru aceste pagini arata astfel:

$ a = "Am fost atribuit index.php";

Dacă executați aceste două scripturi, atunci pe prima pagină vedem inscripția "Am fost atribuită index.php", iar a doua pagină va fi goală.

Nu voi intra în problemele tehnologice ale mecanismului de lucru al sesiunilor, ci va descrie doar modul de lucru cu sesiunile din PHP.

Cum să lucrați cu sesiunile?

Dacă testați exemplele din articol (sau script-urile dvs.) pe orice gazdă comercială, nu ar trebui să existe probleme cu lucrul cu sesiunile. Dacă ați configurat serverul dvs. (fie un server real sau un emulator), pot apărea erori despre acesta:

"Avertisment: deschis (/ var / stat / php / sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) a eșuat: Nu există un astfel de fișier sau director (2)."

Aceasta înseamnă doar că aveți un PHP greșit configurat. Puteți rezolva această problemă scriind calea corectă (la directorul existent) pentru a salva sesiunile din fișierul php.ini și a reporni serverul.

Orice script care va folosi variabilele (datele) din sesiuni ar trebui să conțină următoarea linie:

Această comandă indică serverului că această pagină are nevoie de toate variabilele asociate cu acest utilizator (browser). Serverul ia aceste variabile (dintr-un fișier sau dintr-o bază de date) și le pune la dispoziție. Este foarte important să deschideți o sesiune înainte ca orice date să fie trimise utilizatorului; în practică, aceasta înseamnă că funcția session_start () trebuie apelată la începutul paginii, de exemplu:







După începerea sesiunii, puteți specifica variabilele globale. Acest lucru este elementar: numim session_register ('var_name'); și $ var_name devin disponibile pe toate paginile care utilizează sesiunea. De exemplu, descoperim programul dat la începutul articolului:

// setați valoarea variabilei

$ a = "Am fost atribuit index.php";

// înregistrați o variabilă cu o sesiune deschisă

// important: numele variabilelor sunt transmise funcției session_register ()

Totul este OK. Sesiunea încărcată!

Când executați aceste fișiere (într-o ordine logică de curs), primul script (index.php) va returna următorul rezultat:

Totul este OK. Sesiunea încărcată! Să mergem să vedem ce este acolo:

Și a doua (dothings.php) este următoarea:

Am fost repartizat la index.php

Variabila $ a este acum disponibilă în toate paginile acestui site care au început sesiunea.

Alte funcții utile pentru lucrul cu sesiunile:

session_unregister (șir) - sesiune <забывает> valoarea variabilei globale date;

session_destroy () - sesiunea este distrusă (de exemplu, dacă utilizatorul a părăsit sistemul făcând clic pe buton <выход>);

session_set_cookie_params (int durata de viata [, path string [, string]]) - cu aceasta functie puteti seta cat timp va dura <жить> sesiune specificând unix_timestamp definind timpul <смерти> sesiune. Implicit, sesiune <живёт> până când clientul închide fereastra browserului.

Acum, să ne îndreptăm spre aplicarea practică a mecanismului sesiunilor. Să ne uităm la câteva exemple destul de simple și în același timp utile.

Introduceți parola, muritor

Nume de utilizator:

parola:

// datele au fost trimise prin formular?

// verificați datele pentru corectitudine. în acest caz

// introduce numele de utilizator și parola direct în cod, mai adecvat

// ar verifica login-ul / parola în baza de date și când

// rețineți numele de utilizator

// și trimiteți-l la <секретную> pagina.

Bună ziua, , vă aflați pe pagina secretă. )

Deci, putem transfera identificatorul dintr-o pagină (script-ul PHP) într-altul (până la următorul apel de pe site-ul nostru), ceea ce înseamnă că putem distinge toți vizitatorii de site-ul. Din moment ce identificatorul de sesiune este un număr foarte mare (128 biți), practic nu există șanse să fie posibilă preluarea căutării. Prin urmare, atacatorul are următoarele opțiuni:

pe computerul utilizatorului este <троян>, care fură numerele de sesiuni;

un atacator captează traficul între computerul utilizatorului și server. Desigur, există un protocol SSL securizat (criptat), dar nu toate îl folosesc;

Un vecin a venit la calculatorul utilizatorului nostru și a furat numărul sesiunii.

Astfel de situații, bazate pe faptul că cineva fură ceva de la cineva, în general, nu intră în competența programatorului. Acest lucru ar trebui să fie gestionat de administratori și utilizatori înșiși.

Fișierul autorize.php este o încercare de a selecta o parolă utilizând un script de terță parte;

Deci, în programul nostru putem vedea clar două <дыры>, unul mic și nu deosebit de vizibil, dar cel de-al doilea - doar un imens, prin care majoritatea hackerilor și urca la locul unde nu aveți nevoie.

Cum poate <залатать> gaura nr. 1?

// calea completă la directorul rădăcină unde sunt localizate scripturile

// dacă utilizatorul a venit de pe orice pagină a site-ului nostru

// atunci este ca și al nostru.

// variabila $ HTTP_REFERER este întotdeauna disponibilă implicit

// din valoarea în $ SERVER_ROOT

// datele au fost trimise prin formular?







Articole similare

Trimiteți-le prietenilor: