Teknologi halaman web dinamis Analisis PHP pada cookie dan sesi
Penulis:Eve Cole
Waktu Pembaruan:2009-06-06 18:16:01
1. kue PHP
Cookie adalah mekanisme yang menyimpan data pada browser jarak jauh untuk melacak dan mengidentifikasi pengguna.
PHP mengirimkan cookie dalam informasi header protokol http, sehingga fungsi setcookie() harus dipanggil sebelum informasi lain dikeluarkan ke browser, yang mirip dengan pembatasan fungsi header().
1.1 Setel cookie:
Cookie dapat diatur menggunakan fungsi setcookie() atau setrawcookie(). Hal ini juga dapat diatur dengan mengirimkan header http langsung ke klien.
1.1.1 Gunakan fungsi setcookie() untuk menyetel cookie:
bool setcookie ( nama string [, nilai string [, int kadaluarsa [, jalur string [, domain string [, bool secure [, bool httponly]]]]]] )
nama: nama variabel cookie
value: nilai variabel cookie
kadaluwarsa: waktu berakhirnya masa berlaku,
jalur: direktori yang valid,
domain: nama domain yang valid, domain tingkat atas yang unik
aman: Jika nilainya 1, cookie hanya valid pada koneksi https, jika nilai defaultnya 0, http dan https keduanya valid.
contoh:
<?php
$value = 'sesuatu dari suatu tempat';
setcookie("TestCookie", $value); /* Pengaturan cookie sederhana*/
setcookie("TestCookie", $value, time()+3600); /* Masa berlaku adalah 1 jam*/
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* Direktori valid/~rasmus, nama domain valid example.com dan semua subdomainnya */
?>
Tetapkan beberapa variabel cookie: setcookie('var[a]','value'); Gunakan array untuk mewakili variabel, tetapi subskripnya tidak memerlukan tanda kutip. 'a'] untuk membaca variabel COOKIE.
1.1.2. Gunakan header() untuk menyetel cookie;
header("Set-Cookie: nama=$nilai[;path=$path[;domain=xxx.com[;...]]");
Parameter berikut ini sama dengan yang tercantum di atas untuk fungsi setcookie.
Misalnya:
$value = 'sesuatu dari suatu tempat';
header("Set-Cookie:nama=$nilai");
1.2 Membaca Cookie:
Anda dapat langsung menggunakan variabel super global bawaan PHP $_COOKIE untuk membaca cookie di sisi browser.
Pada contoh di atas, cookie "TestCookie" telah disetel.
cetak $_COOKIE['TestCookie'];
Apakah COOKIE-nya sudah diekspor?!
1.3 Hapus cookie
Cukup atur waktu yang valid menjadi kurang dari waktu saat ini, dan atur nilainya menjadi kosong.
setcookie("nama","",waktu()-1);
Mirip dengan menggunakan header().
1.4 Memecahkan masalah umum:
1) Ada pesan kesalahan saat menggunakan setcookie(). Mungkin karena ada keluaran atau spasi sebelum memanggil setcookie(). Mungkin juga dokumen Anda dikonversi dari kumpulan karakter lain, dan dokumen tersebut mungkin memiliki tanda tangan BOM di akhir (yaitu, menambahkan beberapa karakter BOM tersembunyi ke konten file). Solusinya adalah mencegah situasi ini terjadi di dokumen Anda. Anda juga dapat menanganinya sedikit dengan menggunakan fungsi ob_start().
2) $_COOKIE dipengaruhi oleh magic_quotes_gpc dan mungkin di-escape secara otomatis
3) Saat menggunakannya, perlu untuk menguji apakah pengguna mendukung cookie
<!--[jika !supportLineBreakNewLine]-->
1.5 Mekanisme kerja cookie:
Beberapa pelajar lebih impulsif dan tidak punya waktu untuk mempelajari prinsip-prinsipnya, jadi saya jelaskan nanti.
a) Server menyetel cookie di klien dengan mengirimkan header http Set-Cookie dengan respons (beberapa cookie memerlukan banyak header).
b) Klien secara otomatis mengirimkan header cookie http ke server, dan server menerima dan membacanya.
HTTP/1.x 200 Oke
X-Didukung-Oleh: PHP/5.2.1
Set-Cookie: TestCookie=sesuatu dari suatu tempat;
Kedaluwarsa: Kam, 19 Nov 2007 18:52:00 GMT
Kontrol Cache: tanpa penyimpanan, tanpa cache, harus divalidasi ulang, pasca-pemeriksaan=0, pra-pemeriksaan=0
Pragma: tanpa cache
Tipe konten: teks/html
Baris ini mengimplementasikan fungsi cookie. Setelah menerima baris ini
Set-Cookie: TestCookie=sesuatu dari suatu tempat;
Browser akan membuat file cookie di disk klien dan menulis:
TestCookie=sesuatu dari suatu tempat;
/
Baris ini adalah hasil penggunaan setcookie('TestCookie','something fromwhere','/');. Ini juga merupakan hasil penggunaan header('Set-Cookie: TestCookie=something fromwhere; path=/') ;.
<!--[endif]-->
2. Sesi PHP
Sesi ini menggunakan cookie dengan waktu kedaluwarsa yang disetel ke 0, dan menggunakan pengidentifikasi unik yang disebut ID sesi (string panjang) untuk menyinkronkan beberapa file sesi di sisi server (Anda dapat menentukan sendiri jenis penyimpanan sesi), dan berkomunikasi dengan pengguna Terhubung. Aplikasi web menyimpan data yang terkait dengan sesi ini dan memungkinkan data dikirimkan antar halaman dengan pengguna.
Pengunjung situs web diberi pengidentifikasi unik, yang disebut ID sesi. Itu disimpan dalam cookie sisi klien atau diteruskan melalui URL.
Dukungan sesi memungkinkan pengguna untuk mendaftarkan sejumlah variabel dan mencadangkannya untuk setiap permintaan. Ketika pengunjung mengakses situs web, PHP memeriksa apakah ID sesi tertentu dikirimkan dalam permintaan, baik secara otomatis (jika session.auto_start disetel ke 1) atau ketika pengguna memintanya (dipanggil secara eksplisit oleh session_start() atau secara implisit oleh session_register( )). Jika demikian, lingkungan yang disimpan sebelumnya akan dibuat ulang.
2.1 Transmisi sessionID
2.1.1 Mengirimkan ID sessin melalui cookie
Gunakan session_start() untuk memanggil sesi. Saat membuat file sesi, server menghasilkan nilai hash ID sesi dan nama sesi dengan nilai default PHPSESSID, dan mengirimkan variabel ke klien (defaultnya adalah) PHPSESSID (nama sesi). ), dengan nilai Merupakan nilai hash 128-bit. Server akan berinteraksi dengan klien melalui cookie ini.
Nilai variabel sesi diserialkan secara internal oleh PHP dan disimpan dalam file teks di mesin server, dan berinteraksi dengan kuli klien yang nama variabelnya adalah PHPSESSID secara default.
Artinya, server secara otomatis mengirimkan header http: header('Set-Cookie: session_name()=session_id(); path=/');
Yaitu, setcookie(session_name(),session_id());
Saat melompat ke halaman baru dari halaman ini dan memanggil session_start(), PHP akan memeriksa data sesi tersimpan di sisi server yang terkait dengan ID yang diberikan. Jika tidak ditemukan, kumpulan data baru akan dibuat.
2.1.2 Mengirimkan ID sesi melalui URL
Cara ini hanya digunakan ketika pengguna melarang penggunaan cookies, karena cookies browser sudah bersifat universal, dan demi alasan keamanan, cara ini tidak diperlukan.
<a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a>, nilai sesi juga dapat diteruskan melalui POST.
2.2 Contoh penggunaan dasar sesi
<?php
// halaman1.php
sesi_mulai();
gema 'Selamat datang di halaman #1';
/* Membuat variabel sesi dan menetapkan nilai ke variabel sesi */
$_SESSION['favcolor'] = 'hijau';
$_SESSION['hewan'] = 'kucing';
$_SESSION['waktu'] = waktu();
// Jika klien menggunakan cookie, sesi dapat diteruskan langsung ke halaman2.php
echo '<br /><a href="page2.php">halaman 2</a>';
// Jika klien menonaktifkan cookie
echo '<br /><a href="page2.php?' .SID . '">halaman 2</a>';
/*
Secara default, di bawah php5.2.1, SID hanya akan memiliki nilai saat cookie ditulis
Cookie yang sesuai sudah ada, maka SID akan (tidak ditentukan) kosong
*/
?>
<?php
// halaman2.php
sesi_mulai();
print $_SESSION['animal']; // Cetak satu sesi
var_dump($_SESSION); // Cetak nilai sesi yang diteruskan oleh page1.php
?>
2.3 Gunakan fungsi sesi untuk mengontrol cache halaman.
Dalam banyak kasus, kami perlu menentukan apakah halaman web kami di-cache di klien, atau mengatur waktu validitas cache. Misalnya, ada beberapa konten sensitif di halaman web kami dan Anda harus masuk untuk melihatnya , Anda dapat langsung membuka cache lokal. Anda dapat menjelajahi web tanpa login.
Gunakan session_cache_limiter('private'); untuk mengontrol cache klien halaman, yang harus dipanggil sebelum session_start().
Untuk parameter selengkapnya, lihat kontrol cache klien di http://blog.chinaunix.net/u/27731/showart.php?id=258087 .
Untuk mengontrol waktu cache klien, gunakan session_cache_expire(int);
Ini hanya metode untuk mengontrol caching saat menggunakan sesi. Kita juga dapat mengontrol caching halaman di header().
2.4 Hapus sesi
Dibutuhkan tiga langkah untuk mencapainya.
<?php
session_destroy(); // Langkah pertama: Hapus file sesi sisi server, ini digunakan
setcookie(session_name(),'',time()-3600); // Langkah 2: Hapus sesi sebenarnya:
$_SESSION = array(); // Langkah 3: Hapus array variabel global $_SESSION
?>
2.5 Penggunaan sesi dalam aplikasi web PHP skala besar. Untuk situs dengan jumlah kunjungan yang besar, metode penyimpanan sesi default tidak cocok. Metode terbaik saat ini adalah menggunakan database untuk mengakses sesi function bool session_set_save_handler (callback open, callback close, callback read, callback write, callback destroy, callback gc) adalah solusi yang diberikan kepada kami untuk mengatasi masalah ini.
6 fungsi yang digunakan oleh fungsi ini adalah sebagai berikut:
1. bool open() digunakan untuk membuka mekanisme penyimpanan sesi,
2. bool close() menutup operasi penyimpanan sesi.
3. mixde read() Gunakan fungsi ini saat memuat data sesi dari penyimpanan
4. bool write() menulis semua data ID sesi yang diberikan ke penyimpanan
5. bool destroy() menghancurkan data yang terkait dengan ID sesi yang ditentukan
6. bool gc() Untuk contoh pengumpulan data sampah di sistem penyimpanan, lihat fungsi session_set_save_handler() di manual PHP.
Jika Anda menggunakan kelas untuk menanganinya, gunakan
sesi_set_save_handler(
array('Nama Kelas','Buka'),
array('Namakelas','tutup'),
array('Nama Kelas','Baca'),
array('Nama Kelas','tulis'),
array('Namakelas','hancurkan'),
array('Nama Kelas','gc'),
)
Panggil 6 metode statis di kelas className. ClassName dapat diubah menjadi objek, sehingga tidak perlu memanggil metode statis, namun menggunakan anggota statis tidak memerlukan pembuatan objek, dan kinerjanya lebih baik.
2.6 Fungsi sesi yang umum digunakan:
bool session_start(batal);
bool session_destroy(void): Hapus file terkait sesi sisi server.
string session_id() ID sesi saat ini
string session_name() Nama sesi yang sedang diakses, yang merupakan nama cookie tempat klien menyimpan ID sesi. Defaultnya adalah PHPSESSID.
array session_get_cookie_params() Detail sesi yang terkait dengan sesi ini.
string session_cache_limiter() mengontrol cache klien halaman menggunakan sesi
ini session_cache_expire() mengontrol waktu cache klien
bool session_destroy() menghapus file yang menyimpan informasi sesi di sisi server
void session_set_cookie_params ( int seumur hidup [, string path [, string domain [, bool secure [, bool httponly]]]] ) Menyetel detail sesi yang terkait dengan sesi ini
bool session_set_save_handler (callback open, callback close, callback read, callback write, callback destroy, callback gc) mendefinisikan fungsi untuk sesi pemrosesan (tidak menggunakan metode default)
bool session_regenerate_id([bool delete_old_session]) memberikan id sesi baru
2.7 Masalah Keamanan Sesi Penyerang berusaha keras untuk mendapatkan ID sesi efektif dari pengguna yang ada. Dengan ID sesi, mereka mungkin dapat memiliki kemampuan yang sama dengan pengguna ini di sistem.
Oleh karena itu, solusi utama kami adalah memverifikasi validitas ID sesi.
<?php
if(!isset($_SESSION['agen_pengguna'])){
$_SESSION['agen_pengguna'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* Jika ID sesi pengguna dipalsukan*/
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
session_regenerate_id();