3 Cara Membuat Sistem Pengurusan Sesi Selamat di PHP dan MySQL

Isi kandungan:

3 Cara Membuat Sistem Pengurusan Sesi Selamat di PHP dan MySQL
3 Cara Membuat Sistem Pengurusan Sesi Selamat di PHP dan MySQL

Video: 3 Cara Membuat Sistem Pengurusan Sesi Selamat di PHP dan MySQL

Video: 3 Cara Membuat Sistem Pengurusan Sesi Selamat di PHP dan MySQL
Video: 1 Juta/Hari Dengan Buat Video Profesional Pake 2 Web A.I, Cara Menghasilkan Uang Dari A.I & Internet 2024, April
Anonim

Panduan ini akan menunjukkan kepada anda bagaimana anda dapat menyimpan sesi anda dengan selamat dalam pangkalan data mySQL. Kami juga akan mengenkripsi semua data sesi yang masuk ke dalam pangkalan data, yang bermaksud jika ada yang berjaya menggodam pangkalan data, semua data sesi disulitkan oleh enkripsi AES 256-bit.

Langkah-langkah

Kaedah 1 dari 3: Konfigurasikan Pangkalan Data mySQL

2238751 1
2238751 1

Langkah 1. Buat pangkalan data MySQL

Dalam panduan ini kami akan membuat pangkalan data yang disebut "safe_sessions".

Lihat cara Membuat-a-Pangkalan Data-di-phpMyAdmin.

Atau anda boleh menggunakan kod SQL di bawah ini akan membuatnya untuk anda.

Buat Kod Pangkalan Data:

BUAT DATABASE `safe_sessions`;

Catatan: Beberapa perkhidmatan hosting tidak membenarkan anda membuat pangkalan data melalui phpMyAdmin, Pelajari cara melakukannya di cPanel.

2238751 2
2238751 2

Langkah 2. Buat pengguna dengan hak istimewa PILIH, MASUK dan HAPUS

Ini bermaksud bahawa sekiranya terdapat pelanggaran keselamatan dalam skrip kami, penggodam tidak dapat menjatuhkan jadual dari pangkalan data kami. Sekiranya anda benar-benar paranoid, buat pengguna yang berbeza untuk setiap fungsi.

  • Pengguna:

    "sec_user"

  • Kata Laluan:

    "eKcGZr59zAa2BEWU"

Buat Kod Pengguna:

BUAT PENGGUNA 'sec_user' @ 'localhost' DIKENALI OLEH 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON `safe_sessions`. * TO 'sec_user' @ 'localhost';

Catatan: Sebaiknya ubah kata laluan dalam kod di atas semasa berjalan di pelayan anda sendiri. (Pastikan anda mengubah kod PHP anda juga.) Ingat, kata kunci itu tidak perlu menjadi kata laluan yang dapat anda ingat sehingga membuatnya sesulit mungkin. Inilah penjana kata laluan rawak.

2238751 3
2238751 3

Langkah 3. Buat jadual MySQL yang diberi nama "sesi"

Kod di bawah membuat jadual dengan 4 bidang (id, set_time, data, session_key).

Buat jadual "sesi":

BUAT JADUAL `sesi` (` id` char (128) NOT NULL, `set_time` char (10) NOT NULL,` data` text NOT NULL, `session_key` char (128) NOT NULL, PRIMARY KEY (` id`)) ENGINE = CARTA DEFAULT InnoDB = latin1;

Kami menggunakan jenis data CHAR untuk bidang yang kami tahu panjangnya, kerana bidang "id" dan "session_key" akan panjangnya 128 aksara. Menggunakan CHAR di sini menjimatkan kuasa pemprosesan.

Kaedah 2 dari 3: Buat fail session.class.php

2238751 4
2238751 4

Langkah 1. Buat Kelas

Untuk memulakan kelas baru, anda perlu memasukkan kod di bawah:

Kelas Baru:

sesi kelas {

2238751 5
2238751 5

Langkah 2. Buat fungsi _konstruk

Fungsi ini akan dipanggil setiap kali kita membuat contoh baru objek menggunakan kelas 'sesi'. Anda boleh membaca fungsi PHP _konstruk di sini.

Fungsi ini menetapkan pengendali sesi khusus kami sehingga tersedia untuk digunakan sebaik sahaja kelas dibuat (iaitu, dibuat / dibina / dibina).

_fungsi pembinaan:

fungsi _construct () {// tetapkan fungsi sesi khusus kami. session_set_save_handler (array ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ ini, 'hancurkan'), array ($ ini, 'gc')); // Garis ini menghalang kesan yang tidak dijangka ketika menggunakan objek sebagai pengendali simpanan. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Langkah 3. Buat fungsi start_session

Fungsi ini akan dipanggil setiap kali anda ingin memulakan sesi baru, gunakan bukan sesi_start ();. Lihat komen dalam kod untuk melihat apa yang dilakukan oleh setiap baris.

fungsi start_session:

function start_session ($ session_name, $ safe) {// Pastikan cookie sesi tidak dapat diakses melalui javascript. $ httponly = benar; // Algoritma Hash untuk digunakan untuk sesi. (gunakan hash_algos () untuk mendapatkan senarai hash yang tersedia.) $ session_hash = 'sha512'; // Periksa apakah hash tersedia jika (in_array ($ session_hash, hash_algos ())) {// Tetapkan fungsi has. ini_set ('session.hash_function', $ session_hash); } // Berapa bit per watak hash. // Nilai yang mungkin adalah '4' (0-9, a-f), '5' (0-9, a-v), dan '6' (0-9, a-z, A-Z, "-", ","). ini_set ('session.hash_bits_per_character', 5); // Memaksa sesi untuk hanya menggunakan kuki, bukan pemboleh ubah URL. ini_set ('session.use_only_cookies', 1); // Dapatkan parameter cookie sesi $ cookieParams = session_get_cookie_params (); // Tetapkan parameter session_set_cookie_params ($ cookieParams ["seumur hidup"], $ cookieParams ["path"], $ cookieParams ["domain"], $ safe, $ httponly); // Tukar nama sesi session_name ($ session_name); // Sekarang kita kucing memulakan sesi session_start (); // Baris ini menjana semula sesi dan menghapus yang lama. // Ini juga menghasilkan kunci penyulitan baru dalam pangkalan data. session_regenerate_id (benar); }

2238751 7
2238751 7

Langkah 4. Buat fungsi terbuka

Fungsi ini akan dipanggil oleh sesi PHP ketika kita memulai sesi baru, kita menggunakannya untuk memulai sambungan pangkalan data baru.

fungsi terbuka:

fungsi terbuka () {$ host = 'localhost'; $ pengguna = 'sec_user'; $ lulus = 'eKcGZr59zAa2BEWU'; $ name = 'safe_sessions'; $ mysqli = mysqli baru ($ host, $ user, $ pass, $ name); $ ini-> db = $ mysqli; kembali benar; }

2238751 8
2238751 8

Langkah 5. Buat fungsi tutup

Fungsi ini akan dipanggil ketika sesi ingin ditutup.

fungsi tutup:

fungsi tutup () {$ this-> db-> close (); kembali benar; }

2238751 9
2238751 9

Langkah 6. Buat fungsi baca

Fungsi ini akan dipanggil oleh PHP ketika kita cuba mengakses sesi misalnya ketika kita menggunakan echo $ _SESSION ['sesuatu'];. Oleh kerana mungkin terdapat banyak panggilan untuk fungsi ini pada satu halaman, kami memanfaatkan pernyataan yang disiapkan, bukan hanya untuk keselamatan tetapi juga untuk prestasi. Kami hanya menyediakan penyataan sekali sahaja maka kami dapat melaksanakannya berkali-kali.

Kami juga mendekripsi data sesi yang dienkripsi dalam pangkalan data. Kami menggunakan enkripsi AES 256-bit dalam sesi kami.

fungsi baca:

fungsi baca ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> siapkan ("PILIH data DARI sesi DI MANA id =? BATAS 1"); } $ ini-> read_stmt-> bind_param ('s', $ id); $ ini-> read_stmt-> jalankan (); $ ini-> read_stmt-> store_result (); $ ini-> read_stmt-> bind_result ($ data); $ ini-> read_stmt-> fetch (); $ key = $ this-> getkey ($ id); $ data = $ ini-> nyahsulit ($ data, $ key); mengembalikan $ data; }

2238751 10
2238751 10

Langkah 7. Buat fungsi tulis

Fungsi ini digunakan semasa kita memberikan nilai pada sesi, misalnya $ _SESSION ['sesuatu'] = 'sesuatu yang lain';. Fungsi menyulitkan semua data yang dimasukkan ke dalam pangkalan data.

fungsi tulis:

fungsi tulis ($ id, $ data) {// Dapatkan kunci unik $ key = $ this-> getkey ($ id); // Encrypt data $ data = $ this-> encrypt ($ data, $ key); $ masa = masa (); if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> persiapkan ("GANTIKAN DALAM sesi (id, set_time, data, session_key) NILAI (?,?,?,?) "); } $ ini-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ ini-> w_stmt-> jalankan (); kembali benar; }

2238751 11
2238751 11

Langkah 8. Buat fungsi hancurkan

Fungsi ini menghapus sesi dari pangkalan data, ia digunakan oleh php ketika kita memanggil fungsi seperti session_destroy ();.

memusnahkan fungsi:

fungsi hancurkan ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> persiapkan ("HAPUS DARI sesi DI MANA id =?"); } $ ini-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> jalankan (); kembali benar; }

2238751 12
2238751 12

Langkah 9. Buat fungsi gc (pengumpul sampah)

Fungsi ini adalah fungsi pengumpul sampah yang dipanggil untuk menghapus sesi lama. Kekerapan fungsi ini dipanggil ditentukan oleh dua arahan konfigurasi, session.gc_probability dan session.gc_divisor.

fungsi gc ():

fungsi gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> persiapkan ("HAPUS DARI sesi DI MANA set_time <?"); } $ lama = masa () - $ maks; $ ini-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> jalankan (); kembali benar; }

2238751 13
2238751 13

Langkah 10. Buat fungsi getKey

Fungsi ini digunakan untuk mendapatkan kunci unik untuk penyulitan dari jadual sesi. Sekiranya tidak ada sesi, ia hanya mengembalikan kunci rawak baru untuk penyulitan.

getkey () Fungsi:

getkey fungsi peribadi ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> persiapkan ("SELECT session_key DARI sesi WHERE id =? LIMIT 1"); } $ ini-> key_stmt-> bind_param ('s', $ id); $ this-> key_stmt-> jalankan (); $ ini-> key_stmt-> store_result (); jika ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ key); $ ini-> key_stmt-> ambil (); kembalikan $ kunci; } lain {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); pulangkan $ random_key; }}

2238751 14
2238751 14

Langkah 11. Buat fungsi menyulitkan dan menyahsulit

Fungsi-fungsi ini mengenkripsi data sesi, mereka menggunakan kunci penyulitan dari pangkalan data yang berbeza untuk setiap sesi. Kami tidak menggunakan kunci itu secara langsung dalam enkripsi tetapi kami menggunakannya untuk menjadikan hash kunci menjadi lebih rawak.

menyulitkan () dan menyahsulit () fungsi:

enkripsi fungsi peribadi ($ data, $ key) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH'; $ key = substr (hash ('sha256', $ salt. $ key. $ salt), 0, 32); $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND); $ encrypted = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ key, $ data, MCRYPT_MODE_ECB, $ iv)); kembalikan $ disulitkan; } dekripsi fungsi peribadi ($ data, $ key) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH'; $ key = substr (hash ('sha256', $ salt. $ key. $ salt), 0, 32); $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND); $ decrypted = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ key, base64_decode ($ data), MCRYPT_MODE_ECB, $ iv); $ decrypted = rtrim ($ decrypted, "\ 0"); pulangkan $ didekripsi; }

2238751 15
2238751 15

Langkah 12. Kelas Tamat

Di sini kita baru sahaja menamatkan kurungan kelas:

Kelas Akhir:

}

Kaedah 3 dari 3: Membuat Halaman Dengan Sesi

2238751 16
2238751 16

Langkah 1. Menggunakan sesi dengan pengurus sesi tersuai

Berikut adalah bagaimana anda memulakan sesi baru; anda perlu memasukkan ini di setiap halaman yang anda ingin mengakses sesi, gunakan bukan sesi_start ();

Memulakan sesi:

memerlukan ('session.class.php'); $ sesi = sesi baru (); // Tetapkan ke true jika menggunakan https $ session-> start_session ('_ s', false); $ _SESSION ['sesuatu'] = 'Nilai.'; gema $ _SESSION ['sesuatu'];

Disyorkan: