3 Cara Membuat Sistem Manajemen Sesi yang Aman di PHP dan MySQL

Daftar Isi:

3 Cara Membuat Sistem Manajemen Sesi yang Aman di PHP dan MySQL
3 Cara Membuat Sistem Manajemen Sesi yang Aman di PHP dan MySQL

Video: 3 Cara Membuat Sistem Manajemen Sesi yang Aman di PHP dan MySQL

Video: 3 Cara Membuat Sistem Manajemen Sesi yang Aman di PHP dan MySQL
Video: Dapatkan Penghasilan $$$ dengan menjadi FREELANCE WEB DEVELOPER 2024, Maret
Anonim

Panduan ini akan menunjukkan kepada Anda bagaimana Anda dapat menyimpan sesi Anda dengan aman di database mySQL. Kami juga akan mengenkripsi semua data sesi yang masuk ke database, yang berarti jika ada yang berhasil meretas ke dalam database, semua data sesi dienkripsi dengan enkripsi AES 256-bit.

Langkah

Metode 1 dari 3: Konfigurasikan Database mySQL

2238751 1
2238751 1

Langkah 1. Buat database MySQL

Dalam panduan ini kita akan membuat database bernama "secure_sessions".

Lihat cara Membuat-a-Database-in-phpMyAdmin.

Atau Anda dapat menggunakan kode SQL di bawah ini untuk membuatnya untuk Anda.

Buat Kode Basis Data:

BUAT DATABASE `secure_sessions`;

Catatan: Beberapa layanan hosting tidak mengizinkan Anda membuat database melalui phpMyAdmin, Pelajari cara melakukannya di cPanel.

2238751 2
2238751 2

Langkah 2. Buat pengguna hanya dengan hak SELECT, INSERT, dan DELETE

Ini berarti bahwa jika ada pelanggaran keamanan dalam skrip kami, peretas tidak dapat menghapus tabel dari basis data kami. Jika Anda benar-benar paranoid, buat pengguna yang berbeda untuk setiap fungsi.

  • Pengguna:

    "pengguna_detik"

  • Kata sandi:

    "eKcGZr59zAa2BEWU"

Buat Kode Pengguna:

BUAT PENGGUNA 'sec_user'@'localhost' DIIDENTIFIKASI OLEH 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON `secure_sessions`.* KE 'sec_user'@'localhost';

Catatan: Sebaiknya ubah kata sandi pada kode di atas saat berjalan di server Anda sendiri. (Pastikan Anda juga mengubah kode PHP Anda.) Ingat tidak perlu kata sandi yang dapat Anda ingat, jadi buatlah serumit mungkin. Inilah generator kata sandi acak.

2238751 3
2238751 3

Langkah 3. Buat tabel MySQL bernama "sesi"

Kode di bawah ini membuat tabel dengan 4 bidang (id, set_time, data, session_key).

Buat tabel "sesi":

CREATE TABLE `sessions` (`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=InnoDB DEFAULT CHARSET=latin1;

Kami menggunakan tipe data CHAR untuk bidang yang kami ketahui panjangnya, karena bidang "id" dan "kunci_sesi" akan selalu sepanjang 128 karakter. Menggunakan CHAR di sini menghemat daya pemrosesan.

Metode 2 dari 3: Buat file session.class.php

2238751 4
2238751 4

Langkah 1. Buat Kelas

Untuk memulai kelas baru, Anda harus memasukkan kode di bawah ini:

Kelas Baru:

sesi kelas {

2238751 5
2238751 5

Langkah 2. Buat fungsi _construct

Fungsi ini akan dipanggil setiap kali kita membuat instance baru dari sebuah objek menggunakan kelas 'session'. Anda dapat membaca fungsi PHP _construct di sini.

Fungsi ini mengatur pengendali sesi kustom kami sehingga tersedia untuk digunakan segera setelah kelas dipakai (yaitu, dibuat/dibangun/dibangun).

_membangun fungsi:

function _construct() { // mengatur fungsi sesi kustom kita. session_set_save_handler(array($this, 'open'), array($this, 'close'), array($this, 'read'), array($this, 'write'), array($this, 'destroy'), array($ini, 'gc')); // Baris ini mencegah efek tak terduga saat menggunakan objek sebagai penangan simpan. register_shutdown_function('session_write_close'); }

2238751 6
2238751 6

Langkah 3. Buat fungsi start_session

Fungsi ini akan dipanggil setiap kali Anda ingin memulai sesi baru, gunakan itu sebagai ganti session_start();. Lihat komentar dalam kode untuk melihat apa yang dilakukan setiap baris.

fungsi start_session:

function start_session($session_name, $secure) { // Pastikan cookie sesi tidak dapat diakses melalui javascript. $http saja = benar; // Algoritma hash yang digunakan untuk sesi. (gunakan hash_algos() untuk mendapatkan daftar hash yang tersedia.) $session_hash = 'sha512'; // Periksa apakah hash tersedia if (in_array($session_hash, hash_algos())) { // Setel fungsi has. ini_set('session.hash_function', $session_hash); } // Berapa banyak bit per karakter 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); // Paksa sesi untuk hanya menggunakan cookie, bukan variabel URL. ini_set('session.use_only_cookies', 1); // Dapatkan parameter cookie sesi $cookieParams = session_get_cookie_params(); // Setel parameter session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly); // Ubah nama sesi session_name($session_name); // Sekarang kita mulai sesi session_start(); // Baris ini membuat ulang sesi dan menghapus yang lama. // Ini juga menghasilkan kunci enkripsi baru dalam database. 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 koneksi database baru.

fungsi terbuka:

function open() { $host = 'localhost'; $pengguna = 'pengguna_detik'; $pass = 'eKcGZr59zAa2BEWU'; $nama = 'secure_sessions'; $mysqli = new mysqli($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.

tutup fungsi:

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

2238751 9
2238751 9

Langkah 6. Buat fungsi baca

Fungsi ini akan dipanggil oleh PHP ketika kita mencoba mengakses suatu sesi misalnya ketika kita menggunakan echo $_SESSION['something'];. Karena mungkin ada banyak panggilan ke fungsi ini pada satu halaman, kami memanfaatkan pernyataan yang disiapkan, tidak hanya untuk keamanan tetapi juga untuk kinerja. Kami hanya menyiapkan pernyataan sekali kemudian kami dapat mengeksekusinya berkali-kali.

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

membaca fungsi:

function read($id) { if(!isset($this->read_stmt)) { $this->read_stmt = $this->db->prepare("SELECT data FROM session WHERE id = ? LIMIT 1"); } $this->read_stmt->bind_param('s', $id); $this->read_stmt->execute(); $this->read_stmt->store_result(); $this->read_stmt->bind_result($data); $this->read_stmt->fetch(); $kunci = $ini->getkey($id); $data = $this->decrypt($data, $key); kembalikan $data; }

2238751 10
2238751 10

Langkah 7. Buat fungsi tulis

Fungsi ini digunakan ketika kita memberikan nilai ke sebuah sesi, misalnya $_SESSION['something'] = 'something else';. Fungsi ini mengenkripsi semua data yang dimasukkan ke dalam database.

fungsi tulis:

function write($id, $data) { // Dapatkan kunci unik $key = $this->getkey($id); // Enkripsi data $data = $this->encrypt($data, $key); $waktu = waktu(); if(!isset($this->w_stmt)) { $this->w_stmt = $this->db->prepare("REPLACE INTO sesi (id, set_time, data, session_key) NILAI (?, ?, ?, ?)"); } $this->w_stmt->bind_param('siss', $id, $time, $data, $key); $this->w_stmt->execute(); kembali benar; }

2238751 11
2238751 11

Langkah 8. Buat fungsi penghancuran

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

menghancurkan fungsi:

function destroy($id) { if(!isset($this->delete_stmt)) { $this->delete_stmt = $this->db->prepare("DELETE FROM session WHERE id = ?"); } $this->delete_stmt->bind_param('s', $id); $this->delete_stmt->execute(); 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. Frekuensi pemanggilan fungsi ini ditentukan oleh dua arahan konfigurasi, session.gc_probability dan session.gc_divisor.

fungsi gc():

function gc($max) { if(!isset($this->gc_stmt)) { $this->gc_stmt = $this->db->prepare("DELETE FROM session WHERE set_time < ?"); } $lama = waktu() - $maks; $this->gc_stmt->bind_param('s', $old); $this->gc_stmt->execute(); kembali benar; }

2238751 13
2238751 13

Langkah 10. Buat fungsi getKey

Fungsi ini digunakan untuk mendapatkan kunci unik untuk enkripsi dari tabel sesi. Jika tidak ada sesi, itu hanya mengembalikan kunci acak baru untuk enkripsi.

getkey() Fungsi:

private function getkey($id) { if(!isset($this->key_stmt)) { $this->key_stmt = $this->db->prepare("SELECT session_key FROM session WHERE id = ? LIMIT 1"); } $this->key_stmt->bind_param('s', $id); $this->key_stmt->execute(); $this->key_stmt->store_result(); if($this->key_stmt->num_rows == 1) { $this->key_stmt->bind_result($key); $this->key_stmt->fetch(); kembali $kunci; } else { $random_key = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true)); kembalikan $random_key; } }

2238751 14
2238751 14

Langkah 11. Buat fungsi enkripsi dan dekripsi

Fungsi-fungsi ini mengenkripsi data sesi, mereka menggunakan kunci enkripsi dari database yang berbeda untuk setiap sesi. Kami tidak langsung menggunakan kunci itu dalam enkripsi tetapi kami menggunakannya untuk membuat hash kunci lebih acak.

fungsi enkripsi() dan dekripsi():

private function encrypt($data, $key) { $salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH'; $kunci = substr(hash('sha256', $garam.$kunci.$garam), 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)); kembali $ terenkripsi; } dekripsi fungsi pribadi($data, $key) { $salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHEGE*ewr4n39=E@rAsp7c-Ph@pH'; $kunci = substr(hash('sha256', $garam.$kunci.$garam), 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); $dekripsi = rtrim($dekripsi, "\0"); kembali $ didekripsi; }

2238751 15
2238751 15

Langkah 12. Akhiri Kelas

Di sini kita hanya mengakhiri kurung kurawal kelas:

Kelas Akhir:

}

Metode 3 dari 3: Membuat Halaman Dengan Sesi

2238751 16
2238751 16

Langkah 1. Menggunakan sesi dengan manajer sesi kustom

Di bawah ini adalah bagaimana Anda akan memulai sesi baru; Anda harus menyertakan ini di setiap halaman yang ingin Anda akses sesinya, gunakan itu sebagai ganti session_start();

Memulai sesi:

membutuhkan('session.class.php'); $sesi = sesi baru(); // Setel ke true jika menggunakan https $session->start_session('_s', false); $_SESSION['sesuatu'] = 'Nilai.'; echo $_SESSION['sesuatu'];

Direkomendasikan: