Selamat datang di bagian ke-60 dari seri tutorial pemrograman PHP kita! Di bagian ini, kita akan menyelami topik penanganan sesi tingkat lanjut, khususnya bagaimana menyimpan data sesi dalam database dan mengamankan sesi tersebut. Ini adalah langkah penting untuk membangun aplikasi web yang aman dan skalabel. Sebagai prasyarat, disarankan untuk memahami konsep dasar sesi PHP (seperti yang dibahas dalam tutorial-tutorial sebelumnya) dan memiliki pengetahuan dasar tentang database (MySQL atau lainnya). Tutorial sebelumnya, 'Memahami dan Mengimplementasikan Middleware di PHP,' akan membantu memberikan pemahaman lebih dalam tentang bagaimana permintaan HTTP ditangani sebelum mencapai aplikasi Anda, yang relevan ketika berurusan dengan autentikasi sesi.
Secara default, PHP menyimpan data sesi dalam file di server. Meskipun mudah, pendekatan ini tidak cocok untuk aplikasi web skala besar atau yang membutuhkan keamanan tinggi. Menyimpan sesi di database menawarkan beberapa keuntungan:
Analogi sederhananya: bayangkan data sesi sebagai barang-barang berharga yang disimpan dalam loker. Menyimpan dalam file sama dengan menyimpan di loker yang mudah diakses siapa saja. Menyimpan di database sama dengan menyimpan di brankas bank yang aman.
Keamanan sesi adalah aspek penting. Kita akan membahas cara mencegah pembajakan sesi (session hijacking) dan serangan terkait lainnya.
Mari kita buat contoh kode untuk menyimpan data sesi dalam database MySQL dan mengamankan sesi tersebut.
Pertama, kita perlu membuat tabel di database kita untuk menyimpan data sesi:
CREATE TABLE sessions (
id VARCHAR(255) PRIMARY KEY,
access_token VARCHAR(255),
user_id INT,
data TEXT,
last_activity TIMESTAMP
);
Selanjutnya, kita akan membuat fungsi handler sesi kustom untuk membaca, menulis, dan menghapus data sesi dari database:
<?php
class SessionHandler {
private $db;
private $tableName = 'sessions';
public function __construct(PDO $db) {
$this->db = $db;
}
public function open($savePath, $sessionName) {
return true; // Tidak perlu melakukan apa-apa di sini
}
public function close() {
return true; // Tidak perlu melakukan apa-apa di sini
}
public function read($id) {
$stmt = $this->db->prepare("SELECT data FROM {$this->tableName} WHERE id = ? AND last_activity > ?");
$stmt->execute([$id, time() - ini_get('session.gc_maxlifetime')]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if ($result) {
return $result['data'];
}
return '';
}
public function write($id, $data) {
$stmt = $this->db->prepare("REPLACE INTO {$this->tableName} (id, data, last_activity) VALUES (?, ?, ?)");
return $stmt->execute([$id, $data, time()]);
}
public function destroy($id) {
$stmt = $this->db->prepare("DELETE FROM {$this->tableName} WHERE id = ?");
return $stmt->execute([$id]);
}
public function gc($maxlifetime) {
$stmt = $this->db->prepare("DELETE FROM {$this->tableName} WHERE last_activity < ?");
return $stmt->execute([time() - $maxlifetime]);
}
}
Sekarang, kita perlu mendaftarkan handler sesi kustom kita:
<?php
// Inisialisasi koneksi database (gantilah dengan informasi koneksi Anda)
$db = new PDO('mysql:host=localhost;dbname=nama_database', 'username', 'password');
$handler = new SessionHandler($db);
session_set_save_handler(
[$handler, 'open'],
[$handler, 'close'],
[$handler, 'read'],
[$handler, 'write'],
[$handler, 'destroy'],
[$handler, 'gc']
);
// Mencegah pembajakan sesi
session_regenerate_id(true);
// Mulai sesi
session_start();
Berikut adalah beberapa praktik terbaik untuk mengamankan sesi PHP:
Modifikasi contoh kode di atas untuk menambahkan kolom `access_token` ke tabel `sessions`. Setiap kali pengguna login, generate token unik dan simpan ke kolom ini. Validasi token ini setiap kali pengguna mengakses halaman yang dilindungi.