3 būdai sukurti saugią sesijų valdymo sistemą PHP ir MySQL

Turinys:

3 būdai sukurti saugią sesijų valdymo sistemą PHP ir MySQL
3 būdai sukurti saugią sesijų valdymo sistemą PHP ir MySQL

Video: 3 būdai sukurti saugią sesijų valdymo sistemą PHP ir MySQL

Video: 3 būdai sukurti saugią sesijų valdymo sistemą PHP ir MySQL
Video: kaip tu gali užsidirbti papildomų pinigų 2024, Balandis
Anonim

Šis vadovas parodys, kaip galite saugiai saugoti savo seansus „mySQL“duomenų bazėje. Mes taip pat užšifruosime visus į duomenų bazę patekusius seanso duomenis, o tai reiškia, kad jei kas nors sugebės įsilaužti į duomenų bazę, visi seanso duomenys bus užšifruoti 256 bitų AES šifravimu.

Žingsniai

1 būdas iš 3: sukonfigūruokite „mySQL“duomenų bazę

2238751 1
2238751 1

Žingsnis 1. Sukurkite „MySQL“duomenų bazę

Šiame vadove sukursime duomenų bazę, pavadintą „secure_sessions“.

Sužinokite, kaip sukurti duomenų bazę „phpMyAdmin“.

Arba galite naudoti toliau pateiktą SQL kodą, kuris sukurs jums.

Sukurti duomenų bazės kodą:

CREATE DATABASE `secure_sessions`;

Pastaba: kai kurios prieglobos paslaugos neleidžia kurti duomenų bazės naudojant „phpMyAdmin“. Sužinokite, kaip tai padaryti naudojant „cPanel“.

2238751 2
2238751 2

Žingsnis 2. Sukurkite vartotoją, turintį tik SELECT, INSERT ir DELETE privilegijas

Tai reiškia, kad jei kada nors buvo pažeistas mūsų scenarijaus saugumas, įsilaužėlis negalėjo išmesti lentelių iš mūsų duomenų bazės. Jei esate tikrai paranojikas, kiekvienai funkcijai sukurkite skirtingą vartotoją.

  • Vartotojas:

    "sec_user"

  • Slaptažodis:

    „eKcGZr59zAa2BEWU“

Sukurkite vartotojo kodą:

KURTI NAUDOTOJĄ 'sec_user'@'localhost', IDENTIFIKUOTAS 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON "secure_sessions".* TO 'sec_user'@'localhost';

Pastaba: Veikiant savo serveryje, gera idėja pakeisti aukščiau esančio kodo slaptažodį. (Nepamirškite pakeisti ir savo PHP kodo.) Atminkite, kad tai nebūtinai turi būti slaptažodis, kurį galite atsiminti, todėl padaryti tai yra kuo sudėtingiau. Štai atsitiktinis slaptažodžių generatorius.

2238751 3
2238751 3

Žingsnis 3. Sukurkite „MySQL“lentelę pavadinimu „sesijos“

Žemiau pateiktas kodas sukuria lentelę su 4 laukais (id, set_time, data, session_key).

Sukurkite lentelę „seansai“:

KURTI LENTELĘ „seansai“(„id“char (128) NOT NULL, „set_time“char (10) NOT NULL, „data“tekstas NOT NULL, „session_key“char (128) NOT NULL, PIRMINIS RAKTAS („id“)) VARIKLIS = „InnoDB DEFAULT CHARSET“= latin1;

Mes naudojame CHAR duomenų tipą laukams, kurių ilgį žinome, nes laukai „id“ir „session_key“visada bus 128 simbolių. Čia naudojant CHAR taupoma apdorojimo galia.

2 metodas iš 3: sukurkite failą session.class.php

2238751 4
2238751 4

Žingsnis 1. Sukurkite klasę

Norėdami pradėti naują klasę, turėsite įvesti žemiau esantį kodą:

Nauja klasė:

