Kuidas luua turvalist seansihaldussüsteemi PHP-s ja MySQL-is

See juhend näitab teile, kuidas saate oma seansse turvaliselt MySQL-i andmebaasis salvestada. Krüpteerime ka kõik andmebaasi sisenevad seansiandmed, mis tähendab, et kui kellelgi õnnestub andmebaasi sisse häkkida, krüpteeritakse kõik seansiandmed 256-bitise AES-krüptimisega.

1
Looge MySQL-i andmebaas. Selles juhendis loome andmebaasi nimega “secure_sessions”. Vaadake, kuidas luua-andmebaasi-phpMyAdminis. Või võite kasutada allolevat SQL-koodi, mis loob selle teie jaoks.Loo andmebaasi kood:CREATE DATABASE `secure_sessions` ; Märkus. Mõned hostimisteenused ei võimalda teil phpMyAdmini kaudu andmebaasi luua. Vaadake, kuidas seda teha cPanelis.

2
Looge kasutaja, kellel on ainult SELECT, INSERT ja DELETE õigused. See tähendab, et kui meie skripti turvalisust rikutakse, ei saanud häkker meie andmebaasist tabeleid eemaldada. Kui olete tõesti paranoiline, looge iga funktsiooni jaoks erinev kasutaja. Kasutaja: “sec_user”Parool: “eKcGZr59zAa2BEWU”Loo kasutajakood:CREATE KASUTAJA ‘sec_user’@’localhost’ IDENTIFITSEERIB ‘eKcGZr59zAa2BEWU’;GRANT SELECT@ INSERT, UPDATE_shost’s’sal ‘;Märkus. Kui töötate oma serveris, on hea mõte ülalolevas koodis olevat parooli muuta. (Muutke kindlasti ka oma PHP-koodi.) Pidage meeles, et see ei pea olema parool, mida mäletate, nii et selle tegemine on võimalikult keeruline. Siin on juhusliku parooli generaator.

3
Looge MySQL-i tabel nimega “seansid”. Allolev kood loob 4 väljaga tabeli (id, set_time, data, session_key). Looge tabel “sessions”:CREATE TABLE `sessions’ ( `id` char(128) NOT NULL, `set_time` char(10) NOT NULL, `andmed` tekst NOT NULL, `session_key` char(128) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;Kasutame andmetüüpi CHAR väljade jaoks, mille pikkust teame, kuna väljad “id” ja “session_key” on alati 128 tähemärki pikad. Siin CHAR-i kasutamine säästab töötlemisvõimsust.

4
Loo klass. Uue klassi alustamiseks peate sisestama alloleva koodi: Uus klass:klassi seanss {

5
Looge funktsioon __construct. Seda funktsiooni kutsutakse iga kord, kui loome klassi seansi abil uue objekti eksemplari. PHP __construct funktsiooni kohta saate lugeda siit. See funktsioon seab meie kohandatud seansikäsitleja nii, et see oleks kasutamiseks saadaval kohe, kui klass on instantseeritud (st tehtud/ehitatud/konstrueeritud).__construct function:function __construct() { / / määrake meie kohandatud seansi funktsioonid. session_set_save_handler(massiiv($this, ‘ava’), array($this, ‘sulge’), array($this, ‘read’), array($this, ‘write’), array($this, ‘hävita’ ), array($this, ‘gc’)); // See rida hoiab ära ootamatud efektid objektide kasutamisel salvestuskäsitlejatena. register_shutdown_function(‘session_write_close’);}

6
Looge funktsioon start_session. Seda funktsiooni kutsutakse iga kord, kui soovite uut seanssi alustada, kasutage seda session_start(); asemel. Vaadake koodi kommentaare, et näha, mida iga rida teeb.start_session function:function start_session($session_name, $secure) { // Veenduge, et seansiküpsis ei oleks JavaScripti kaudu juurdepääsetav. $httponly = tõene; // Seansi jaoks kasutatav räsi-algoritm. (kasutage saadaolevate räside loendi saamiseks käsku hash_algos(). $session_hash = ‘sha512’; // Kontrollige, kas räsi on saadaval if (in_array($session_hash, hash_algos())) { // Määrab funktsiooni have. ini_set(‘session.hash_function’, $session_hash); } // Mitu bitti räsi märgi kohta. // Võimalikud väärtused on ‘4’ (0-9, a-f), ‘5’ (0-9, a-v) ja ‘6’ (0-9, a-z, A-Z, “-“, “,”). ini_set(‘seanss.hash_bits_per_character’, 5); // Seansi sundimine kasutama ainult küpsiseid, mitte URL-i muutujaid. ini_set(‘session.use_only_cookies’, 1); // Hangi seansiküpsise parameetrid $cookieParams = session_get_cookie_params(); // Määrake parameetrid session_set_cookie_params($cookieParams[“eluaeg”], $cookieParams[“tee”], $cookieParams[“domeen”], $secure, $httponly); // Muuda seansi nime seansi_nimi($sessiooni_nimi); // Nüüd alustame seanssi session_start(); // See rida taastab seansi ja kustutab vana. // Samuti genereerib see andmebaasis uue krüpteerimisvõtme. session_regenerate_id(true); }

7
Loo avatud funktsioon.Seda funktsiooni kutsuvad PHP seansid, kui alustame uut seanssi, kasutame seda uue andmebaasiühenduse loomiseks.open function:function open() { $host = ‘localhost’; $kasutaja = ‘sec_user’; $pass = ‘eKcGZr59zAa2BEWU’; $nimi = ‘turvalised_seansid’; $mysqli = uus mysqli($host, $kasutaja, $pääs, $nimi); $see->db = $mysqli; tagasta tõene;}

8
Loo sulgemisfunktsioon.Seda funktsiooni kutsutakse välja, kui seansse tahetakse sulgeda.close function:function close() { $this->db->close(); tagasta tõene;}

9
Loo lugemisfunktsioon. PHP kutsub seda funktsiooni välja, kui proovime seansile juurde pääseda, näiteks kui kasutame echo $_SESSION[‘midagi’];. Kuna sellel funktsioonil võib ühel lehel olla palju väljakutseid, kasutame ettevalmistatud avaldusi mitte ainult turvalisuse, vaid ka jõudluse huvides. Me koostame avalduse ainult üks kord, siis saame seda mitu korda täita. Samuti dekrüpteerime andmebaasis krüpteeritud seansiandmed. Kasutame oma seanssides 256-bitist AES-krüptimist. read function:function read($id) { if(!isset($this->read_stmt)) { $this->read_stmt = $this->db->prepare(“VALI andmed seanssidest WHERE id = ? LIMIT 1” ); } $this->read_stmt->bind_param(‘s’, $id); $this->read_stmt->execute(); $see->loe_stmt->pood_tulemus(); $see->loe_stmt->bind_result($andmed); $this->read_stmt->fetch(); $võti = $this->getkey($id); $andmed = $see->dekrüptida($andmed, $võti); tagasta $data;}

10
Loo kirjutamisfunktsioon. Seda funktsiooni kasutatakse siis, kui määrame seansile väärtuse, näiteks $_SESSION[‘something’] = ‘midagi muud’;. Funktsioon krüpteerib kõik andmed, mis andmebaasi sisestatakse.write function:function write($id, $data) { // Hangi kordumatu võti $key = $this->getkey($id); // Andmete krüptimine $andmed = $this->encrypt($data, $key); $aeg = aeg(); if(!isset($this->w_stmt)) { $this->w_stmt = $this->db->prepare(“ASENDA seanssidesse (id, set_time, data, session_key) VÄÄRTUSED (?, ?, ?, ? )”); } $this->w_stmt->bind_param(‘siss’, $id, $time, $data, $key); $this->w_stmt->execute(); tagasta tõene;}

11
Loo hävitamise funktsioon.See funktsioon kustutab seansi andmebaasist, seda kasutab php, kui kutsume välja selliseid funktsioone nagu session__destroy();.destroy function:function hävita($id) { if(!isset($this->delete_stmt)) { $this->delete_stmt = $this->db->prepare(“DELETE FROM seanssidest WHERE id =?”); } $this->delete_stmt->bind_param(‘s’, $id); $see->kustuta_stmt->käivita(); tagasta tõene;}

12
Looge gc (prügikoguja) funktsioon. See funktsioon on prügikogumisfunktsioon, mida kutsutakse vanade seansside kustutamiseks. Selle funktsiooni kutsumise sageduse määravad kaks konfiguratsioonidirektiivi: session.gc_probability ja session.gc_divisor.gc() function:function gc($max) { if(!isset($this->gc_stmt)) { $this ->gc_stmt = $this->db->prepare(“DELETE FROM seanssidest WHERE set_time < ?"); } $vana = aeg() - $max; $this->gc_stmt->bind_param(‘s’, $vana); $this->gc_stmt->execute(); tagasta tõene;}

13
Looge funktsioon getKey. Seda funktsiooni kasutatakse unikaalse krüptimisvõtme hankimiseks seansside tabelist. Kui seanssi pole, tagastab see lihtsalt uue juhusliku võtme encryption.getkey() jaoks Function:private function getkey($id) { if(!isset($this->key_stmt)) { $this->key_stmt = $this- >db->prepare(“SELECT session_key FROM sessions WHERE id = ? LIMIT 1”); } $this->key_stmt->bind_param(‘s’, $id); $this->key_stmt->execute(); $see->võti_stmt->poe_tulemus(); if($see->võti_stmt->ridade_arv == 1) { $see->võti_stmt->bind_result($key); $this->key_stmt->fetch(); tagasta $võti; } else { $juhuslik_võti = hash(‘sha512’, uniqid(mt_rand(1, mt_getrandmax()), true)); return $juhuslik_võti; }}

14
Looge krüpteerimis- ja dekrüpteerimisfunktsioone. Need funktsioonid krüpteerivad seansside andmeid, nad kasutavad andmebaasist pärinevat krüpteerimisvõtit, mis on iga seansi jaoks erinev. Me ei kasuta seda võtit krüptimisel otseselt, kuid kasutame seda võtmeräsi veelgi juhuslikumaks muutmiseks. encrypt() ja decrypt() funktsioonid:private function encrypt($andmed, $key) { $sool = ‘cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH’; $võti = substr(hash(‘sha256’, $sool.$võti.$sool), 0, 32); $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $krüptitud = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $võti, $andmed, MCRYPT_MODE_ECB, $iv)); return $krüptitud;}privaatfunktsioon dekrüpt ($andmed, $võti) { $sool = ‘cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH’; $võti = substr(hash(‘sha256’, $sool.$võti.$sool), 0, 32); $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $dekrüptitud = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $võti, base64_decode($andmed), MCRYPT_MODE_ECB, $iv); $decrypted = rtrim($decrypted, “”); tagasta $decrypted;}

15
Lõppklass.Siin me lihtsalt lõpetame klassid lokkis sulud:Lõppklass:}

16
Seansside kasutamine kohandatud seansihalduriga. Allpool on näidatud, kuidas alustada uut seanssi; peate selle lisama igale lehele, millele soovite seanssidele juurde pääseda, kasutage seda asemel session_start();Sessiooni alustamine:require(‘session.class.php’);$session = new session();// Määra tõeseks, kui kasutate https$session->start_session(‘_s’, false);$_SESSION[‘something’] = ‘Väärtus.’;echo $_SESSION[‘midagi’];