Ketika pengguna masuk ke aplikasi web dan kemudian menutup browser web, cookie sesi yang terkait dengan login segera kedaluwarsa. Artinya, jika pengguna mengakses aplikasi web nanti, mereka harus masuk lagi
Fitur ingat saya memungkinkan pengguna untuk menyimpan login mereka untuk beberapa waktu, bahkan setelah menutup browser web. Untuk menerapkan fitur ingat saya, Anda akan menggunakan cookie dengan waktu kedaluwarsa di masa mendatang
Cara yang umum tetapi tidak aman
Cara tidak aman untuk mengimplementasikan ingat saya adalah menambahkan id pengguna ke cookie dengan waktu kedaluwarsa
user_id=120
Code language: PHP (php)Saat pengguna mengakses aplikasi web, Anda memeriksa apakah id pengguna di cookie valid sebelum memasukkannya secara otomatis
Pendekatan naif ini hanya mengandalkan cookie, yang tidak aman karena alasan berikut
- Pertama, pengguna dapat mengubah id ke yang lain untuk masuk sebagai pengguna lain
- Kedua, id pengguna dapat mengungkapkan jumlah pengguna dalam sistem
Pendekatan yang lebih aman
Cara yang lebih aman untuk mengimplementasikan fitur ingat saya adalah dengan menyimpan token acak alih-alih id pengguna di cookie dan server basis data
Nilai dalam cookie akan terlihat seperti ini
remember_me=6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)_Dan inilah tabel database yang menyimpan token
CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)Saat pengguna mengakses aplikasi web, Anda mencocokkan token cookie dengan yang disimpan di database. Selain itu, Anda dapat memeriksa waktu kedaluwarsa token. Jika token cocok dan belum kedaluwarsa, Anda bisa mendapatkan id pengguna yang terkait dengan token dan memasukkan pengguna secara otomatis
Kueri untuk mencocokkan token akan terlihat seperti ini
SELECT user_id FROM user_tokens WHERE token = '6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91' and expiry > NOW()
Code language: PHP (php)Pendekatan ini memecahkan dua masalah di atas
- Pertama, token lebih menantang untuk ditebak
- Kedua, token tidak mengungkapkan jumlah pengguna
Namun, pendekatan ini memperlihatkan masalah keamanan lain yang dikenal sebagai serangan waktu
Ketika database membandingkan token cookie dengan token yang disimpan dalam database, ia mengembalikan waktu perbandingan yang berbeda sesuai dengan seberapa mirip dua token tersebut.
Misalnya, jika Anda menyimpan token berikut di cookie
6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)_Dan token berikut dalam database
6f9a1ef3020bb8351456cd65176e1e62ceeefcdca0a750201886a230f8736cad
Code language: PHP (php)Saat membandingkan token ini, database membandingkan setiap karakter dalam token dan berhenti mencocokkan saat menemukan ketidakcocokan. Dalam contoh ini, database berhenti pada karakter kedua
Namun, saat membandingkan pasangan token berikut
6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91 6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d92
Code language: PHP (php)_Basis data berhenti mencocokkan setelah membandingkan karakter terakhir kedua
Waktu pembandingan pada contoh kedua akan selalu lebih besar daripada yang kedua karena basis data perlu membandingkan lebih banyak karakter
Dengan menguji token yang berbeda, Anda bisa mendapatkan waktu respons yang berbeda. Dengan kata lain, waktunya bocor. Untuk menghindari kebocoran waktu, fungsi perbandingan perlu mengembalikan waktu yang konstan terlepas dari tokennya
Mencegah serangan waktu
Berikut ini menunjukkan cara mencegah serangan waktu seperti yang diusulkan oleh P. I. E. Dalam pendekatan ini, alih-alih menyimpan satu token di cookie, Anda menyimpan sepasang token.
CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)6 danCREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)7 dengan format.CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)_8CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)_6 adalah untuk memilihCREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)_6 danCREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)7CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, selector VARCHAR(255) NOT NULL, hashed_validator VARCHAR(255) NOT NULL, user_id INT NOT NULL, expiry DATETIME NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: PHP (php)Untuk mem-hash validator, Anda menggunakan fungsi password_hash()
Untuk mendapatkan id pengguna, Anda mencocokkan
CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)_6 dari cookie denganCREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)6 dari databaseSELECT id, selector, hashed_validator, user_id, expiry FROM user_tokens WHERE selector = :selector
Code language: PHP (php)Jika kueri mengembalikan baris, Anda dapat mencocokkan
CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)7 dari cookie denganSELECT user_id FROM user_tokens WHERE token = '6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91' and expiry > NOW()
Code language: PHP (php)6 menggunakan fungsiSELECT user_id FROM user_tokens WHERE token = '6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91' and expiry > NOW()
Code language: PHP (php)7Jika validator cocok, Anda dapat memasukkan pengguna dengan
SELECT user_id FROM user_tokens WHERE token = '6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91' and expiry > NOW()
Code language: PHP (php)8 secara otomatisBagian berikut akan menyempurnakan sistem login dengan menambahkan fitur ingat saya menggunakan pendekatan ketiga
Buat tabel user_token untuk menyimpan token
Pernyataan berikut membuat tabel
SELECT user_id FROM user_tokens WHERE token = '6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91' and expiry > NOW()
Code language: PHP (php)9 yang menyimpanCREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)6, hashCREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)7,6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)2, dan id penggunaCREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, selector VARCHAR(255) NOT NULL, hashed_validator VARCHAR(255) NOT NULL, user_id INT NOT NULL, expiry DATETIME NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: PHP (php)Tambahkan kotak centang ingat saya ke formulir login
Pertama, tambahkan kotak centang ingat saya ke formulir login di file
6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)3remember_me=6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)_0Kedua, tambahkan kode untuk menangani kotak centang ingat saya ke file
6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)4remember_me=6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)_1Di
6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)_4, tambahkan kotak centang ingat saya ke pemanggilan fungsi filter()remember_me=6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)_2Juga, tambahkan parameter ketiga ke fungsi login()
remember_me=6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Kami akan kembali untuk menyempurnakan fungsi
6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)_6 nantiTentukan fungsi untuk menangani fitur ingat saya
Pertama, buat file
6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)_7 di folder6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)8Kedua, tentukan fungsi baru berikut untuk menangani token di file
6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)7Hasilkan token
Berikut ini mendefinisikan
6f9a1ef3020bb8351456cd65176e1e62ceeefcdca0a750201886a230f8736cad
Code language: PHP (php)0 untuk menghasilkan sepasang token acak yang disebut pemilih dan validatorremember_me=6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)_4Fungsi
6f9a1ef3020bb8351456cd65176e1e62ceeefcdca0a750201886a230f8736cad
Code language: PHP (php)_0 mengembalikan array dari tiga elemen.CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)6,6f9a1ef3020bb8351456cd65176e1e62ceeefcdca0a750201886a230f8736cad
Code language: PHP (php)3, danCREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)8Parse token
Fungsi
6f9a1ef3020bb8351456cd65176e1e62ceeefcdca0a750201886a230f8736cad
Code language: PHP (php)_5 berikut membagi token yang disimpan dalam cookie menjadiCREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)6 danCREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)7remember_me=6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)_5Masukkan token pengguna baru
Fungsi
6f9a1ef3020bb8351456cd65176e1e62ceeefcdca0a750201886a230f8736cad
Code language: PHP (php)_8 berikut menambahkan baris baru ke tabelSELECT user_id FROM user_tokens WHERE token = '6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91' and expiry > NOW()
Code language: PHP (php)9remember_me=6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)_6Temukan token oleh pemilih
Fungsi
6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91 6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d92
Code language: PHP (php)_0 berikut menemukan baris dalam tabelSELECT user_id FROM user_tokens WHERE token = '6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91' and expiry > NOW()
Code language: PHP (php)9 oleh pemilih. Itu hanya mengembalikan pemilih pertandingan jika token tidak kedaluwarsa dengan membandingkan kedaluwarsa dengan waktu saat iniremember_me=6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)_7Hapus token pengguna
Fungsi
6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91 6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d92
Code language: PHP (php)_2 berikut menghapus semua token yang terkait dengan penggunaremember_me=6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)_8Temukan pengguna dengan token
Fungsi
6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91 6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d92
Code language: PHP (php)_3 berikut mengembalikanSELECT user_id FROM user_tokens WHERE token = '6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91' and expiry > NOW()
6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91 6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d92
Code language: PHP (php)5 dengan tokenremember_me=6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)_9Periksa apakah token valid
Fungsi
6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91 6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d92
Code language: PHP (php)_6 berikut menguraikan token yang disimpan dalam cookie (CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)8) dan mengembalikan6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91 6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d92
Code language: PHP (php)8 jika token tersebut valid dan tidak kedaluwarsafungsi token_is_valid(string $token). bool { // parse token untuk mendapatkan pemilih dan validator [$selector, $validator] = parse_token($token);
CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)0Memodifikasi fungsi di auth. php
Berikut ini menjelaskan perubahan fungsi dalam file
6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91 6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d92
Code language: PHP (php)9Fungsi login()
Berikut ini menambahkan parameter ketiga
CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, selector VARCHAR(255) NOT NULL, hashed_validator VARCHAR(255) NOT NULL, user_id INT NOT NULL, expiry DATETIME NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: PHP (php)_0 ke fungsi6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91
Code language: PHP (php)6CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)1Jika
CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, selector VARCHAR(255) NOT NULL, hashed_validator VARCHAR(255) NOT NULL, user_id INT NOT NULL, expiry DATETIME NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: PHP (php)0 adalah6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91 6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d92
Code language: PHP (php)8, panggil fungsiCREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, selector VARCHAR(255) NOT NULL, hashed_validator VARCHAR(255) NOT NULL, user_id INT NOT NULL, expiry DATETIME NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: PHP (php)4Fungsi log_user_in()
Fungsi log_user_in() mencatat pengguna
CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)2Fungsi reminder_me()
Berikut ini mendefinisikan fungsi ________14______4
CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)_3Fungsi
CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, selector VARCHAR(255) NOT NULL, hashed_validator VARCHAR(255) NOT NULL, user_id INT NOT NULL, expiry DATETIME NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: PHP (php)_4 menyimpan login untuk pengguna selama beberapa hari tertentu. Secara default, ini mengingat login selama 30 hariFungsi
CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, selector VARCHAR(255) NOT NULL, hashed_validator VARCHAR(255) NOT NULL, user_id INT NOT NULL, expiry DATETIME NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: PHP (php)_4 melakukan hal berikut- Pertama, buat
CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)6,CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)7, dan token (CREATE TABLE user_tokens ( id INT AUTO_INCREMENT PRIMARY KEY, token VARCHAR(255) NOT NULL, expiry DATETIME NOT NULL, user_id INT NOT NULL, CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE );
Code language: SQL (Structured Query Language) (sql)8) - Kedua, masukkan baris baru ke dalam tabel
SELECT user_id FROM user_tokens WHERE token = '6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91' and expiry > NOW()
Code language: PHP (php)9 - Ketiga, atur cookie dengan waktu kedaluwarsa yang ditentukan
Fungsi logout()
Jika pengguna keluar, selain menghapus sesi, Anda perlu menghapus catatan di tabel
SELECT user_id FROM user_tokens WHERE token = '6179f9c66a9d007e689c7809b5d8320a6692787773488f12a4330cd5ffd25d91' and expiry > NOW()
Code language: PHP (php)9 dan menghapus cookieSELECT id, selector, hashed_validator, user_id, expiry FROM user_tokens WHERE selector = :selector
Code language: PHP (php)3