Harada php defolt olaraq sessiya məlumatlarını saxlayır. PHP-də sessiyalar

10.08.2022

//Cari skript üçün sessiya məlumatlarını silin: $_SESSION = ; //idinə uyğun kuki silin: @unset($_COOKIE); //sessiya yaddaşını silin: session_destroy();

Bir sessiyanın silinməsinin niyə 3 mərhələyə bölünməsinin lazım olduğunu başa düşmək üçün onun harada və harada saxlandığını anlayaq.

Aydınlıq üçün bütün növ sessiya məlumatlarının saxlandığı bütün yerləri müəyyən edək:

  1. Superqlobal massiv $_SESSION.
    Sessiya başlanğıcında yaradılmışdır session_start(). Bu, yalnız skript işləyərkən mövcud olan və serverdə saxlanmayan, lakin təsadüfi giriş yaddaşı(bu o deməkdir ki, skriptin növbəti icrasından sonra yox olur, serverə növbəti dəfə daxil olanda yaddaşdan yenidən işə salınır).

    Koterovdan:

    Skript başa çatdıqda, PHP avtomatik olaraq $_SESSION massivini müvəqqəti yaddaşda saxlayır, adı SID-də saxlanılır.

    massivdən verilənlərin yaddaşa yazılması deməkdir $_SESSION, içində hər hansı varsa.

  2. SID bişirin.
    Sessiya başlanğıcında yaradılmışdır session_start(). Verilmiş istifadəçi üçün sessiya məlumat anbarının yerini saxlayır. O, yalnız kukiləri zorla sildiyiniz halda silinə bilər.
  3. Və nəhayət, Sessiya məlumatlarının saxlanması.
    Session_start() funksiyasını çağırmaqla sessiya başlayanda yaradılır. Yaddaş serverdə (PHP skriptinizin işlədiyi yerdə) yerləşir.
    Massivdən verilənlər ona yazılır $_SESSION, əgər varsa/orada görünür. Məlumat yalnız zəng edildikdə ondan silinir session_destroy().
    Bu yaddaş istifadəçinin növbəti sorğusu cavab aldıqdan sonra da serverdə mövcud olmağa davam edir, yəni. ssenari öz işini başa çatdırdı.

Bunlar. deyə bilərik ki:

  • PHP skriptində siz $_SESSION massivi vasitəsilə sessiya məlumatları ilə işləyə bilərsiniz
  • $_SESSION seans mağazası üçün "maska"dır və bu massivə yazmaq mağazaya yazmaqla nəticələnsə də, serialın silinməsi özü mağazadakı məlumatları məhv etmir.
  • Massivi silməklə, siz yalnız cari skript çağırışında sessiya məlumatlarına girişi itirəcəksiniz, lakin növbətisində yaddaşı əlavə olaraq təmizləməsəniz, yenidən işə salınacaq (küldən qalxacaq).

Beləliklə

Əgər session_destroy()çağırılmayacaq və kukilər silinməyəcək, sonra skript yenidən işə salındıqda, əvvəllər ona yazılmış yaddaşdan məlumatlar görünəcək. $_SESSION, skripti işlədərkən belə, əl ilə daxil edin $_SESSION onları əlavə etməyəcəksiniz.

// Cari skriptdə seans məlumatlarını təmizləmək üçün bu sətri yazırıq $_SESSION = ; //Bu sətir SID silir @unset($_COOKIE); //Sessiya yaddaşını silir: session_destroy();

İnternetdə seansların nə olduğu, nə üçün olduğu və onlarla necə işləmək barədə minlərlə dərslik tapa bilərsiniz. Ancaq təəssüf ki, onları oxuduqdan sonra bir çox suallar hələ də qalır. Məncə, hər şeyi başa düşməyin ən asan yolu seansların necə işlədiyinə daxildən baxmaqdır. Bunlar. brauzer və veb server mübadiləsi qeydlərini öyrənin, həmçinin müştəri tərəfində və server tərəfində hansı məlumatların saxlandığına baxın.

Bundan sonra bir çox məqamlar daha aydın olur və iş mexanizminin özü daha şəffaf olur.

Aşağıdakı standart skriptdən istifadə edərək sessiyaların işini öyrənəcəyik:

Bu belə işləyir:

Blok 1. session_start() funksiyası PHPSESSID unikal sessiya identifikatorundan istifadə edərək yeni sessiya yaradır və ya köhnəni yükləyir.

Blok 2.Əgər sessiya bərpa olunubsa, $_SESSION["baxış"] dəyəri bir artır. Əgər yoxsa, o, birinə işə salınır.

Nəzəriyyə olaraq, brauzerdə kuki dəstəyi aktivləşdirilibsə, mexanizm işləməli və səhifə hər dəfə yeniləndikdə sayğac dəyəri bir artacaq.

Skriptin ilk yüklənməsi

Başlıqları tələb edin

GET / HTTP/1.1 Host: firengrange.local İstifadəçi-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2 Qəbul edin: text/html,application/xhtml+xml,application/ xml;q=0.9,*/*;q=0.8 Qəbul-Dil: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3 Qəbul-kodlaşdırma: gzip, deflate Accept-Charset : windows-1251,utf-8;q=0.7,*;q=0.7 Bağlantı: canlı saxlama Keş-nəzarət: max-age=0

Cavab başlıqları

HTTP/1.1 200 OK Tarix: Cümə axşamı, 29 Sentyabr 2011 20:36:15 GMT Server: Apache/2.2.13 (Win32) PHP/5.2.10 X-Powered-By: PHP/5.2.10 Set-Cookie: PHPSESSID=k33en6ccgcia7125mitj5te4u6; yol=/ Bitmə vaxtı: Cümə axşamı, 19 Noyabr 1981 08:52:00 GMT Cache-Control: mağaza yoxdur, keş yoxdur, yenidən təsdiq edilməlidir, yoxlamadan sonra = 0, əvvəlcədən yoxlama = 0 Praqma: önbelleksiz Məzmun Uzunluğu: 58 Canlı saxlayın: fasilə = 5, maksimum = 100Əlaqə: Keep-Alive Məzmun növü: mətn/html

Şərh

Brauzer orijinal sorğuda heç bir şəkildə özünü müəyyən etmədi, buna görə də mexanizm PHP seansları yeni unikal sessiya identifikatoru yaratdı və brauzerə eyni identifikatorun saxlanacağı kuki yaratmağı əmr etdi.

Server tərəfi

Skriptin server tərəfində işləməsi nəticəsində aşağıdakı məzmunlu sess_k33en6ccgcia7125mitj5te4u6 faylı yaradılır:

Müştəri tərəfi

Müştəri tərəfində unikal sessiya identifikatorunun dəyərini saxlayan PHPSESSID kukisi yaradılır.

Qeyd. Defolt PHP parametrləri ilə PHPSESSID kukisinin ömrü brauzer bağlanana qədərdir. Bunlar. brauzer bağlanan kimi kuki silinəcək və sessiya itiriləcək. PHPSESSID kukisinin istifadə müddəti session.cookie_lifetime dəyərini dəyişdirməklə dəyişdirilə bilər.

Skriptin nəticəsi

İkinci skript yüklənir

Başlıqları tələb edin

GET / HTTP/1.1 Host: firengrange.local İstifadəçi-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2 Qəbul edin: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Qəbul Dili: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3 Qəbul-kodlaşdırma: gzip, deflate Qəbul-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 Bağlantı: canlı saxlamaq Kuki: PHPSESSID=k33en6ccgcia7125mitj5te4u6 Keş-nəzarət: max-age=0

Cavab başlıqları

HTTP/1.1 200 OK Tarix: Cümə axşamı, 29 Sentyabr 2011 20:49:41 GMT Server: Apache/2.2.13 (Win32) PHP/5.2.10 X-Powered-By: PHP/5.2.10 Bitmə vaxtı: Cümə axşamı, 19 Noyabr 1981 08:52:00 GMT Keş-nəzarət: mağaza yoxdur, keş yoxdur, yenidən təsdiq edilməlidir, yoxlanışdan sonra = 0, əvvəlcədən yoxlama = 0 Praqma: keşsiz Məzmun uzunluğu: 58 Canlı saxla: vaxt aşımı = 5, maks=100 Əlaqə: Canlı Məzmun-Tip: mətn/html

Şərh

Brauzer PHPSESSID kukisini veb serverə göndərir, ondan istifadə edərək PHP $_SESSION massivini sess_k33en6ccgcia7125mitj5te4u6 faylının qiymətləri ilə inisiallaşdırır. Müvafiq olaraq, 2-ci blokda IF (birbaşa) filialı işlənir.

Server tərəfi

Skriptin işləməsi nəticəsində sess_k33en6ccgcia7125mitj5te4u6 faylının məzmunu dəyişir:

Müştəri tərəfi

Müştəri tərəfində heç nə dəyişmir.

Skriptin nəticəsi

Sonra nə var?

Brauzer bağlanmazdan əvvəl sonrakı səhifə yükləmələri, ikinci skript yükləməsinin necə işlədiyi kimi işləyəcək.

Çünki Kuki-nin ömrü cari brauzer seansı ilə məhdudlaşdırıldığından, o bağlandıqdan sonra unikal sessiya identifikatoru itiriləcək və yenidən işə salındıqda proses yenidən başlayacaq.

Bununla belə, PHPSESSID-i skript parametri kimi açıq şəkildə göstərsəniz, yadda saxlanmış sessiyaya qayıda bilərsiniz:

Sessiyaya qayıtmaq kifayət qədər şərtlidir, çünki... Skriptin işləməsi nəticəsində bu halda kuki yaradılmır. Server cavab başlıqları:

HTTP/1.1 200 OK Tarix: Cümə axşamı, 29 Sentyabr 2011 21:01:52 GMT Server: Apache/2.2.13 (Win32) PHP/5.2.10 X-Powered-By: PHP/5.2.10 Bitmə vaxtı: Cümə axşamı, 19 Noyabr 1981 08:52:00 GMT Keş-nəzarət: mağaza yoxdur, keş yoxdur, yenidən təsdiq edilməlidir, yoxlanışdan sonra = 0, əvvəlcədən yoxlama = 0 Praqma: keşsiz Məzmun uzunluğu: 58 Canlı saxla: vaxt aşımı = 5, maks=100 Əlaqə: Canlı Məzmun-Tip: mətn/html

Bunlar. Bu xüsusi sessiya ilə işləmək üçün bütün keçidlər təyin edilməlidir?PHPSESSID=k33en6ccgcia7125mitj5te4u6.

Qeyd. Siz PHP-yə deyə bilərsiniz ki, kuki vasitəsilə yalnız unikal sessiya identifikatoru keçsin. Bunun üçün siz session.use_only_cookies-i 1-ə təyin etməlisiniz. Bu halda yuxarıda göstərilən hiylə işləməyəcək.

Brauzerdə kukilər söndürülübsə, yuxarıda etdiyimiz kimi, sessiya identifikatorunu parametrlərdən keçirə bilərsiniz. Üstəlik, PHP-də avtomatik olaraq keçidlərə lazımi parametr əlavə edən və formalara gizli sahələr əlavə edən mexanizm var. Əməliyyat prinsipi peçenye ilə eynidır, buna görə də bu işi ayrıca təhlil etməyəcəyik.

Qısa anket (FAQ)

Sessiya məlumatları fiziki olaraq harada saxlanılır?

Sessiya məlumatları serverdə saxlanılır. Varsayılan olaraq, onlar fayllara yazılır, lakin siz sessiya məlumatlarını saxlamaq üçün öz mexanizminizi təyin edə bilərsiniz (məsələn, verilənlər bazasından istifadə etməklə). Daha ətraflı məlumat istəyirsinizsə, session_set_save_handler funksiyasına baxın.

Unikal sessiya identifikatorunu kim yaradır?

Unikal sessiya identifikatoru (PHPSESSID) server tərəfindən yaradılır.

Öz sessiya mexanizminizi yazmaq mümkündürmü?

Bəli, bu, olduqca mümkündür. Gördüyünüz kimi, PHP fövqəltəbii heç nədən istifadə etmir - identifikator kukilərdən istifadə edərək sorğular arasında saxlanılır, sessiya məlumatları serverdəki fayllarda saxlanılır.

Məsələn, məşhur CodeIgniter çərçivəsinin sessiyalarla işləmək üçün öz mexanizmi var.

Sessiya mexanizmi nə dərəcədə təhlükəsizdir?

Sessiya yalnız unikal sessiya identifikatoru ilə müəyyən edilir, buna görə də ümumiyyətlə təcavüzkar serveri çaşdırmaq üçün onu oğurlamalıdır. Yuxarıda istifadə etdiyimiz test skriptini götürək. Əgər ona başqa İP-dən daxil olarsa (sessiyanı yaradana nisbətən), lakin eyni PHPSESSID ötürülürsə, o zaman sessiya uğurla bərpa olunacaq və sayğac əvvəlki saxlanmış dəyərdən artacaq.

Özünüz əlavə qoruma təmin etməli olacaqsınız. Misal üçün:

  • Müştərinin IP və İstifadəçi Agentini sessiya məlumatlarında saxlaya bilərsiniz (server tərəfində saxlanılacaq) və sonra hər zənglə cari dəyərlərin saxlananlarla üst-üstə düşdüyünü yoxlayın. Bu halda, təhlükəsizlik və istifadəçi təcrübəsi arasında güzəştə getmək lazımdır.

    Məsələn, istifadəçinin dinamik IP-si varsa və siz avtorizasiyanı saxlamaq üçün seanslardan istifadə edirsinizsə, lakin eyni zamanda IP uyğunluğunu yoxlayırsanız, hər dəfə ünvan dəyişdikdə istifadəçi loqin və şifrəni yenidən daxil etməli olacaq.

    Eynilə, İstifadəçi-Agent sətri brauzer versiyasını yeniləyərkən və ya bəzi plaginləri quraşdırarkən dəyişə bilər.

  • Tövsiyə olunan sessiya mühafizə mexanizmlərindən biri skriptə hər dəfə daxil olanda identifikatoru bərpa etməkdir (session_regenerate_id funksiyasına baxın). Aşağıdakı kontekstdə işin skriptini və alqoritmini görə bilərsiniz.

    Qeyd. Rəsmi veb saytındakı müzakirəyə inanırsınızsa, identifikatoru yenidən yaradan zaman məlumatlara paralel girişlə bağlı problemlər yarana bilər.

Kontekstdə identifikatorun təkrar generasiyası ilə sessiyaların işi

Skript


// blok 1
session_start();
əgər(isset($_SESSION[ "başladı" ]))
session_regenerate_id();
başqa
$_SESSION[ "başladı" ] = doğru;

// blok 2
əgər(isset($_SESSION[ "baxışlar" ]))
$_SESSION[ "baxışlar" ]++ ;
başqa
$_SESSION[ "baxışlar" ] = 1;

// blok 3
əks-səda"
< body>
Baxışların sayı: ". $_SESSION[ "baxış"]."



" ;

?>

PHP-də və ya sayta daxil olan istifadəçi və ya müştəri haqqında məlumat kimi seanslar saytın səhifələri arasında çox çətinlik çəkmədən hərəkət edərkən yadda saxlanılır. Dərs çox vacibdir. Veb saytların 95%-ni yaratmaq üçün uyğundur.

Php-də sessiya nədir

Sessiyalar eyni saytın səhifələri arasında naviqasiya zamanı müvəqqəti məlumatları (məsələn, istifadəçinin sayta daxil olması) saxlamaq üçün istifadə olunur. Seanslardan istifadə edərkən məlumatlar serverdəki müvəqqəti fayllarda saxlanılır.
Çox vaxt sessiyalar (yeri gəlmişkən, kukilər) onlayn mağazalar, forumlar, mesaj lövhələri yaratarkən istifadə olunur, sosial şəbəkələrdə, bloglar və digər resurslar. Sessiya sisteminin rahatlığı, məlumatları burada saxlanılan ziyarətçinin/müştərinin müvəqqəti məlumatlarını saxlamaqdır. sürətli giriş müəyyən vaxt. Sessiyanın təbii bitmə tarixi var - brauzer bağlanana qədər. Yalnız səhifəni bağlasanız, saytı açdığınız zaman istifadəçi/müştəri haqqında məlumat hələ də mövcud olacaq.

Sessiya məntiqi

Sessiya (və ya sessiya) bir növ müvəqqəti məlumat saxlama növüdür. Dərhal sizə xəbərdar edirəm ki, az miqdarda məlumat saxlamağa dəyər. Məsələn, ziyarət edən istifadəçinin loqini və şifrəsi və ya verilənlər bazasında onun seriya nömrəsi.

İş nümunəsi
1. İstifadəçi loqin və şifrəsini daxil edərək sayta daxil olur
2. Giriş və şifrə ilə məlumatlar sayt səhifələrindən birinin sessiyasında saxlanılır:

Fayl index.php

Session_start(); // sessiya məlumatlarından istifadə etmək istədiyiniz hər bir fayl kodun əvvəlində "sessiyaya başlamaq" əmrini ehtiva etməlidir

$login = "admin";
$parol = "parol";
$_SESSION["giriş"] = $giriş; // daxil olan dəyişəni yadda saxla
$_SESSION["parol"] = $parol; // parolu ehtiva edən dəyişəni yadda saxlayın

3. Saytın başqa səhifəsinə keçdiyiniz zaman bu məlumatlar da mövcud olacaq:

Fayl misal.php(və ya hər hansı digər səhifə)

Echo "Sizin girişiniz ".$_SESSION["giriş"]; // "Logininiz admindir" göstərəcək, baxmayaraq ki, biz bu səhifədə heç bir məlumat qeyd etməmişik!
Bax, sadədir!

4. Sessiya məlumatlarını təmizləmək istəyirsinizsə, sizə lazım olan tək şey:

Fayl misal.php

Session_start(); // "sessiyanı yenidən başladın"

Unset($_SESSION["giriş"]); // dəyişən belə qeydiyyatdan çıxarıldı və ya “məhv edildi”
echo "Sizin girişiniz ".$_SESSION["giriş"]; // "Sizin girişiniz" göstəriləcək. Sonuncu sətirdə məhv etdiyimiz üçün heç bir məlumat yoxdur

Session_destroy(); // sessiyanı məhv edin. $_SESSION["parol"] daxil olmaqla bütün data artıq orada deyil. Onları tələb edərkən, bir səhv göstərilir
Ümumiyyətlə, belə bir köçürmə POST metoduna bənzəyir, lakin artıq çoxlu lazımsız kod yazmaq lazım deyil və səhifədən səhifəyə ötürülən bütün məlumatlar serverdə müvəqqəti fayllarda saxlanılır. Yenə deyirəm, sessiyalar kiçik həcmli məlumatlardan ibarət olmalıdır, ona görə də onlar giriş/parol, alış-veriş səbəti və digər kiçik həcmləri saxlamaq üçün uyğundur.

PHP seansından istifadə edərək dəyər və ya massiv ötürülməsi

Sessiyaya yalnız sətir deyil, həm də məlumat massivi yaza bilərsiniz. Sadəcə massivin həcmi ilə onu aşmayın, çünki bütün bunlar serverdəki sürətə və işğal edilmiş yerə təsir edəcəkdir.

Yenidən bir az istifadə edək ana səhifə index.php

Session_start();

$r = massiv("bir", "iki", "üç");

$_SESSION["arr"] = $r;

Hər şeyin göstəriləcəyi səhifəyə
Biz məlumatları sessiyada saxladıq və bütün məlumatları göstərəcəyimiz başqa bir səhifəyə keçidi izlədik.

Təyinat faylı, səhifə test.php massivi açdığımız yer

Session_start();
print_r($_SESSION["arr"]);
// çap edəcək
/*
Massiv
=> bir
=> iki
=> üç
*/
?>
Siz dərsi təzələmək istəyə bilərsiniz. Ümumiyyətlə, hər şey aydın olmalıdır.

Seanslarla işləmək üçün digər funksiyalar

session_register(sətir)- sessiya göstərilən qlobal dəyişənin qiymətini unudur;
session_destroy()- sessiya məhv edilir (məsələn, istifadəçi çıxış düyməsini basaraq sistemi tərk edərsə);
session_set_cookie_params(int ömür boyu [, sətir yolu [, string domeni]])- bu funksiyadan istifadə edərək sessiyanın ölüm vaxtını təyin edən unix_timestamp təyin etməklə sessiyanın nə qədər yaşayacağını təyin edə bilərsiniz.

php-də sessiyalarla işləmək üçün funksiyaların siyahısı
session_cache_expire - cari keşin istifadə müddətini qaytarır
session_cache_limiter - Cari keş məhdudlaşdırıcısını alır və/və ya təyin edir
session_commit session_write_close() üçün ləqəbdir
session_decode - seans məlumatını sətirdən deşifrə edir
session_destroy - sessiya üçün qeydə alınmış bütün məlumatları məhv edir
session_encode - cari sessiya məlumatlarını sətir kimi şifrələyir
session_get_cookie_params - sessiya kuki parametrlərini alır
session_id - cari sessiya identifikatorunu alır və/yaxud təyin edir
session_is_registered - dəyişənin sessiyada qeydə alınıb-alınmadığını müəyyən edir
session_module_name - cari sessiya modulunu alır və/yaxud təyin edir
session_name - cari sessiyanın adını alır və/yaxud təyin edir
session_regenerate_id - cari sessiya identifikatorunu yeni yaradılan ilə dəyişdirir
session_register - cari sessiya üçün bir və ya bir neçə dəyişəni qeyd edir
session_save_path - cari sessiyanı saxlamaq üçün yolu alır və/yaxud təyin edir
session_set_cookie_params - sessiya kuki parametrlərini təyin edir
session_set_save_handler - istifadəçi səviyyəsində sessiya saxlama funksiyalarını təyin edir
session_start - sessiya məlumatlarını işə salır
session_unregister - cari sessiyadan dəyişəni qeydiyyatdan çıxarır
session_unset - bütün sessiya dəyişənlərini buraxır
session_write_close - sessiya məlumatlarını və sessiyanın sonunu yazır

Sessiya işlərinin nümunələri

Sessiya zamanı səhifə baxışlarının sayı. İşin bariz nümunəsi. Bununla belə, brauzeri bağladıqdan sonra geri sayım yenidən başlayacaq.

Bir seansda bir səhifəyə edilən ziyarətlərin sayı

// Kukilər olmadan sessiyalardan istifadənin sadə nümunəsi.
sessiya_adı ("test");
session_start();
$_SESSION["count"] = @$_SESSION["count"] + 1;
?>

Sayğac


Siz bu səhifəni cari brauzer sessiyanızda açdınız
vaxt(lar).
Bu sayğacı sıfırlamaq üçün brauzerinizi bağlayın.
Səhifəni yeniləmək üçün bura klikləyin!
Hər keçidlə sayğac 1 artacaq)

Diqqətinizə görə təşəkkürlər! Fəaliyyətinizdə uğurlar!

Artıq bildiyiniz kimi, HTTP protokolu veb proqramlara "sessiyalar" qurmağa imkan verir - müştəri və server arasında dialoq və bu dialoqun vəziyyəti sorğudan sorğuya qədər saxlanılır.

PHP dili, ilk növbədə veb proqramlaşdırma üçün bir dil olmaqla, sessiya məlumatlarını təşkil edərkən və saxlayarkən ən çox narahatlığı öz üzərinə götürərək HTTP sessiya mexanizmindən istifadə etmək imkanı verir. HTTP sessiya mexanizminin işləməsi üçün nəyin lazım olduğunu sizə xatırlatmağa icazə verin:

  • Server yaratmalıdır unikal nömrə seanslar.
  • Sessiya nömrəsi müştəriyə ötürülməlidir (adətən kukilər vasitəsilə).
  • Server seans məlumatlarını fayllarda və ya verilənlər bazasında saxlaya bilməlidir ki, müştərinin sonrakı sorğularda (həmçinin kukilər vasitəsilə) serverə göndərdiyi sessiya nömrəsini bilməklə bərpa olunsun.

Əslində, seans mexanizminin dişlilərinin fırlanmağa başlaması üçün PHP proqramında görülməli olan yeganə hərəkət tək bir funksiyanı çağırmaqdır: session_start(). Bu funksiya bütün lazımi işləri görür:

  • Müştərinin Kuki-də və ya sorğu parametrlərində artıq mövcud sessiya nömrəsini göndərib-göndərmədiyini yoxlayır. Əgər müştəri seans nömrəsi göndəribsə, onda bu sessiya üçün məlumatlar daimi saxlama yerindən (məsələn, fayldan) yaddaşa yüklənir və $_SESSION massivi vasitəsilə proqram üçün əlçatan olur. Müştəri sessiya nömrəsini göndərməyibsə və ya serverdə belə bir seans yoxdursa, yeni nömrə ilə yeni sessiya yaradılır və onun məlumatları yeni sessiya vəziyyətində $_SESSION massivi vasitəsilə də əldə edilə bilər. boş olacaq. Yeni yaradılmış sessiya nömrəsi Set-Cookie server cavabının başlıq sahəsinə yerləşdirilir.
  • Sessiya məlumatlarının saxlanmasını təmin edir. PHP proqramı sorğunu emal etdikdən sonra $_SESSION massivinin cari vəziyyəti daimi saxlama yerində saxlanılır ki, müştəri növbəti dəfə sorğu göndərəndə yenidən əlçatan olsun.

İndi biz session_start() funksiyasının təfərrüatlarını bildiyimiz üçün bu mexanizmlə oynaya bilərik. Aşağıdakı nümunə sessiyada hər bir müştəri sorğusu ilə bir ədəd artırılan tək nömrəni saxlayır:

Bu səhifəni ilk dəfə ziyarət etdiyiniz zaman server brauzerə sessiya nömrəsi ilə kuki göndərəcək:

Set-Cookie: PHPSESSID=4ftvca7jmmnm04q95r3sdsk6r6; yol=/

Brauzer hər növbəti sorğu ilə eyni sessiya nömrəsini serverə geri göndərəcək. İndi brauzerinizdə kukiləri təmizləsəniz, serverdə fərqli nömrə ilə yeni sessiya yaradılacaq və test skriptimizdə hesablama yenidən başlayacaq.

Daha real nümunə: istifadəçi girişi

Çox vaxt seanslar istifadəçi vebsayta daxil olduqda istifadə olunur. Sayta daxil olarkən istifadəçi server tərəfindən təsdiqlənən login və parol daxil edir. Giriş düzgündürsə, server yenidən giriş və şifrə tələb etməmək üçün sessiyada istifadəçi məlumatlarını yadda saxlamalıdır. Ən sadə halda, bu bir nümunə olardı:

massiv("parol" => "123", "başlıq" => "İdarəçi",), "istifadəçi" => massiv("parol" => "qwe", "başlıq" => "İstifadəçi",),) ; isset($users[$login]) qaytarılsın? $users[$login]: null; ) funksiya getCurrentUser() ( $user = isset($_SESSION["user"])? $_SESSION["user"]: null; return $user; ) funksiya setCurrentUser($user) ( $_SESSION["user"] = $user; ) ?>

Salam,!
Link1 Link2

Çölə çıxmaqSiz hələ sayta daxil olmamısınız. Giriş və parol daxil edin:
Daxil ol: Şifrə:

Bu proqram login və parol tələb edir və siz öz girişinizlə daxil ola bilərsiniz istifadəçi, qwe və ya admin, 123 . Daxil olan istifadəçiyə salamlama göstərilir. Daxil olan zaman istifadəçi adı və ya parol səhv olarsa, mesaj göstərilir.

Bu “sayt”a daxil olmağı bacardıqdan sonra, daxil olmuş istifadəçi olaraq, linklərə (Link1, Link2) klikləyə bilərsiniz.

Sessiyada hansı məlumatları saxlamaq olar?

Varsayılan olaraq, PHP sessiya məlumatlarını mətn kimi müvəqqəti faylda saxlayır. Bunu müvəqqəti PHP faylları olan qovluğa baxaraq yoxlaya bilərsiniz. Bu kataloq phpinfo()-da Environment, TEMP bölməsində göstərilmişdir. Bu qovluqda siz sess_ kimi faylları tapa bilərsiniz. 4ftvca7jmmnm04q95r3sdsk6r6, burada 4ftvca7jmmnm04q95r3sdsk6r6 Kukiyə ötürülən sessiya nömrəsidir. Bu fayla nəzər salın: əgər yuxarıdakı ilk nümunəni işlətmisinizsə, onda faylda belə bir şey olacaq: "value|i:2;". Bu mətn yalnız bir dəyişəni nömrə ilə saxlayan sessiya məzmununun seriyalı təsviridir.

PHP proqramının $_SESSION massivi vasitəsilə seansa daxil etdiyi bütün dəyərlər sessiya saxlanarkən mətnə ​​çevrilir və sonra fayla yazılır. Dəyişən dəyərlərin mətnə ​​çevrilməsi prosesinə "seriyalılaşdırma" deyilir. Beləliklə, siz PHP-nin seriallaşdıra bildiyi istənilən məlumatı sessiyaya yerləşdirə bilərsiniz.

Xoşbəxtlikdən, PHP-də siz təkcə rəqəmlər və sətirlər kimi sadə dəyərləri deyil, həm də massivlər və obyektlər kimi mürəkkəb strukturları seriallaşdıra bilərsiniz:

"; print_r($_SESSION); echo ""; $_SESSION["testArray"] = massiv(1, 2, 3, "bir", "iki", "üç", "uşaq" => massiv(5, 6, 7),); $obj = yeni stdClass(); $obj->x = 1234; $obj->y = 4567; $_SESSION["testObject"] = $obj;

Bu nümunə aşağıdakı məlumatları sessiya faylına yazacaq:

TestArray|a:7:(i:0;i:1;i:1;i:2;i:2;i:3;i:3;s:3:"bir";i:4;s:3 :"iki";i:5;s:5:"üç";s:5:"uşaq";a:3:(i:0;i:5;i:1;i:6;i:2; i:7;))testObject|O:8:"stdClass":2:(s:1:"x";i:1234;s:1:"y";i:4567;)

Obyektlərin sessiyada saxlanması

Gördüyünüz kimi, obyektlər sessiyada saxlanıla bilər. Ancaq eyni zamanda, yadda saxlamalısınız ki, bir növ sizin “evdə hazırlanmış” siniflərinizə aid olan obyektləri və ya siniflərinizin nümunələri olan obyektləri sessiyada saxlayarkən, bu siniflərin bəyannaməsi session_start( çağırmadan əvvəl edilməlidir. ). Yəni, PHP sessiya məlumatlarını sıradan çıxararkən onun qeydinə rast gəlməzdən əvvəl sinfi bilməlidir.

Obyektləri saxlayarkən, obyektin standart serializasiyasının nədənsə qəbuledilməz və ya tamamilə qeyri-mümkün olduğu vəziyyətlər var. Belə hallarda siz sinifdə __sleep() və __wakeup() sehrli üsullarını elan etməklə seriallaşdırmanı əl ilə həyata keçirə bilərsiniz.

Yeri gəlmişkən, seriallaşdırma da “əl ilə” edilə bilər və sessiya məlumatlarını saxlamaq/yükləmək lazım deyil. Tətbiqdəki bəzi məlumatların sonradan istifadə üçün saxlanması və ya şəbəkə üzərindən ötürülməsi lazım olduqda bu tələb oluna bilər. Serializasiya/serializasiya üçün faydalı ola biləcək funksiyalar serialize(), unserialize(), json_encode(), json_decode().

Seansda nə saxlanıla bilməz?

Sessiya seriallaşdırıla bilməyən heç bir şeyi saxlaya bilməz. Belə bir quruma misal olaraq istənilən PHP resursu ola bilər. Resurslar şəbəkə əlaqələri, açıq fayl tutacaqları, verilənlər bazası əlaqələri və bəzi digər obyektlərdir. PHP-də resurs proqramdan birbaşa istifadə olunmayan, lakin müxtəlif PHP funksiyalarını çağırmaqla manipulyasiya edilə bilən PHP-nin bağırsaqlarında olan daxili obyektə istinaddır. Məzmunu seriallaşdırıla bilməyən və edilməməli olan bir növ “qara qutu”.

Əlavə xüsusiyyətlər

PHP tərtibatçıya sessiya məlumatlarını, məsələn, verilənlər bazasında saxlamaq üçün öz üsulunu həyata keçirmək imkanı verir. Bunun üçün daimi saxlama yerindən sessiya məlumatlarını saxlayan və yükləyən funksiyaları həyata keçirmək lazımdır. Sonra funksiyanı çağıraraq PHP-yə bu funksiyalar haqqında məlumat verməlisiniz session_set_save_handler.

Yüksək yüklənmiş saytlarda sessiya məlumatlarının saxlanması və yüklənməsi prosesini sürətləndirmək üçün məlumatları yaddaşda saxlayan Memcached serverindən istifadə etmək olar. Sessiyaların saxlanmasının bu metoduna dəstək PHP-də qurulub və php.ini konfiqurasiya faylı vasitəsilə konfiqurasiya edilir.

Siz seans nömrəsinin ötürüldüyü Cookie parametrinin adını, onun adını, ömrünü, domenini və digər parametrlərini təyin edə bilərsiniz.

PHP-də HTTP sessiyalarının qurulması üçün bu və bir çox başqa variantları session_* funksiyaları vasitəsilə əldə etmək olar.

Əvvəldən hamı PHP-ni təbəssümlə qəbul edirdi, lakin bu dildə kifayət qədər böyük layihələr yaradılmağa başlayan kimi tərtibatçılar yeni problemlə üzləşdilər – PHP-də qlobal dəyişənlər anlayışı yox idi! Yəni müəyyən bir skript icra edildi, yaradılan səhifə müştəriyə göndərildi və bu skriptin istifadə etdiyi bütün resurslar məhv edildi. Mən təsvir etməyə çalışacağam: bir saytın iki səhifəsi olduğunu düşünək, index.php və dothings.php. Bu səhifələr üçün mənbələr belə görünür:

index.php dothings.php

Bu iki skripti işlədirsək, onda birinci səhifədə “I was assigned to index.php” yazısını görəcəyik, ikinci səhifə isə boş olacaq.

Veb sayt tərtibatçıları, iki dəfə düşünmədən, müştəri tərəfində qlobal dəyişənləri saxlamaq üçün kukilərdən istifadə etməyə başladılar. Proses belə görünürdü: istifadəçi saytın əsas səhifəsinə gəlir, bəzi hərəkətlər edir və bu istifadəçi ilə əlaqəli saytın digər səhifələrində lazım ola biləcək bütün məlumatlar onun brauzerində formada saxlanılacaq. peçenye. Bu metodun kifayət qədər ciddi çatışmazlıqları var, buna görə bir çox tərtibatçı bir anda PHP-dən üz çevirdi. Məsələn, istifadəçiyə saytın şəxsi (və ya şəxsi) bölmələrinə daxil olmasına icazə verməliyik. Siz istifadəçiyə saytda onun sonrakı identifikatoru kimi xidmət edəcək kuki göndərməli olacaqsınız. Sayt istifadəçinin davranışı haqqında getdikcə daha çox məlumat toplamağa başlayan kimi bu yanaşma çox çətin və əlverişsiz olur, çünki istifadəçiyə göndərilən bütün məlumatları saxtalaşdırmamaq üçün kodlaşdırmaq məqsədəuyğundur. Bu yaxınlarda, kukiləri saxtalaşdırmaqla, birdən çox söhbəti "sındırmaq" və hətta bəzən başqasının poçtuna girmək mümkün idi. Bundan əlavə, dünyada hələ də brauzeri kukiləri dəstəkləməyən qəribə insanlar var.

Sessiya mexanizminin texnoloji məsələlərinə girməyəcəyəm, ancaq PHP-də seanslarla düzgün işləməyi təsvir edəcəyəm.

Seanslarla necə işləmək olar?

Məqalədəki nümunələri (yaxud skriptlərinizi) hər hansı kommersiya hostinqində sınaqdan keçirsəniz, sessiyalarla işləməkdə heç bir problem olmamalıdır. Əgər serverinizi özünüz quraşdırırsınızsa (həqiqi server və ya emulyator olsun), bu kimi xətalar görünə bilər:

"Xəbərdarlıq: open(/var/state/php/sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) uğursuz oldu: Belə bir fayl və ya kataloq yoxdur (2)."

Bu, sadəcə olaraq, PHP-nin səhv konfiqurasiya edildiyini bildirir. Siz php.ini faylında seansları saxlamaq və serveri yenidən işə salmaq üçün düzgün yolu (mövcud qovluğa) göstərərək bu problemi həll edə bilərsiniz.

Seanslardan dəyişənlərdən (məlumatlardan) istifadə edəcək hər hansı skript aşağıdakı sətirdən ibarət olmalıdır:

Session_start();

Bu əmr serverə verilən səhifənin müəyyən istifadəçi (brauzer) ilə əlaqəli bütün dəyişənlərə ehtiyacı olduğunu bildirir. Server bu dəyişənləri fayldan götürür və onları əlçatan edir. İstifadəçiyə hər hansı məlumat göndərilməzdən əvvəl sessiyanın açılması çox vacibdir; praktikada bu o deməkdir ki, səhifənin ən əvvəlində session_start() funksiyasını çağırmaq məsləhətdir, məsələn:

Session_start(); ?> ... Sessiya fayllarının saxlanacağı qovluğu təyin etmək üçün session_save_path() funksiyasından istifadə edin: session_save_path($_SERVER["DOCUMENT_ROOT"]."/session"); session_start();

Sessiya başladıqdan sonra qlobal dəyişənləri təyin edə bilərsiniz. $_SESSION massivinin hər hansı sahəsinə hər hansı dəyər təyin edilərkən eyni adlı dəyişən avtomatik olaraq sessiya dəyişəni kimi qeydə alınır. Bu massiv sessiyadan istifadə edən bütün səhifələrdə mövcuddur. Məsələn, proqrama baxaq:

index.php Hər şey qaydasındadır. Sessiya yükləndi! Gəlin keçək və orada nə olduğunu görək:

dothings.php

Bu faylları ardıcıl olaraq işlədərkən, ilk "index.php" skripti aşağıdakı nəticəni verəcəkdir:

Hər şey qaydasındadır. Sessiya yükləndi! Gəlin keçək və orada nə olduğunu görək:

İkinci “dothings.php” isə budur:

Məndən index.php ünvanını istədilər

$a dəyişəni indi seansları işə salmış verilmiş saytın bütün səhifələrində mövcuddur.

Seanslarla işləmək üçün digər faydalı xüsusiyyətlər və texnikalar:

  • ayarlanmadı($_SESSION["a"])- sessiya göstərilən seans dəyişəninin dəyərini “unudur”;
  • session_destroy()- sessiya məhv edildi (məsələn, istifadəçi “çıxış” düyməsini basaraq sistemi tərk edərsə);
  • session_set_cookie_params (int ömrü [, string path [, string domain]])- bu funksiyadan istifadə edərək sessiyanın “ölüm” vaxtını təyin edən unix_timestamp təyin etməklə sessiyanın nə qədər “yaşayacağını” təyin edə bilərsiniz. Varsayılan olaraq, seans müştəri brauzer pəncərəsini bağlayana qədər "canlı" olur.
  • session_write_close()- sessiya dəyişənlərinin qeydə alınması və bağlanması. Səhifənin işlənməsi uzun müddət çəkirsə və brauzeriniz üçün sessiyalar faylını bloklayıbsa, bu, saytı yeni pəncərədə açmaq üçün lazımdır.

Nümunələr

İndi isə keçək sessiya mexanizminin praktiki tətbiqinə. Burada kifayət qədər sadə və eyni zamanda faydalı bir neçə nümunəyə baxacağıq.

İstifadəçi Avtorizasiyası

PHP seanslarından istifadə edərək istifadəçinin avtorizasiyası ilə bağlı suallar daim veb proqramlaşdırma konfranslarında verilir. Sistemdəki istifadəçilərə seanslardan istifadə edərək icazə vermə mexanizmi təhlükəsizlik baxımından kifayət qədər yaxşıdır (bölmə bax).

Nümunəmiz üç fayldan ibarət olacaq: index.php, authorize.php və secretplace.php. index.php faylı istifadəçinin öz istifadəçi adı və şifrəsini daxil edəcəyi formadan ibarətdir. Bu forma məlumatları avtorizasiya.php faylına ötürəcək, əgər avtorizasiya uğurlu olarsa, istifadəçiyə secretplace.php faylına daxil olmaq imkanı verəcək və əks halda səhv mesajı göstərəcək.

Nümunələr: index.php Şifrənizi daxil edin

Daxil ol:
Şifrə:


avtorizasiya.php səhifə... başlıq("Yer: gizli yer.php"); çıxış; ) ) // əgər bir şey səhv olarsa, istifadəçi // xəta mesajı alacaq. ?> Siz səhv parol daxil etmisiniz!

gizli yer.php Salam,, gizli səhifədəsiniz!!! :)

Təhlükəsizlik