klasės sesija {

2238751 5
2238751 5

Žingsnis 2. Sukurkite _construct funkciją

Ši funkcija bus iškviesta kiekvieną kartą, kai sukuriame naują objekto egzempliorių naudodami klasę „session“. Čia galite perskaityti apie PHP _construct funkciją.

Ši funkcija nustato mūsų pasirinktinį seansų tvarkyklę, kad ją būtų galima naudoti iškart, kai klasė bus suformuota (t. Y. Pagaminta/pagaminta/sukonstruota).

_konstrukcijos funkcija:

function _construct () {// nustatykite pasirinktines sesijos funkcijas. session_set_save_handler (masyvas ($ šis, 'atviras'), masyvas ($ šis, 'uždaryti'), masyvas ($ šis, 'skaityti'), masyvas ($ šis, 'rašyti'), masyvas ($ šis, 'sunaikinti')), masyvas ($ this, 'gc')); // Ši eilutė apsaugo nuo netikėtų padarinių, kai objektai naudojami kaip išsaugojimo tvarkytojai. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Žingsnis 3. Sukurkite start_session funkciją

Ši funkcija bus iškviesta kiekvieną kartą, kai norite pradėti naują seansą, naudokite ją vietoj session_start ();. Žiūrėkite kodo komentarus, kad sužinotumėte, ką daro kiekviena eilutė.

funkcija start_session:

funkcija start_session ($ session_name, $ secure) {// Įsitikinkite, kad sesijos slapukas nepasiekiamas naudojant „JavaScript“. $ httponly = tiesa; // Hash algoritmas, naudojamas sesijai. (naudokite hash_algos (), kad gautumėte galimų maišų sąrašą.) $ session_hash = 'sha512'; // Patikrinkite, ar maišos nėra, jei (in_array ($ session_hash, hash_algos ()))) {// Nustatykite funkciją has. ini_set ('session.hash_function', $ session_hash); } // Kiek bitų turi maišos simbolis. // Galimos reikšmės yra „4“(0–9, a – f), „5“(0–9, a – v) ir „6“(0–9, a – z, A – Z, „-“, „,“). ini_set ('session.hash_bits_per_character', 5); // Priversti seansą naudoti tik slapukus, o ne URL kintamuosius. ini_set ('session.use_only_cookies', 1); // Gauti seanso slapukų parametrus $ cookieParams = session_get_cookie_params (); // Nustatykite parametrus session_set_cookie_params ($ cookieParams ["life"], $ cookieParams ["path"], $ cookieParams ["domain"], $ secure, $ httponly); // Keisti seanso pavadinimą session_name ($ session_name); // Dabar mes pradėsime sesiją session_start (); // Ši eilutė atkuria seansą ir ištrina seną. // Taip pat sukuriamas naujas šifravimo raktas duomenų bazėje. session_regenerate_id (tiesa); }

2238751 7
2238751 7

Žingsnis 4. Sukurkite atvirą funkciją

Šią funkciją iškvies PHP seansai, kai pradėsime naują seansą, ją naudosime naujam duomenų bazės ryšiui užmegzti.

atvira funkcija:

function open () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = naujas mysqli ($ host, $ user, $ pass, $ name); $ tai-> db = $ mysqli; grįžti tiesa; }

2238751 8
2238751 8

Žingsnis 5. Sukurkite uždarymo funkciją

Ši funkcija bus iškviesta, kai norėsite uždaryti seansus.

uždarymo funkcija:

function close () {$ this-> db-> close (); grįžti tiesa; }

2238751 9
2238751 9

Žingsnis 6. Sukurkite skaitymo funkciją

Šią funkciją iškvies PHP, kai bandysime pasiekti sesiją, pavyzdžiui, kai naudosime echo $ _SESSION ['kažkas'];. Kadangi viename puslapyje gali būti daug iškvietimų į šią funkciją, mes naudojame paruoštus pareiškimus ne tik dėl saugumo, bet ir dėl našumo. Mes parengiame pareiškimą tik vieną kartą, tada galime jį įvykdyti daug kartų.

Taip pat iššifruojame duomenų bazėje užšifruotus seanso duomenis. Savo seansuose naudojame 256 bitų AES šifravimą.

skaitymo funkcija:

funkcija skaityti ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> pasiruošti ("PASIRINKTI duomenis iš seansų WHERE id =? LIMIT 1"); } $ this-> read_stmt-> bind_param ('s', $ id); $ this-> read_stmt-> vykdyti (); $ this-> read_stmt-> store_result (); $ this-> read_stmt-> bind_result ($ duomenys); $ this-> read_stmt-> parsisiųsti (); $ raktas = $ tai-> getkey ($ id); $ data = $ this-> iššifruoti ($ data, $ key); grąžinti $ duomenis; }

2238751 10
2238751 10

Žingsnis 7. Sukurkite rašymo funkciją

Ši funkcija naudojama, kai seansui priskiriame vertę, pvz., $ _SESSION ['something'] = 'kažkas kita';. Funkcija užšifruoja visus į duomenų bazę įterptus duomenis.

rašymo funkcija:

function write ($ id, $ data) {// Gauti unikalų raktą $ key = $ this-> getkey ($ id); // Šifruoti duomenis $ data = $ this-> encrypt ($ data, $ key); $ laikas = laikas (); if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> pasiruošti ("REPLACE INTO session (id, set_time, data, session_key) VALUES (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('sis', $ id, $ time, $ data, $ key); $ this-> w_stmt-> vykdyti (); grįžti tiesa; }

2238751 11
2238751 11

Žingsnis 8. Sukurkite sunaikinimo funkciją

Ši funkcija ištrina seansą iš duomenų bazės, ją naudoja php, kai mes vadiname tokias funkcijas kaip session_destroy ();.

sunaikinimo funkcija:

funkcija sunaikinti ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> pasiruošti ("Ištrinti iš seansų WHERE id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> vykdyti (); grįžti tiesa; }

2238751 12
2238751 12

Žingsnis 9. Sukurkite funkciją gc (šiukšlių surinkėjas)

Ši funkcija yra šiukšlių surinkimo funkcija, vadinama ištrinti senus seansus. Šios funkcijos iškvietimo dažnį lemia dvi konfigūracijos direktyvos: session.gc_probability ir session.gc_divisor.

funkcija gc ():

funkcija gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> pasiruošti ("Ištrinti iš seansų WHERE set_time <?"); } $ old = time () - $ max; $ this-> gc_stmt-> bind_param ('s', $ senas); $ this-> gc_stmt-> vykdyti (); grįžti tiesa; }

2238751 13
2238751 13

Žingsnis 10. Sukurkite „getKey“funkciją

Ši funkcija naudojama norint gauti unikalų šifravimo raktą iš seansų lentelės. Jei sesijos nėra, ji tiesiog grąžina naują atsitiktinį raktą šifravimui.

getkey () Funkcija:

privati funkcija getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> prep ("SELECT session_key FROM session WHERE id =? LIMIT 1"); } $ this-> key_stmt-> bind_param ('s', $ id); $ this-> key_stmt-> vykdyti (); $ this-> key_stmt-> store_result (); if ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ raktas); $ this-> key_stmt-> parsisiųsti (); grįžti $ klavišas; } else {$ random_key = maiša ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); return $ random_key; }}

2238751 14
2238751 14

Žingsnis 11. Sukurkite šifravimo ir iššifravimo funkcijas

Šios funkcijos užšifruoja seansų duomenis, naudoja šifravimo raktą iš duomenų bazės, kuris yra skirtingas kiekvienai sesijai. Mes tiesiogiai nenaudojame to rakto šifruodami, bet naudojame jį, kad raktų maiša būtų dar labiau atsitiktinė.

šifruoti () ir iššifruoti () funkcijas:

privačios funkcijos šifravimas ($ data, $ key) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ key = substr (maiša ('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, $ raktas, $ data, MCRYPT_MODE_ECB, iv $)); return $ šifruotas; } privačios funkcijos iššifravimas ($ data, $ key) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ key = substr (maiša ('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, $ raktas, base64_decode ($ data), MCRYPT_MODE_ECB, iv $); $ atšifruotas = rtrim ($ iššifruotas, "\ 0"); return $ iššifruotas; }

2238751 15
2238751 15

Žingsnis 12. Baigti klasę

Čia tik baigiame garbanotus skliaustus:

Pabaigos klasė:

}

3 iš 3 metodas: puslapių su sesijomis kūrimas

2238751 16
2238751 16

Žingsnis 1. Sesijų naudojimas su pasirinktiniu seansų tvarkytuvu

Žemiau yra tai, kaip pradėtumėte naują sesiją; turėsite tai įtraukti į kiekvieną puslapį, į kurį norite patekti į seansus, naudokite jį vietoj session_start ();

Sesijos pradžia:

reikalauti ('session.class.php'); $ sesija = nauja sesija (); // Nustatykite į true, jei naudojate https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'Vertė.'; echo $ _SESSION ['kažkas'];

Rekomenduojamas: