Menggunakan uid unik dalam sesi php. Menggunakan Sesi - Bekerja dengan Sesi PHP

Kami melihat prinsip bekerja dengan kuki dalam PHP. Tujuan sesi adalah hampir sama - menyimpan beberapa data selepas skrip selesai untuk kegunaan kemudian. Walau bagaimanapun, kedua-dua kaedah ini mempunyai perbezaan yang ketara. Kuki disimpan di bahagian pelanggan dan oleh itu boleh dibaca dengan mudah malah diubah suai oleh pengguna. Katakan terdapat borang kebenaran di tapak web kami. Log masuk sebagai pentadbir akaun pengguna menerima keistimewaan tambahan di tapak, sebagai contoh, akses kepada panel pentadbir. Untuk mengelakkan pengguna daripada perlu memasukkan semula kata laluan selepas setiap peralihan, entah bagaimana perlu mengingati fakta bahawa pengguna ini diberi kuasa dengan hak pentadbiran. Menggunakan kuki, masalah diselesaikan seperti berikut: selepas kebenaran berjaya, kuki tertentu ditetapkan kepada pengguna pentadbir=1. Apabila melayari halaman tapak, kami menyemak sama ada pengguna mempunyai kuki ini. Jika ya, maka pengguna adalah pentadbir. Dari sudut pandangan keselamatan, penyelesaian sedemikian pada asasnya adalah salah, kerana mana-mana pelawat boleh secara bebas menambah kuki pada penyemak imbasnya pentadbir=1 dan secara automatik menjadi pentadbir di tapak anda. Menggunakan sesi, nombor sedemikian tidak akan berfungsi, kerana parameter sesi disimpan di bahagian pelayan web.

Mari lihat cara sesi berfungsi dalam PHP. Untuk memulakan yang baharu atau menyambung semula yang telah dibuat sebelum ini, anda perlu memanggil fungsi PHP session_start(). Fungsi ini mesti dipanggil sebelum kandungan dipaparkan dalam kod. Parameter sesi berada dalam tatasusunan global $_SESSION. Mari lihat contoh:

session_start(); jika ( ! isset ($_SESSION [ "ujian" ] ) ) ( echo "Kami menyimpan makna...
"
; $_SESSION [ "ujian" ] = "Hello, dunia" ; ) echo $_SESSION [ "ujian" ] ;

Apabila skrip dilaksanakan buat kali pertama, sesi baharu akan dibuat menggunakan fungsi tersebut session_start(). Syarat akan dipenuhi, kerana ujian pembolehubah sesi tidak wujud, dan pembolehubah sesi ini akan dibuat. Pada pelaksanaan berikutnya, fungsi session_start() akan menyambung semula sesi yang dibuat sebelum ini, syarat tidak akan dipenuhi, tetapi hanya akan memaparkan nilai pembolehubah ujian.

Apabila mencipta sesi, PHP mencipta fail sementara khas di mana ia menyimpan pembolehubah sesi. Untuk setiap sesi ia dibuat fail berasingan. Untuk menentukan sesi mana kepunyaan klien mana, apabila membuat sesi, kuki jenis berikut ditetapkan kepada klien:

PHPSESSID=

Inilah yang dipanggil ID sesi. Terdapat juga cara untuk lulus ID sesi dalam parameter GET, tetapi kaedah ini Saya rasa ia terlalu ketinggalan zaman. Nama parameter boleh ditukar dalam konfigurasi fail PHP php.ini:

Session.name = PHPSESSID

Secara lalai, sesi dimusnahkan apabila pelanggan menutup penyemak imbas. Tetapi anda juga boleh menetapkan jangka hayat sesi tertentu dalam php.ini (masa ditunjukkan dalam saat):

Session.cookie_lifetime = 0

Dalam skrip, sesi boleh dimusnahkan secara paksa menggunakan fungsi tersebut session_destroy().

Dan akhirnya, mari kita lihat satu lagi contoh. Skrip kecil yang meniru kebenaran pengguna di tapak. Tiada borang untuk memasukkan log masuk dan kata laluan, hanya terdapat dua butang "log masuk" dan "log keluar".

//--Buat baharu atau sambung semula sesi yang dibuat session_start(); //--Prosedur masuk dan keluar if ( isset ($_POST [ "do" ] ) ) ( if ($_POST [ "do" ] == "login") ( $_SESSION [ "login" ] = "yes" ; header ( "lokasi: " . $ _SERVER [ "PHP_SELF" ] ); keluar () ; ) if ( $_POST [ "do" ] == "logout" ) ( session_destroy () ; header ( "lokasi: " . $_SERVER [ "PHP_SELF" ]); () ; ) ) //--Borang kebenaran$login_form = << TAMAT; //--Borang log keluar $logout_form = << TAMAT; //--Jika pengguna diberi kuasa jika ( isset ($_SESSION [ "log masuk" ] ) && $_SESSION [ "log masuk" ] == "ya") ( echo "Selamat datang, pengguna yang dibenarkan!
"
; //--Paparkan borang keluar echo $logout_form ; ) lain ( gema "Selamat datang, tetamu!
"
; //--Paparkan borang keluar echo $login_form ; ) ?>

Menggunakan sesi PHP, pelayan mengenal pasti anda dan membolehkan anda melakukan operasi yang diperlukan: menukar maklumat pada pelbagai halaman web, menambah maklumat baru dan lain-lain. Selepas menyelesaikan kerja di tapak, anda memadamkan sesi semasa dengan mengklik pada butang "Log Keluar":

Apakah sesi PHP?

Sesi PHP ialah cara menyimpan maklumat dalam pembolehubah sesi yang boleh digunakan untuk mengesahkan merentasi berbilang halaman web. Tidak seperti kuki, maklumat sesi tidak disimpan pada komputer pengguna. Sebaliknya, sesi mencipta fail pada pelayan dalam direktori sementara.

Maklumat ini, disimpan sepanjang sesi, tersedia untuk semua halaman web sumber. Pada pelayan, lokasi fail sementara ditentukan oleh parameter session.save_path dalam fail konfigurasi php.ini .

Apabila membuat sesi PHP, tiga langkah berikut dilakukan:

  • Apabila sesi dibuat, PHP menjana pengecam unik yang mewakili rentetan rawak daripada 32 nombor heksadesimal. ID seumur hidup sesi PHP kelihatan seperti ini: 9c8foj87c3jj973actop1re472e8774;
  • Pelayan menghantar kuki yang dipanggil PHPSESSID ke komputer pengguna untuk menyimpan rentetan pengecam sesi yang unik;
  • Pelayan menjana fail dalam direktori sementara yang ditentukan yang mengandungi nama pengecam sesi unik dengan awalan session_g. sess_9c8foj87c3jj973actop1re472e8774.

Tetapan ini membantu Skrip PHP ekstrak nilai pembolehubah sesi daripada fail. Di sisi pelanggan, PHPSESSID mengandungi pengecam sesi. Ia mengesahkan nama fail yang akan dicari dalam direktori khusus pada bahagian pelayan, dari mana pembolehubah sesi boleh diekstrak dan digunakan untuk pengesahan.

Pengguna boleh menamatkan sesi dengan mengklik butang log keluar, yang memanggil fungsi session_destroy(). Apabila pengguna menutup pelayar, sesi PHP ditutup secara automatik. Jika tidak, pelayan akan menamatkan sesi selepas tempoh masa yang ditetapkan.

Sintaks sesi dalam PHP

Apabila PHP memberi kuasa melalui sesi, ia dicipta menggunakan fungsi session_start() dan dipadamkan menggunakan fungsi session_destroy(). Global pembolehubah PHP, dikenali sebagai $_SESSION, digunakan untuk menetapkan nilai pembolehubah sesi. Anda boleh menetapkan semula semua nilai yang ditetapkan untuk pembolehubah sesi menggunakan fungsi session_unset().

Operasi Sesi

Kami akan melihat operasi berikut menggunakan sesi PHP, serta contoh-contohnya.

  • Memulakan sesi PHP dan menetapkan pembolehubah sesinya: sesi PHP baharu dimulakan menggunakan fungsi session_start(). Setelah sesi telah dibuat, pembolehubah sesinya boleh ditetapkan menggunakan $_SESSION. Kami telah menetapkan nilai untuk pembolehubah " ID Pengguna” — “php_user"Dan" kata laluan” — “tutorial”:

Sesi PHP - penciptaan Sesi PHP telah dimulakan dan pembolehubah sesi telah ditetapkan!"; ?>

Keputusan: Menjalankan kod PHP di atas pada pelayan akan menghasilkan mesej berikut:


  • Mendapatkan nilai pembolehubah sesi PHP: Adalah mungkin untuk mendapatkan nilai pembolehubah yang kami tetapkan semasa PHP terkini sesi kebenaran. Apabila kami membuka sesi PHP pada permulaan setiap halaman ( session_start()), kod di bawah mesti dinyatakan. Kami mendapatkan semula dan memaparkan nilai ini menggunakan pembolehubah global $_SESSION:

Sesi PHP - mendapatkan nilai
"; echo "Kata Laluan - " . $_SESSION["kata laluan"] . "."; ?>

Keputusan: Apabila kami menjalankan kod PHP di atas pada pelayan, kami akan mendapat mesej berikut sebagai hasilnya. Nilai pembolehubah sesi yang kami tetapkan lebih awal selepas membuat sesi PHP dipaparkan.


  • Mengemas kini nilai pembolehubah sesi PHP: Semasa sesi, anda boleh mengemas kini nilai pembolehubahnya. Mula-mula kita perlu membuka sesi PHP pada permulaan setiap halaman ( session_start()). Dalam kod di bawah, kami mengemas kini nilai pembolehubah " ID Pengguna” — “new_php_user"Dan" kata laluan” — “pendidikan”.

Anda boleh mencetak tatasusunan pembolehubah sesi dan nilainya menggunakan fungsi print_r($ _SESSION), seperti ditunjukkan di bawah:

Sesi PHP - menukar nilai
"; print_r($_SESSION); ?>

Keputusan: Apabila kami menjalankan kod PHP di atas pada pelayan, kami akan menerima mesej berikut. Ia akan mengandungi pelbagai pembolehubah sesi dengan nilai baharunya:


  • Mengalih keluar sesi PHP dan menetapkan semula semua nilai pembolehubah sesi: Anda boleh menetapkan semula sesi PHP menggunakan fungsi session_unset() dan memadam sesi semasa menggunakan fungsi session_destroy():

Sesi PHP - pemadaman
Sesi PHP dan semua pembolehubah sesi telah berjaya dipadamkan!

"; ?>

Keputusan: Apabila kami menjalankan kod PHP di atas pada pelayan web, ia akan menghasilkan mesej berikut:


Kesimpulan

Dalam artikel ini kita bercakap tentang pelbagai fungsi untuk bekerja dengan sesi PHP dan sintaksnya. Tidak seperti kuki, maklumat sesi disimpan di bahagian pelayan. Ini menjadikan sesi PHP lebih dipercayai.

Salam, masyarakat yang dikasihi.

Pertama sekali, saya ingin mengucapkan terima kasih kepada anda sumber yang berguna. Banyak kali saya jumpa di sini idea yang menarik dan nasihat praktikal.

Tujuan artikel ini adalah untuk menyerlahkan perangkap menggunakan sesi dalam PHP. Sudah tentu, terdapat dokumentasi tentang PHP dan banyak contoh, dan artikel ini tidak berpura-pura begitu panduan lengkap. Ia direka untuk mendedahkan beberapa nuansa bekerja dengan sesi dan melindungi pembangun daripada pembaziran masa yang tidak perlu.

Contoh penggunaan sesi yang paling biasa ialah, sudah tentu, kebenaran pengguna. Mari kita mulakan dengan yang paling banyak pelaksanaan asas untuk mengembangkannya secara konsisten apabila tugas-tugas baru timbul.

(Untuk menjimatkan ruang dan masa, kami akan mengehadkan contoh kami kepada hanya fungsi bekerja dengan sesi itu sendiri, bukannya membina sepenuhnya permohonan ujian dengan hierarki kelas yang cantik, pengendalian ralat yang komprehensif dan perkara baik lain).

Fungsi startSession() ( // Jika sesi telah dimulakan, berhenti melaksanakan dan kembalikan TRUE // (parameter session.auto_start dalam fail tetapan php.ini mesti dilumpuhkan - nilai lalai) jika (session_id()) kembali true; else return session_start(); // Nota: Sebelum versi 5.3.0, fungsi session_start() mengembalikan TRUE walaupun terdapat ralat // Jika anda menggunakan versi lebih awal daripada 5.3.0, lakukan pemeriksaan tambahan untuk session_id() // selepas memanggil fungsi session_start() destroySession() ( if (session_id()) ( // Jika ada sesi aktif, padam kuki sesi, setcookie(session_name(), session_id(), time()-60*60*24); // dan musnahkan session session_unset(); session_destroy(); ) )

Catatan: Ia tersirat bahawa pengetahuan asas Pembaca mengetahui tentang sesi PHP, jadi kami tidak akan merangkumi prinsip operasi bagi fungsi session_start() dan session_destroy() di sini. Tugas susun atur borang log masuk dan pengesahan pengguna tidak berkaitan dengan topik artikel, jadi kami juga akan meninggalkannya. Izinkan saya hanya mengingatkan anda bahawa untuk mengenal pasti pengguna dalam setiap permintaan berikutnya, pada saat log masuk berjaya, kami perlu menyimpan pengecam pengguna dalam pembolehubah sesi (bernama userid, contohnya), yang akan tersedia dalam semua permintaan berikutnya dalam hayat sesi. Ia juga perlu untuk melaksanakan pemprosesan hasil fungsi startSession() kami. Jika fungsi mengembalikan FALSE, paparkan borang log masuk dalam penyemak imbas. Jika fungsi mengembalikan TRUE, dan pembolehubah sesi yang mengandungi pengecam pengguna yang dibenarkan(dalam kes kami - userid), wujud - paparkan halaman pengguna yang dibenarkan (untuk maklumat lanjut tentang pengendalian ralat, lihat tambahan bertarikh 2013-06-07 dalam bahagian pembolehubah sesi).

Setakat ini semuanya jelas. Soalan bermula apabila anda perlu melaksanakan kawalan ketidakhadiran aktiviti pengguna(sesi tamat masa), membolehkan beberapa pengguna bekerja secara serentak dalam satu penyemak imbas, dan juga melindungi sesi daripada penggunaan yang tidak dibenarkan. Ini akan dibincangkan di bawah.

Memantau ketidakaktifan pengguna menggunakan alat PHP terbina dalam

Persoalan pertama yang sering timbul dalam kalangan pembangun semua jenis konsol untuk pengguna ialah penyiapan automatik sesi sekiranya pengguna tidak aktif. Tidak ada yang lebih mudah daripada melakukan ini menggunakan keupayaan terbina dalam PHP. (Pilihan ini tidak boleh dipercayai atau fleksibel, tetapi kami akan mempertimbangkannya untuk kesempurnaan).

Fungsi startSession() ( // Tamat masa tidak aktif pengguna (dalam saat) $sessionLifetime = 300; jika (id_session()) kembali benar; // Tetapkan ini_set seumur hidup kuki("session.cookie_lifetime", $sessionLifetime); // Jika tidak aktif masa tamat pengguna ditentukan, tetapkan seumur hidup sesi pada pelayan // Nota: Untuk pelayan pengeluaran, adalah disyorkan untuk pratetap parameter ini dalam fail php.ini jika ($sessionLifetime) ini_set("session.gc_maxlifetime", $sessionLifetime); jika (session_start()) ( setcookie(session_name(), session_id(), time()+$sessionLifetime); return true; ) else return false; )

Sedikit penjelasan. Seperti yang anda ketahui, PHP menentukan sesi mana yang perlu dilancarkan oleh nama kuki yang dihantar oleh penyemak imbas dalam pengepala permintaan. Penyemak imbas pula menerima kuki ini daripada pelayan, di mana fungsi session_start() meletakkannya. Jika kuki penyemak imbas telah tamat tempoh, ia tidak akan dihantar dalam permintaan, yang bermaksud PHP tidak akan dapat menentukan sesi mana yang hendak dimulakan dan akan menganggap ini sebagai mencipta sesi baharu. Parameter Tetapan PHP session.gc_maxlifetime, yang ditetapkan sama dengan tamat masa ketidakaktifan pengguna kami, menetapkan jangka hayat sesi PHP dan dikawal oleh pelayan. Kawalan sepanjang hayat sesi berfungsi seperti berikut (di sini kami mempertimbangkan contoh storan sesi dalam fail-fail sementara sebagai pilihan yang paling biasa dan lalai dalam PHP).

Apabila sesi baharu dibuat, fail dipanggil sess_ dicipta dalam set direktori sebagai direktori storan sesi dalam parameter tetapan PHP session.save_path , Di mana - pengecam sesi. Seterusnya, dalam setiap permintaan, pada masa melancarkan sesi yang sedia ada, PHP mengemas kini masa pengubahsuaian fail ini. Oleh itu, dalam setiap seterusnya permintaan PHP, dengan perbezaan antara masa semasa dan masa pengubahsuaian terakhir fail sesi, boleh menentukan sama ada sesi itu aktif atau hayatnya telah tamat tempoh. (Mekanisme untuk memadam fail sesi lama dibincangkan dengan lebih terperinci dalam bahagian seterusnya.)

Catatan: Perlu diingatkan di sini bahawa parameter session.gc_maxlifetime digunakan untuk semua sesi dalam satu pelayan (lebih tepat lagi, dalam satu proses PHP). Dalam praktiknya, ini bermakna jika beberapa tapak dijalankan pada pelayan, dan setiap daripadanya mempunyai tamat masa ketidakaktifan pengguna sendiri, maka menetapkan parameter ini pada salah satu tapak akan membawa kepada tetapannya untuk tapak lain. Perkara yang sama berlaku untuk pengehosan kongsi. Untuk mengelakkan situasi ini, direktori sesi berasingan digunakan untuk setiap tapak dalam pelayan yang sama. Menetapkan laluan ke direktori sesi dilakukan menggunakan parameter session.save_path dalam fail tetapan php.ini, atau dengan memanggil fungsi ini_set(). Selepas ini, sesi setiap tapak akan disimpan dalam direktori berasingan dan parameter session.gc_maxlifetime yang ditetapkan pada salah satu tapak hanya akan sah untuk sesinya. Kami tidak akan mempertimbangkan kes ini secara terperinci, terutamanya kerana kami mempunyai pilihan yang lebih fleksibel untuk memantau ketidakaktifan pengguna.

Mengawal ketidakaktifan pengguna menggunakan pembolehubah sesi

Nampaknya, versi terdahulu untuk semua kesederhanaannya (hanya sepasang baris tambahan kod) memberikan semua yang kita perlukan. Tetapi bagaimana jika tidak setiap permintaan boleh dianggap sebagai hasil daripada aktiviti pengguna? Sebagai contoh, halaman mempunyai pemasa yang secara berkala membuat permintaan AJAX untuk menerima kemas kini daripada pelayan. Permintaan sedemikian tidak boleh dianggap sebagai aktiviti pengguna, dan oleh itu pembaharuan automatik seumur hidup sesi tidak betul dalam dalam kes ini. Tetapi kami tahu bahawa PHP mengemas kini masa pengubahsuaian fail sesi secara automatik setiap kali fungsi session_start() dipanggil, yang bermaksud bahawa sebarang permintaan akan membawa kepada lanjutan hayat sesi dan tamat masa ketidakaktifan pengguna tidak akan berlaku. Selain itu, nota terakhir dari bahagian sebelumnya tentang selok-belok parameter session.gc_maxlifetime mungkin kelihatan terlalu mengelirukan dan sukar untuk dilaksanakan bagi sesetengah orang.

Untuk menyelesaikan masalah ini, kami akan meninggalkan penggunaan terbina dalam mekanisme PHP dan memperkenalkan beberapa pembolehubah sesi baharu yang akan membolehkan kami mengawal sendiri masa ketidakaktifan pengguna.

Function startSession($isUserActivity=true) ($sessionLifetime = 300; if (session_id()) return true; // Tetapkan jangka hayat kuki sebelum menutup penyemak imbas (kami akan mengawal segala-galanya di bahagian pelayan) ini_set("session. cookie_lifetime", 0) ; if (! session_start()) return false; $t = time(); if ($sessionLifetime) ( // Jika tamat masa tidak aktif pengguna ditetapkan, // semak masa berlalu aktiviti terakhir pengguna // (masa permintaan terakhir apabila pembolehubah sesi lastactivity dikemas kini) if (isset($_SESSION["lastactivity"]) && $t-$_SESSION["lastactivity"] >= $sessionLifetime) ( // Jika masa berlalu sejak aktiviti terakhir pengguna, / / adalah lebih besar daripada tamat masa tidak aktif, yang bermaksud sesi telah tamat tempoh dan sesi perlu ditamatkan destroySession( else ( // Jika tamat masa belum berlaku, // dan jika permintaan itu datang hasil daripada aktiviti pengguna , // kemas kini pembolehubah lastactivity dengan nilai masa semasa, // dengan itu memanjangkan masa sesi dengan satu lagi saat sessionLifetime jika ($isUserActivity) $_SESSION["lastactivity"] = $t ) ) return true; )

Mari kita ringkaskan. Dalam setiap permintaan, kami menyemak untuk melihat sama ada tamat masa telah dicapai sejak aktiviti terakhir pengguna sehingga detik semasa, dan jika ia dicapai, kami memusnahkan sesi dan mengganggu pelaksanaan fungsi, mengembalikan FALSE. Jika tamat masa tidak dicapai, dan parameter $isUserActivity dihantar ke fungsi dengan BENAR- kemas kini masa aktiviti terakhir pengguna. Apa yang perlu kita lakukan ialah menentukan dalam skrip panggilan sama ada permintaan itu adalah hasil daripada aktiviti pengguna, dan jika tidak, panggil fungsi startSession dengan parameter $isUserActivity ditetapkan kepada FALSE.

Kemas kini dari 2013-06-07
Memproses hasil fungsi sessionStart().

Komen tersebut menunjukkan bahawa mengembalikan FALSE tidak memberikan pemahaman yang lengkap tentang punca ralat, dan ini benar-benar adil. Saya tidak menerbitkan pengendalian ralat terperinci di sini (panjang artikel sudah agak besar), kerana ini tidak berkaitan secara langsung dengan topik artikel. Tetapi memandangkan komen, saya akan menjelaskan.

Seperti yang anda lihat, fungsi sessionStart boleh mengembalikan FALSE dalam dua kes. Atau sesi tidak dapat dimulakan kerana beberapa perkara kesilapan dalaman pelayan (contohnya, tetapan yang salah sesi dalam php.ini), atau seumur hidup sesi telah tamat tempoh. Dalam kes pertama, kami mesti mengubah hala pengguna ke halaman dengan ralat yang menyatakan bahawa terdapat masalah pada pelayan dan borang untuk menghubungi sokongan. Dalam kes kedua, kami mesti memindahkan pengguna ke borang log masuk dan memaparkan mesej yang sepadan di dalamnya yang menyatakan bahawa sesi telah tamat tempoh. Untuk melakukan ini, kita perlu memasukkan kod ralat dan mengembalikan kod yang sepadan dan bukannya FALSE, dan dalam kaedah panggilan, semak dan bertindak sewajarnya.

Kini, walaupun sesi pada pelayan masih wujud, ia akan dimusnahkan pada kali pertama ia diakses jika tamat masa tidak aktif pengguna telah tamat tempoh. Dan ini akan berlaku tanpa mengira jangka hayat sesi yang ditetapkan tetapan global PHP.

Catatan: Apakah yang berlaku jika penyemak imbas ditutup dan kuki nama sesi dimusnahkan secara automatik? Permintaan kepada pelayan pada kali berikutnya penyemak imbas dibuka tidak akan mengandungi kuki sesi, dan pelayan tidak akan dapat membuka sesi dan menyemak tamat masa tidak aktif pengguna. Bagi kami, ini sama dengan mencipta sesi baharu dan tidak menjejaskan fungsi atau keselamatan dalam apa jua cara. Tetapi persoalan yang adil timbul - siapa yang akan memusnahkan sesi lama, jika sehingga kini kita telah memusnahkannya selepas tamat masa tamat? Atau adakah ia kini akan digantung dalam direktori sesi selama-lamanya? Untuk membersihkan sesi lama dalam PHP, terdapat mekanisme yang dipanggil kutipan sampah. Ia berjalan pada masa permintaan seterusnya kepada pelayan dan mengosongkan semua sesi lama berdasarkan tarikh peluang terakhir fail sesi. Tetapi mekanisme pengumpulan sampah tidak bermula dengan setiap permintaan kepada pelayan. Kekerapan (atau lebih tepatnya, kebarangkalian) pelancaran ditentukan oleh dua parameter tetapan session.gc_probability dan session.gc_divisor. Hasil pembahagian parameter pertama dengan yang kedua adalah kebarangkalian melancarkan mekanisme kutipan sampah. Oleh itu, agar mekanisme penjelasan sesi dilancarkan dengan setiap permintaan kepada pelayan, parameter ini mesti ditetapkan kepada nilai yang sama, contohnya "1". Pendekatan ini menjamin direktori sesi yang bersih, tetapi jelas terlalu mahal untuk pelayan. Oleh itu, pada sistem pengeluaran, nilai lalai session.gc_divisor ditetapkan kepada 1000, yang bermaksud mekanisme kutipan sampah akan dijalankan dengan kebarangkalian 1/1000. Jika anda mencuba tetapan ini dalam fail php.ini anda, anda mungkin dapati bahawa dalam kes yang diterangkan di atas, apabila penyemak imbas menutup dan mengosongkan semua kukinya, masih terdapat sesi lama dalam direktori sesi untuk seketika. Tetapi ini tidak perlu membimbangkan anda, kerana... seperti yang telah dinyatakan, ini tidak sama sekali menjejaskan keselamatan mekanisme kami.

Kemas kini dari 2013-06-07

Menghalang skrip daripada membeku kerana penguncian fail sesi

Komen tersebut membangkitkan isu pembekuan skrip yang dijalankan secara serentak kerana fail sesi disekat (pilihan yang paling menarik ialah tinjauan panjang).

Sebagai permulaan, saya perhatikan bahawa masalah ini tidak secara langsung bergantung pada beban pelayan atau bilangan pengguna. Sudah tentu daripada lebih banyak permintaan, semakin perlahan skrip berjalan. Tetapi ini adalah pergantungan tidak langsung. Masalah muncul hanya dalam satu sesi, apabila pelayan menerima beberapa permintaan bagi pihak seorang pengguna (contohnya, salah satunya ialah tinjauan panjang dan selebihnya adalah permintaan biasa). Setiap permintaan cuba mengakses fail sesi yang sama, dan jika permintaan sebelumnya tidak membuka kunci fail, maka permintaan yang berikutnya akan menunggu.

Untuk memastikan fail sesi terkunci pada tahap minimum, adalah amat disyorkan untuk menutup sesi dengan memanggil fungsi session_write_close() serta-merta selepas semua tindakan dengan pembolehubah sesi telah selesai. Dalam amalan, ini bermakna anda tidak seharusnya menyimpan segala-galanya dalam pembolehubah sesi dan mengaksesnya sepanjang pelaksanaan skrip. Dan jika anda perlu menyimpan beberapa data yang berfungsi dalam pembolehubah sesi, kemudian bacanya dengan segera apabila sesi bermula, simpannya dalam pembolehubah tempatan untuk kegunaan kemudian dan tutup sesi (bermaksud menutup sesi menggunakan fungsi session_write_close, dan tidak memusnahkannya menggunakan session_destroy ).

Dalam contoh kami, ini bermakna sejurus selepas membuka sesi, menyemak hayatnya dan kewujudan pengguna yang dibenarkan, kami mesti membaca dan menyimpan semua tambahan dikehendaki oleh permohonan itu pembolehubah sesi (jika ada), kemudian tutup sesi menggunakan panggilan ke session_write_close() dan teruskan melaksanakan skrip, sama ada tinjauan panjang atau permintaan biasa.

Melindungi sesi daripada penggunaan yang tidak dibenarkan

Cuba kita bayangkan keadaannya. Salah seorang pengguna anda mendapat Trojan yang merompak kuki penyemak imbas (di mana sesi kami disimpan) dan menghantarnya ke e-mel yang ditentukan. Penyerang memperoleh kuki dan menggunakannya untuk menipu permintaan bagi pihak pengguna kami yang dibenarkan. Pelayan berjaya menerima dan memproses permintaan ini seolah-olah ia datang daripada pengguna yang dibenarkan. Jika tidak dilaksanakan pengesahan tambahan Alamat IP, serangan sedemikian akan membawa kepada kejayaan penggodaman akaun pengguna dengan semua akibat yang berikutnya.

Mengapa ini boleh berlaku? Jelas sekali, kerana nama dan pengecam sesi sentiasa sama untuk sepanjang hayat sesi, dan jika anda menerima data ini, anda boleh menghantar permintaan dengan mudah bagi pihak pengguna lain (sudah tentu, sepanjang hayat sesi ini). Ini mungkin bukan jenis serangan yang paling biasa, tetapi secara teorinya ia kelihatan agak boleh dilaksanakan, terutamanya memandangkan Trojan sedemikian tidak memerlukan hak pentadbir untuk merompak kuki penyemak imbas pengguna.

Bagaimanakah anda boleh melindungi diri anda daripada serangan seperti ini? Sekali lagi, jelas sekali, dengan mengehadkan hayat pengecam sesi dan menukar pengecam secara berkala dalam sesi yang sama. Kami juga boleh menukar nama sesi dengan memadam sepenuhnya yang lama dan mencipta sesi baharu, menyalin semua pembolehubah sesi daripada yang lama ke dalamnya. Tetapi ini tidak menjejaskan intipati pendekatan, jadi untuk kesederhanaan kami akan mengehadkan diri kami kepada hanya pengecam sesi.

Jelas sekali bahawa semakin pendek jangka hayat ID sesi, semakin sedikit masa yang diperlukan oleh penyerang untuk mendapatkan dan menggunakan kuki untuk memalsukan permintaan pengguna. Sebaik-baiknya, pengecam baharu harus digunakan untuk setiap permintaan, yang akan meminimumkan kemungkinan menggunakan sesi orang lain. Tetapi kami akan mempertimbangkan kes umum apabila masa penjanaan semula pengecam sesi ditetapkan sewenang-wenangnya.

(Kami akan meninggalkan bahagian kod yang telah dibincangkan).

Function startSession($isUserActivity=true) ( ​​​​ // Session identifier lifetime $idLifetime = 60; ... if ($idLifetime) ( // Jika seumur hidup pengecam sesi ditetapkan, // semak masa berlalu sejak sesi itu dicipta atau penjanaan semula terakhir // (masa permintaan terakhir apabila masa mula pembolehubah sesi dikemas kini) jika (isset($_SESSION["masa mula"])) ( jika ($t-$_SESSION["masa mula"] >= $ idLifetime) ( // Jangka hayat pengecam sesi masa telah tamat // Jana pengecam baharu session_regenerate_id(true); $_SESSION["starttime"] = $t) ) else ( // Kita sampai di sini jika sesi baru dibuat // Tetapkan masa penjanaan pengecam sesi kepada masa semasa$_SESSION["starttime"] = $t; ) ) kembalikan benar; )

Jadi, apabila mencipta sesi baharu (yang berlaku apabila pengguna berjaya log masuk), kami menetapkan masa mula pembolehubah sesi, yang menyimpan untuk kami masa generasi terakhir pengecam sesi, kepada nilai yang sama dengan masa pelayan semasa. Seterusnya, dalam setiap permintaan, kami menyemak sama ada masa yang mencukupi (idLifetime) telah berlalu sejak generasi terakhir pengecam, dan jika ya, kami menjana yang baharu. Oleh itu, jika dalam tempoh hayat pengecam yang ditetapkan, penyerang yang menerima kuki pengguna yang dibenarkan tidak mempunyai masa untuk menggunakannya, permintaan palsu akan dianggap oleh pelayan sebagai tidak dibenarkan, dan penyerang akan dibawa ke halaman log masuk .

Catatan: ID sesi baharu masuk ke dalam kuki penyemak imbas apabila fungsi session_regenerate_id() dipanggil, yang menghantar kuki baharu, serupa dengan fungsi session_start(), jadi kami tidak perlu mengemas kini kuki itu sendiri.

Jika kami ingin menjadikan sesi kami seaman mungkin, sudah cukup untuk menetapkan jangka hayat pengecam kepada satu atau malah mengalih keluar fungsi session_regenerate_id() daripada kurungan dan mengalih keluar semua semakan, yang akan membawa kepada penjanaan semula pengecam dalam setiap permintaan. (Saya belum menguji kesan pendekatan ini pada prestasi, dan saya hanya boleh mengatakan bahawa fungsi session_regenerate_id(true) pada asasnya hanya melaksanakan 4 tindakan: menjana pengecam baharu, mencipta pengepala dengan kuki sesi, memadam yang lama dan mencipta fail sesi baharu).

Penyimpangan lirik: Jika Trojan ternyata sangat pintar sehingga ia tidak akan menghantar kuki kepada penyerang, tetapi mengatur penghantaran permintaan palsu yang telah disediakan dengan segera selepas menerima kuki, kaedah yang diterangkan di atas kemungkinan besar tidak akan dapat melindungi daripada itu. serangan, kerana antara masa Trojan menerima kuki dan penghantaran permintaan palsu hampir tidak ada perbezaan, dan terdapat kebarangkalian tinggi bahawa pada masa ini pengecam sesi tidak akan dijana semula.

Kemungkinan kerja serentak dalam satu pelayar bagi pihak beberapa pengguna

Tugas terakhir yang saya ingin pertimbangkan ialah keupayaan untuk beberapa pengguna untuk bekerja secara serentak dalam satu pelayar. Ciri ini amat berguna semasa fasa ujian apabila anda perlu meniru kerja serentak pengguna, dan adalah dinasihatkan untuk melakukan ini dalam penyemak imbas kegemaran anda, dan tidak menggunakan keseluruhan senjata yang tersedia atau membuka beberapa contoh penyemak imbas dalam mod inkognito.

Dalam contoh terdahulu kami, kami tidak menyatakan nama sesi secara eksplisit, jadi nama PHP lalai (PHPSESSID) telah digunakan. Ini bermakna semua sesi yang kami buat setakat ini telah menghantar kuki ke penyemak imbas di bawah nama PHPSESSID. Jelas sekali, jika nama kuki sentiasa sama, maka tidak ada cara untuk mengatur dua sesi dengan nama yang sama dalam penyemak imbas yang sama. Tetapi jika kami menggunakan nama sesi kami sendiri untuk setiap pengguna, masalah itu akan diselesaikan. Jom buat.

Function startSession($isUserActivity=true, $prefix=null) ( ... if (session_id()) return true; // Jika awalan pengguna diluluskan dalam parameter, // tetapkan nama sesi unik yang merangkumi ini awalan, // sebaliknya tetapkan nama biasa untuk semua pengguna (contohnya, MYPROJECT) session_name("MYPROJECT".($prefix ? "_".$prefix: "")); ini_set("session.cookie_lifetime", 0); jika (! session_start()) return false;

Sekarang yang tinggal hanyalah untuk memastikan bahawa skrip panggilan melepasi awalan unik untuk setiap pengguna ke fungsi startSession(). Ini boleh dilakukan, sebagai contoh, dengan menghantar awalan dalam parameter GET/POST bagi setiap permintaan atau melalui kuki tambahan.

Kesimpulan

Kesimpulannya, saya akan menyediakan kod akhir lengkap fungsi kami untuk bekerja dengan sesi PHP, termasuk semua tugas yang dibincangkan di atas.

Fungsi startSession($isUserActivity=true, $prefix=null) ( $sessionLifetime = 300; $idLifetime = 60; if (session_id()) return true; session_name("MYPROJECT".($prefix ? "_".$prefix: "")); ini_set("session.cookie_lifetime", 0); jika (! session_start()) return false; $t = time(); $t-$_SESSION["lastactivity"] >= $sessionLifetime) ( destroySession(); return false; ) else ( if ($isUserActivity) $_SESSION["lastactivity"] = $t; ) ) if ($idLifetime ) ( if (isset($_SESSION["starttime"])) ( if ($t-$_SESSION["starttime"] >= $idLifetime) ( session_regenerate_id(true); $_SESSION["starttime"] = $t; ) ) else ( $_SESSION["starttime"] = $t; ) ) return true; function destroySession() ( if (session_id()) ( session_unset(); setcookie(session_name(), session_id(), time() -60* 60*24);

Saya harap artikel ini akan menjimatkan sedikit masa bagi mereka yang tidak pernah mendalami mekanisme sesi, dan memberikan gambaran yang cukup tentang mekanisme ini untuk mereka yang baru mula berjinak-jinak dengan PHP.

Sejak awal lagi, PHP diterima dengan hebat, tetapi sebaik sahaja projek yang agak besar mula dibuat dalam bahasa ini, pembangun berhadapan dengan masalah baru- PHP tidak mempunyai konsep pembolehubah global! Iaitu, skrip tertentu telah dilaksanakan, menghantar halaman yang dijana kepada klien, dan semua sumber yang digunakan oleh skrip ini telah dimusnahkan. Saya akan cuba menggambarkan: andaikan terdapat dua halaman pada satu tapak, index.php dan dothings.php. Sumber untuk halaman ini kelihatan seperti ini:

index.php dothings.php

Jika kita menjalankan dua skrip ini, maka pada halaman pertama kita akan melihat tulisan "Saya telah ditugaskan untuk index.php", dan halaman kedua akan kosong.

Pembangun laman web, tanpa berfikir dua kali, mula menggunakan kuki untuk menyimpan pembolehubah global di sisi pelanggan. Prosesnya kelihatan seperti ini: pengguna datang ke halaman utama tapak, melakukan beberapa tindakan, dan semua maklumat yang berkaitan dengan pengguna ini, yang mungkin diperlukan pada halaman lain tapak, akan disimpan dalam pelayarnya dalam bentuk daripada cookies. Kaedah ini mempunyai kelemahan yang agak serius, kerana itu banyak pembangun pada satu masa berpaling daripada PHP. Sebagai contoh, kami perlu memberi kebenaran kepada pengguna untuk membenarkannya mengakses bahagian peribadi (atau peribadi) tapak tersebut. Anda perlu menghantar kuki kepada pengguna, yang akan berfungsi sebagai pengecam seterusnya di tapak. Pendekatan ini menjadi sangat menyusahkan dan menyusahkan sebaik sahaja tapak mula mengumpul lebih banyak maklumat tentang tingkah laku pengguna, kerana adalah dinasihatkan untuk mengekod semua maklumat yang dihantar kepada pengguna supaya ia tidak boleh dipalsukan. Baru-baru ini, dengan memalsukan kuki, adalah mungkin untuk "memecahkan" lebih daripada satu sembang, dan kadangkala menyelinap ke dalam mel orang lain. Di samping itu, masih terdapat orang aneh di dunia yang pelayarnya tidak menyokong kuki.

Saya tidak akan membincangkan isu teknologi mekanisme sesi, tetapi hanya akan menerangkan cara bekerja dengan betul dengan sesi dalam PHP.

Bagaimana untuk bekerja dengan sesi?

Jika anda menguji contoh daripada artikel (atau skrip anda) pada mana-mana pengehosan komersil, seharusnya tiada masalah dengan mengendalikan sesi. Jika anda menyediakan pelayan anda sendiri (sama ada pelayan sebenar atau emulator), ralat dengan sesuatu seperti ini mungkin muncul:

"Amaran: buka(/var/state/php/sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) gagal: Tiada fail atau direktori (2) sedemikian."

Ini hanya bermakna bahawa PHP anda dikonfigurasikan secara tidak betul. Anda boleh menyelesaikan masalah ini dengan menentukan laluan yang betul (ke direktori sedia ada) untuk menyimpan sesi dalam fail php.ini dan memulakan semula pelayan.

Sebarang skrip yang akan menggunakan pembolehubah (data) daripada sesi mesti mengandungi baris berikut:

Session_start();

Perintah ini memberitahu pelayan bahawa halaman tertentu memerlukan semua pembolehubah yang dikaitkan dengan pengguna tertentu (pelayar). Pelayan mengambil pembolehubah ini daripada fail dan menjadikannya tersedia. Adalah sangat penting untuk membuka sesi sebelum sebarang data dihantar kepada pengguna; dalam amalan, ini bermakna bahawa adalah dinasihatkan untuk memanggil fungsi session_start() pada bahagian paling awal halaman, contohnya seperti ini:

Session_start(); ?> ... Untuk menetapkan direktori di mana fail sesi akan disimpan, gunakan fungsi session_save_path() : session_save_path($_SERVER["DOCUMENT_ROOT"]."/session"); session_start();

Selepas sesi bermula, anda boleh menetapkan pembolehubah global. Apabila memberikan sebarang nilai kepada mana-mana medan tatasusunan $_SESSION, pembolehubah dengan nama yang sama didaftarkan secara automatik sebagai pembolehubah sesi. Tatasusunan ini tersedia pada semua halaman menggunakan sesi. Sebagai contoh, mari kita lihat program:

index.php Semuanya baik. Sesi telah dimuatkan! Mari kita lihat dan lihat apa yang ada:

dothings.php

Apabila menjalankan fail ini secara berurutan, skrip pertama "index.php" akan menghasilkan hasil berikut:

Semuanya baik. Sesi telah dimuatkan! Mari kita lihat dan lihat apa yang ada:

Dan "dothings.php" kedua ialah ini:

Saya diminta untuk index.php

Pembolehubah $a kini tersedia pada semua halaman tapak tertentu yang telah melancarkan sesi.

Lain-lain ciri yang berguna dan teknik untuk bekerja dengan sesi:

  • tidak ditetapkan($_SESSION["a"])- sesi "melupakan" nilai pembolehubah sesi yang ditentukan;
  • session_destroy()- sesi dimusnahkan (contohnya, jika pengguna meninggalkan sistem dengan mengklik butang "log keluar");
  • session_set_cookie_params (int lifetime [, string path [, string domain]])- menggunakan fungsi ini anda boleh menetapkan berapa lama sesi akan "hidup" dengan menetapkan unix_timestamp, yang menentukan masa "kematian" sesi. Secara lalai, sesi "langsung" sehingga klien menutup tetingkap penyemak imbas.
  • session_write_close()- pembolehubah sesi rakaman dan menutupnya. Ini adalah perlu untuk membuka tapak dalam tetingkap baharu jika halaman mengambil masa yang lama untuk diproses dan telah menyekat fail sesi untuk penyemak imbas anda.

Contoh

Sekarang mari kita beralih kepada permohonan praktikal mekanisme sesi. Di sini kita akan melihat beberapa contoh yang agak mudah dan pada masa yang sama berguna.

Kebenaran Pengguna

Soalan tentang kebenaran pengguna menggunakan sesi PHP sentiasa ditanya pada persidangan pengaturcaraan web. Mekanisme untuk membenarkan pengguna dalam sistem menggunakan sesi adalah agak baik dari sudut keselamatan (lihat bahagian).

Contoh kami akan terdiri daripada tiga fail: index.php, authorize.php dan secretplace.php. Fail index.php mengandungi borang di mana pengguna akan memasukkan nama pengguna dan kata laluannya. Borang ini akan menghantar data ke fail authorize.php, yang, jika kebenaran berjaya, akan membenarkan pengguna mengakses fail secretplace.php, dan sebaliknya akan memaparkan mesej ralat.

Contoh: index.php Masukkan kata laluan anda

Log masuk:
kata laluan:


membenarkan.php page... header("Lokasi: secretplace.php"); keluar; ) ) // jika ada yang salah, pengguna akan menerima // mesej ralat. ?> Anda memasukkan kata laluan yang salah!

secretplace.php helo,, anda berada di halaman rahsia!!! :)

Keselamatan

Jadi, kami dapat menghantar pengecam dari satu halaman (skrip PHP) ke yang lain (sehingga panggilan seterusnya dari tapak kami), yang bermaksud kami boleh membezakan antara semua pelawat tapak. Oleh kerana pengecam sesi adalah sangat nombor besar(128 bit), hampir tidak ada kemungkinan ia boleh ditemui dengan kekerasan. Oleh itu, penyerang dibiarkan dengan pilihan berikut:

  • terdapat Trojan pada komputer pengguna yang mencuri nombor sesi;
  • penyerang memintas lalu lintas antara komputer pengguna dan pelayan. Sudah tentu ada yang dilindungi (disulitkan) protokol SSL, tetapi tidak semua orang menggunakannya;
  • Seorang jiran menghampiri komputer pengguna kami dan mencuri nombor sesi.

Situasi sedemikian, berdasarkan fakta bahawa seseorang mencuri sesuatu daripada orang lain, secara amnya, tidak berada dalam kecekapan pengaturcara. Pentadbir dan pengguna sendiri harus menjaga perkara ini.

Walau bagaimanapun, PHP selalunya boleh "ditipu". Mari lihat kemungkinan titik penggodaman dalam program kebenaran pengguna:

  • Fail authorize.php ialah percubaan untuk meneka kata laluan menggunakan skrip pihak ketiga;
  • Fail secretplace.php ialah percubaan untuk menipu program dengan memasukkan nilai pembolehubah $logged_user dalam bar alamat penyemak imbas, contohnya seperti ini:
    "http://www.yoursite.ru/secretplace.php? log_user=penggodam"

Jadi, dua "lubang" jelas kelihatan dalam program kami, satu kecil dan tidak begitu ketara, tetapi yang kedua adalah besar, di mana kebanyakan penggodam masuk ke tempat yang mereka tidak perlu pergi.

Bagaimana untuk "menampal" lubang nombor 1?

Kami tidak akan menulis banyak kod untuk menyekat alamat IP, dsb., tetapi hanya semak dari mana permintaan itu datang, atau lebih tepatnya halaman dari mana permintaan itu datang, jika ia adalah mana-mana halaman dari tapak kami, maka semuanya baik-baik saja, tetapi dalam semua kes lain Kami tidak akan membenarkan anda masuk. Mari laraskan fail authorize.php:

membenarkan.php V2 page... header("Lokasi: secretplace.php"); keluar; ) ) ) ?> Anda memasukkan kata laluan yang salah!


Bagaimana untuk menghilangkan "lubang" nombor 2?

Katakan anda mempunyai tapak web di mana semua orang boleh mendaftar untuk menyiarkan ke forum. Sememangnya, dalam forum beberapa pengguna (pentadbir, moderator) mempunyai lebih banyak peluang daripada yang lain sebagai contoh, mereka boleh memadamkan mesej daripada pengguna lain. Anda menyimpan tahap akses pengguna dalam sesi, dalam pembolehubah $user_status, di mana $user_status = 10 sepadan akses penuh kepada sistem. Penyerang yang datang ke tapak hanya perlu mendaftar dengan cara biasa, dan kemudian menambah dalam bar alamat penyemak imbas ?status_pengguna=10. Jadi saya mula di forum anda admin baru!

Pada dasarnya, sebarang pembolehubah skrip boleh ditetapkan melalui bar alamat, hanya menambah selepas alamat penuh kepada skrip tanda soal dan nama pembolehubah dengan nilainya. Mari kita betulkan kod kita untuk mengelakkan ini:

secretplace.php V2 pembolehubah tidak ditetapkan($_SESSION["pengguna_logi"]); // buka sesi session_start(); /* anda tidak boleh pergi ke halaman ini sahaja... jika nama pengguna tidak didaftarkan, maka kami redirect dia ke halaman index.php untuk memasukkan log masuk dan kata laluan... di sini anda sebenarnya boleh melakukan banyak perkara, sebagai contoh, ingat IP pengguna, dan selepas percubaan ketiga untuk mendapatkan akses kepada fail, sekatnya. */ if(!isset($_SESSION["log_user"]))( header("Lokasi: index.php"); keluar; ) ?> helo,, anda berada di halaman rahsia!

Keputusan

Mekanisme sesi adalah ciri yang cukup kemas bahasa PHP. Sesi adalah mudah dan sangat fleksibel untuk digunakan. By the way, ada satu, kemungkinan kecil yang didokumenkan sesi PHP(tersedia bermula dari versi 4.0.3) - sesi boleh menyimpan bukan sahaja pembolehubah, tetapi juga objek.

Contoh

Sisipan automatik SID dalam borang. ini_set("session.use_trans_sid", true); session_start(); ?>
?>
// Masukkan SID secara automatik ke dalam pautan. ini_set("session.use_trans_sid", true); session_start(); ?> Tekan di sini!
Tekan di sini!!



// Contoh bekerja dengan sesi. session_start(); // Jika anda baru melawat tapak, tetapkan semula kaunter. jika (!isset($_SESSION["count"])) $_SESSION["count"] = 0; //Tingkatkan kaunter dalam sesi. $_SESSION["count"] = $_SESSION["count"] + 1; ?>

Kaunter

masa (s).
Tutup penyemak imbas anda untuk menetapkan semula kaunter.
" target="_blank"> Buka tetingkap penyemak imbas kanak-kanak.
// Contoh mudah menggunakan sesi tanpa Kuki. session_name("ujian"); session_start(); $_SESSION["count"] = @$_SESSION["count"] + 1; ?>

Kaunter

Anda telah membuka halaman ini dalam sesi penyemak imbas semasa andamasa (s).
Tutup penyemak imbas anda untuk menetapkan semula kaunter ini.
?">Klik di sini untuk memuat semula halaman!

Sesi membolehkan anda mewujudkan sambungan antara pelawat dan tapak yang menggunakan ID sesi.

Pembolehubah sesi dan nilainya disimpan hanya pada pelayan. Hanya pengecam sesi (dijana secara rawak) disimpan pada komputer pengguna dan pelayan, yang membolehkan kami mewujudkan sambungan antara pengguna dan pelayan.

ID sesi yang disimpan pada komputer pengguna ialah kuki.

Kuki disimpan dalam penyemak imbas pengguna, dan fail yang sepadan juga dibuat pada pelayan.

Buat sesi

Cara paling mudah untuk membuka sesi ialah menggunakan fungsi session_start:

// memulakan sesi session_start();

Fungsi ini menyemak sama ada ID sesi wujud dan, jika tidak, mencipta satu. Jika ID sesi semasa sudah wujud, maka pembolehubah sesi berdaftar dimuatkan.

Binaan ini (mesti dipanggil sekali untuk setiap halaman) mesti dipanggil sebelum sebarang kesimpulan(peraturan ini juga berfungsi untuk setcookie()), termasuk ruang.

Apabila sesi dibuat, kuki berikut dihantar ke penyemak imbas:

PHP

echo "Nama sesi: ".session_name(). " ID Sesi: ".session_id(); // Nama sesi: PHPSESSID ID Sesi: mceu820l02id3ds0vcvtgnht04

Buat pembolehubah sesi

Pembolehubah sesi dibuat dengan menambahkan nilai pada tatasusunan superglobal $_SESSION:

$_SESSION["nick"] = $_POST["nama"];

Memusnahkan pembolehubah sesi dan sesi itu sendiri

1 . Anda boleh memadam pembolehubah sesi seperti berikut:

Unset($_SESSION["nick"]);

Ini akan menghalang penggunaan semula maklumat.

Tetapi lebih baik hanya mengosongkan tatasusunan $_SESSION (alih keluar semua pembolehubah sesi):

//kosongkan tatasusunan $_SESSION $_SESSION = array();

2. Anda juga perlu melakukan perkara berikut:

Tetapkan kuki sesi tidak sah:

Jika (isset($_COOKIE)) ( // session_name() - dapatkan nama sesi semasa setcookie(session_name(), "", time()-86400, "/"); )

Nama sesi merujuk kepada id sesi dalam kuki dan URL

3. Musnahkan (tamat) sesi

Session_destroy();

Penimbalan Output

Jika anda sudah mempunyai beberapa output, anda boleh menggunakan fungsi ob_start(). Fungsi ini menampan output. Sekarang output tidak akan dihantar ke penyemak imbas melainkan anda memaksanya menggunakan fungsi ob_end_flush().

"; unset($_SESSION["nick"]); if (isset($_COOKIE)) ( setcookie(session_name(), "", time()-86400, "/"); // kandungan sesi - rentetan kosong ) // setcookie akan berfungsi tanpa ralat, kerana kami baru sahaja ob_end_flush(); // menghantar output ke pelayar session_destroy();

Sebaliknya, ia tidak semestinya perlu menggunakan fungsi ob_end_flush() kerana penterjemah PHP akan secara automatik mengepam penimbal apabila skrip dijalankan.

Mencipta semula pengecam sesi

Untuk tujuan keselamatan, setiap kali anda log masuk ke sistem, anda mesti mencipta semula ID sesi. Maklumat dalam pembolehubah sesi dikekalkan, hanya pengecam sesi berubah. Jangan lupa, maklumat sesi disimpan pada pelayan web sebagai teks dalam fail yang sepadan. Untuk menjana semula id, panggil session_regenerate_id() dan muat semula halaman semasa atau ubah hala pengguna ke halaman lain.

Mekanisme sesi


Mengurangkan hayat sesi

Secara lalai, hayat sesi ialah 0, yang bermaksud bahawa apabila pengguna menutup tetingkap penyemak imbas, sesi itu dimusnahkan. Kadang-kadang perlu untuk menamatkan sesi pengguna kerana ketidakaktifan di pihaknya. Ini boleh dilaksanakan dengan cara berikut (mari lihat contoh kebenaran): kami mencipta pembolehubah dan menyimpan masa kebenaran pengguna di dalamnya; jika kami cuba memuat semula halaman, kami membandingkan masa dengan masa tidak aktif dan, jika melebihi, kami log keluar pengguna dan ubah hala pengguna ke halaman kebenaran.

$_SESSION["start"] = masa(); // cap waktu kebenaran pengguna $now = time(); // masa semasa $time_limit = 1000; // masa maksimum yang dibenarkan untuk ketidakaktifan pengguna dalam beberapa saat. jika ($sekarang > $_SESSION["mula"] + $time_limit) ( echo "Masa anda telah tamat tempoh"; //....... // dan padamkan sesi dan kukinya) lain ( $_SESSION[" mula" ] = masa(); ) // jika ada pesanan, kemas kini

Bagaimana untuk menjadikan sesi sepanjang hayat kekal?

Agar pelanggan sentiasa kekal log masuk, tidak perlu menetapkan seumur hidup sesi untuk kekal. Sesi ialah sesi: ia bermula apabila klien tiba dan berakhir apabila klien keluar.

Apabila pelanggan datang semula, anda perlu memulakan sesi baharu, tetapi muatkan data tentang klien ke dalamnya, berdasarkan kuki unik kepada klien, yang dipasang secara kekal untuknya apabila dia memilih kotak semak, sebagai contoh, “ingat saya ”.

Bekerja dengan sesi apabila kuki dilumpuhkan

Jika tetapan session.use_trans_sid ditetapkan kepada 1, maka apabila kuki dilumpuhkan, PHP akan menghantar PHPSESSID menggunakan kaedah GET dalam baris permintaan.