Beləliklə, biz identifikatoru bir səhifədən digərinə (PHP skripti) ötürə bilirik (saytımızdan növbəti zəngə qədər), bu o deməkdir ki, biz bütün sayt ziyarətçilərini ayırd edə bilərik. Sessiya identifikatoru çox böyük rəqəm (128 bit) olduğundan, onun kobud güclə tapılması şansı praktiki olaraq yoxdur. Beləliklə, təcavüzkarın qarşısında aşağıdakı seçimlər qalır:

  • istifadəçinin kompüterində sessiya nömrələrini oğurlayan troyan var;
  • təcavüzkar istifadəçinin kompüteri ilə server arasında trafikə müdaxilə edir. Əlbəttə ki, qorunan (şifrələnmiş) var SSL protokolu, lakin hər kəs ondan istifadə etmir;
  • Qonşu istifadəçimizin kompüterinə yaxınlaşaraq sessiya nömrəsini oğurladı.

Kiminsə başqasından nəyisə oğurlamasına əsaslanan belə hallar, ümumiyyətlə, proqramçının səlahiyyətinə aid deyil. Administratorlar və istifadəçilər özləri bununla məşğul olmalıdırlar.

Bununla belə, PHP çox vaxt “aldadıla” bilər. İstifadəçinin icazə proqramında mümkün sındırma nöqtələrinə nəzər salaq:

  • authorize.php faylı üçüncü tərəf skriptindən istifadə edərək parolu təxmin etmək cəhdidir;
  • secretplace.php faylı brauzerin ünvan çubuğuna $logged_user dəyişəninin dəyərlərini daxil etməklə proqramı aldatmaq cəhdidir, məsələn:
    "http://www.yoursite.ru/secretplace.php? logged_user=hacker"

Beləliklə, proqramımızda iki "deşik" aydın görünür, biri kiçikdir və xüsusilə nəzərə çarpmır, lakin ikincisi sadəcə nəhəngdir ki, əksər hakerlər getmələri lazım olmayan yerə daxil olurlar.

1 nömrəli dəliyi necə "yamaq" olar?

İP ünvanını bloklamaq üçün tonlarla kod yazmayacağıq və s., sadəcə olaraq sorğunun haradan gəldiyini, daha doğrusu sorğunun hansı səhifədən gəldiyini yoxlayın, əgər saytımızın hər hansı bir səhifəsidirsə, hər şey qaydasındadır, amma bütün digər hallarda sizi içəri buraxmayacağıq. avtorize.php faylını tənzimləyək:

avtorizasiya.php V2 səhifə... başlıq("Yer: gizli yer.php"); çıxış; ))) ?> Siz səhv parol daxil etmisiniz!


2 nömrəli "çuxurdan" necə qurtulmaq olar?

Deyək ki, hər kəsin foruma yazı yazmaq üçün qeydiyyatdan keçə biləcəyi vebsaytınız var. Təbii ki, forumda bəzi istifadəçilərin (inzibatçılar, moderatorlar) digərlərindən daha çox imkanları var, məsələn, onlar digər istifadəçilərin mesajlarını silə bilərlər. Siz istifadəçinin giriş səviyyəsini sessiyada $user_status dəyişənində saxlayırsınız, burada $user_status = 10 sistemə tam girişə uyğundur. Sayta gələn təcavüzkar sadəcə olaraq adi qaydada qeydiyyatdan keçməli və sonra brauzerin ünvan çubuğuna əlavə etməlidir ?user_status=10. Beləliklə, forumunuzda yeni admin var!

Prinsipcə, hər hansı bir skript dəyişəni sadəcə sual işarəsi və skriptə tam ünvandan sonra dəyəri ilə dəyişənin adını əlavə etməklə ünvan çubuğu vasitəsilə təyin edilə bilər. Bunun qarşısını almaq üçün kodumuzu düzəldək:

gizli yer.php V2 dəyişən təyin edilmədi($_SESSION["logged_user"]); // sessiyanı açın session_start(); /* sadəcə olaraq bu səhifəyə keçə bilməzsiniz... əgər istifadəçi adı qeydiyyatdan keçməyibsə, onda login və şifrəni daxil etmək üçün onu index.php səhifəsinə yönləndiririk... burada əslində çox şey edə bilərsiniz, məsələn, istifadəçinin IP-sini xatırlayın və fayllara giriş əldə etmək üçün üçüncü cəhddən sonra onu bloklayın. */ if(!isset($_SESSION["logged_user"]))( header("Yer: index.php"); exit; ) ?> Salam,, gizli səhifədəsiniz!

Nəticələr

Sessiya mexanizmi PHP dilinin olduqca yaxşı xüsusiyyətidir. Sessiyalar sadədir və istifadəsi çox çevikdir. Yeri gəlmişkən, PHP sessiyalarının bir, kiçik sənədləşdirilmiş xüsusiyyəti var (versiya 4.0.3-dən başlayaraq mövcuddur) - sessiyalarda siz təkcə dəyişənləri deyil, həm də obyektləri saxlaya bilərsiniz.

Nümunələr

?>
// Linklərə avtomatik olaraq SID daxil edin. ini_set("session.use_trans_sid", doğru); session_start(); ?> Bura basın!
Bura basın!!



// Seanslarla işləmək nümunəsi. session_start(); // Əgər sayta yeni daxil olmusunuzsa, sayğacı sıfırlayın. əgər (!isset($_SESSION["count"])) $_SESSION["count"] = 0; //Seansda sayğacı artırın. $_SESSION["count"] = $_SESSION["count"] + 1; ?>

Sayğac

vaxt(lar).
Sayğacı sıfırlamaq üçün brauzerinizi bağlayın.
" target="_blank"> Uşaq brauzer pəncərəsini açın.
// Kukilər olmadan sessiyalardan istifadənin sadə nümunəsi. sessiya_adı ("test"); session_start(); $_SESSION["count"] = @$_SESSION["count"] + 1; ?>

Sayğac

Siz bu səhifəni cari brauzer sessiyanızda açdınızvaxt(lar).
Bu sayğacı sıfırlamaq üçün brauzerinizi bağlayın.
?">Səhifəni yeniləmək üçün bura klikləyin!