Cum se creează un sistem securizat de gestionare a sesiunilor în php și mysql

Acest ghid vă va arăta cum vă puteți stoca sesiunile în siguranță într-o bază de date MySQL. De asemenea, vom cripta toate datele de sesiune care intră în baza de date, ceea ce înseamnă că dacă cineva reușește să hack în baza de date, datele de sesiune sunt criptate de criptarea AES 256 de biți.

Pași

Metoda 1 din 3:
Configurați baza de date MySQL
  1. Imagine intitulată 2238751 1
1. Creați o bază de date MySQL.
În acest ghid vom crea o bază de date numită "Secure_sesions".
Vedeți cum să Creați-A-Database-In-PhpMyAdmin.
Sau puteți utiliza codul SQL de mai jos va crea unul pentru dvs.

Creați un cod de bază de date:
Creați baza de date "Secure_sesions" -
Notă: Unele servicii de găzduire nu vă permit să creați o bază de date prin PhpMyAdmin, aflați cum să o faceți în cPanel.
  • Imagine intitulată 2238751 2
    2. Creați un utilizator numai cu selectați, introduceți și ștergeți privilegii.
    Aceasta înseamnă că, dacă a existat vreodată o încălcare a securității în scriptul nostru, hackerul nu a putut scădea mesele din baza noastră de date.Dacă sunteți într-adevăr paranoic, creați un utilizator diferit pentru fiecare funcție.

  • Utilizator: "sec_user"
  • Parola: "EKCGZR59ZAA2BEWU"


  • Creați un cod de utilizator:
    Creați utilizatorul "SEC_USER" @ "localhost" identificat de `EKCGZR59ZA2BEWU`-GRANT SELECT, INSERT, Actualizare, Ștergere pe `Secure_sesions".* La "sec_user" @ "localhost"-

    Notă: Este o idee bună să schimbați parola în codul de mai sus când rulați pe serverul propriu. (Asigurați-vă că modificați și codul PHP.) Amintiți-vă că nu este nevoie să existe o parolă pe care o puteți aminti, așa că este cât mai complicată posibil. Iată A parolă aleatorie generator.
  • Imagine intitulată 2238751 3
    3. Creați o masă MySQL numită "sesiuni".
    Codul de mai jos creează o masă cu 4 câmpuri (ID, set_time, date, sesiune_key).

    Creați "sesiuni" masa:
    Creați tabelul `sesiunile" (`id` char (128) nu null,` set_time` char (10) nu null, `Date` text nu Null,` session_key` char (128) Nu nul, cheia primară ("id") ) Motor = InnoDB implicit charset = latin1-
    Folosim tipul de date char pentru câmpurile pe care le cunoaștem lungimea, ca câmpurile "ID" și "sesiune_key" va fi întotdeauna de 128 de caractere lungi. Folosind char aici economisește puterea de procesare.
  • Metoda 2 din 3:
    Creați sesiune.clasă.Fișier PHP
    1. Imagine intitulată 2238751 4
    1. Creați clasa.
    Pentru a începe o nouă clasă, va trebui să introduceți codul de mai jos:

    Clasa nouă:
    sesiune de clasă {
  • Imagine intitulată 2238751 5
    2. Creați funcția __construct.
    Această funcție va fi numită de fiecare dată când creăm o nouă instanță a unui obiect utilizând clasa "sesiune". Puteți citi la funcția PHP __construct Aici.
    Această funcție stabilește manipulatorul de sesiune personalizat, astfel încât să fie disponibil pentru utilizare de îndată ce clasa este instanțiată (i.E., făcut / construit / construit).

    __ Funcția __construct:
    Funcție __construct () {// Setați funcțiile noastre de sesiune personalizate.sesiune_set_save_handler (matrice ($ acest, "deschis"), matrice ($ acest, "aproape"), matrice ($ acest, "citit"), matrice ($ acest, "scrie `), matrice ($ acest lucru," distrugere " ), matrice ($ acest, "gc `)) - // această linie împiedică efectele neașteptate atunci când se utilizează obiecte ca stivuitoare de salvare.Register_shutdown_funcțional (`session_write_close`) -}
  • Imagine intitulată 2238751 6
    3. Creați funcția Start_session.
    Această funcție va fi numită de fiecare dată când doriți să începeți o nouă sesiune, utilizați-o în loc de sesiune_start ()-. Consultați comentariile din cod pentru a vedea ce face fiecare linie.

    Funcția Start_session:
    Funcție Start_session ($ session_name, $ Secure) {// Asigurați-vă că cookie-ul sesiunii nu este accesibil prin jаvascript.$ httponly = algoritmul adevărat - // hash pentru a utiliza pentru sesiune. (utilizați hash_algos () pentru a obține o listă de hashele disponibile.) $ SESIPS_HASH = `SHA512` - // Verificați dacă hash este disponibil (IN_ARARY ($ session_hash, hash_algos ()) {// Setarea funcției are.INI_SET (`sesiune.hash_function `, $ session_hash) -} // Câți biți pe caracterul hashului.// valorile posibile sunt "4 `(0-9, A-F),` 5 `(0-9, A-V) și` 6 `(0-9, A-Z, A-Z, "-", ",").INI_SET (`sesiune.hash_bits_per_character `, 5) - // Force sesiunea pentru utilizarea numai a cookie-urilor, nu variabilele URL.INI_SET (`sesiune.utilizare_only_cookies `, 1) - // obține parametrii cookie-urilor de sesiune $ cookieparams = sesiune_get_cookie_params () - // setați parametriiSession_set_cookie_params ($ cookieparams ["durata de viață"], $ cookieparams ["cale"], $ cookieparams ["domeniu"], $ Secure, $ httponly) - // Schimbați numele sesiunii Session_name ($ session_name) - // Acum, pisica pornesc sesiuneasesion_start () - // această linie regenerează sesiunea și șterge cel vechi. // generează, de asemenea, o nouă cheie de criptare în baza de date. session_regenerate_id (adevărat) -}
  • Imagine intitulată 2238751 7
    4. Creați o funcție deschisă.
    Această funcție va fi numită de sesiunile PHP Când începem o nouă sesiune, o folosim pentru a începe o nouă conexiune a bazei de date.

    Funcție deschisă:
    Funcție Open () {$ Host = `localhost` - $ user = `SEC_USER` - $ pass = `ekcgzr59zaa2bewu` - $ name = `sigure_sesions` - $ mysqli = New Mysqli ($ gazdă, $ utilizator, $ pass, $ ) - $ acest->db = $ mysqli-return true-}
  • Imagine intitulată 2238751 8
    5. Creați o funcție strânsă.
    Această funcție va fi numită atunci când sesiunile doresc să fie închise.

    Funcție strânsă:
    Funcție închide () {$ acest->db->închide () - return true-}
  • Imagine intitulată 2238751 9
    6. Creați funcția de citire.
    Această funcție va fi numită de PHP când încercăm să accesăm o sesiune, de exemplu atunci când folosim Echo $ _session ["Ceva"]-. Deoarece ar putea fi multe apeluri la această funcție pe o singură pagină, profităm de declarațiile pregătite, nu numai pentru securitate, ci și pentru performanță. Pregătim doar declarația o dată atunci o putem executa de multe ori.
    De asemenea, decriptăm datele sesiunii criptate în baza de date. Folosim criptarea AES de 256 de biți în sesiunile noastre.

    Citiți funcția:
    Citiți funcția ($ id) {dacă (!Isset ($ acest->read_stmt)) {$ acest->read_stmt = $ acest->db->a pregati("Selectați datele din sesiuni unde ID = ? Limita 1") -} $ acest->citiți_stmt->bind_param (`s`, $ id) - $ acest->citiți_stmt->Executați () - $ acest->citiți_stmt->magazin_result () - $ acest->citiți_stmt->bind_result ($ date) - $ acest->citiți_stmt->Fetch () - tasta $ = $ acest->getkey ($ id) - $ date = $ acest->decripta ($ date, key $) -return $ date-}
  • Imagine intitulată 2238751 10
    7. Creați o funcție de scriere.
    Această funcție este utilizată atunci când atribuim o valoare unei sesiuni, de exemplu $ _session ["ceva"] = "altceva"-. Funcția criptează toate datele introduse în baza de date.

    Scrierea funcției:
    Funcție Scrieți ($ ID, $ DATA) {// obțineți cheia unică $ key = $ acest->getkey ($ id) - // criptați datele $ date = $ acest->criptați ($ date, key $) - $ time = timp () - dacă (!Isset ($ acest->w_stmt)) {$ acest->w_stmt = $ acest lucru->db->a pregati("Înlocuiți în valorile sesiunilor (id, set_time, date, sesiune_key) (?, ?, ?, ?)") -} $ acest->w_stmt->BIND_PARAM (`SISS`, $ ID, $ TIME, $ DATA, $ cheie) - $ acest->w_stmt->Executare () - return true-}
  • Imagine intitulată 2238751 11
    8. Creați o funcție de distrugere.
    Această funcție șterge sesiunea din baza de date, este utilizată de PHP când numim funcții precum Session__Destroy ()-.

    Distruge funcția:
    Funcția Distruge ($ ID) {IF (!Isset ($ acest->DELETE_STMT)) {$ acest->DELETE_STMT = $ acest->db->a pregati("Ștergeți din sesiunile unde ID = ?") -} $ acest->DELETE_STMT->bind_param (`s`, $ id) - $ acest->DELETE_STMT->Executare () - return true-}
  • Imagine intitulată 2238751 12
    9. Creați funcția GC (colector de gunoi).
    Această funcție este funcția colectorului de gunoi pe care este chemată pentru a șterge sesiunile vechi. Frecvența în care se numește această funcție este determinată de două directive de configurare, sesiune.GC_PROBABILITATEA ȘI SESIUNEA.gc_divisor.

    GC () Funcție:
    Funcția GC ($ max) {dacă (!Isset ($ acest->gc_stmt)) {$ acest->gc_stmt = $ acest->db->a pregati("Ștergeți din sesiunile unde set_time < ?") -} $ vechi = timp () - $ max- $ acest->GC_STMT->bind_param (`s`, $ vechi) - $ acest->GC_STMT->Executare () - return true-}
  • Imagine intitulată 2238751 13
    10. Creați o funcție de getkey.
    Această funcție este utilizată pentru a obține cheia unică pentru criptare din tabelul sesiunilor. Dacă nu există o sesiune, acesta returnează doar o nouă cheie aleatorie pentru criptare.

    Getkey () Funcție:
    Funcția privată Getkey ($ ID) {IF (!Isset ($ acest->key_stmt)) {$ acest->key_stmt = $ acest->db->a pregati("Selectați Session_key de la sesiuni unde ID = ? Limita 1") -} $ acest->key_stmt->bind_param (`s`, $ id) - $ acest->key_stmt->Executați () - $ acest->key_stmt->magazin_result () - dacă ($ acest->key_stmt->num_rows == 1) {$ acest->key_stmt->bind_result (key $) - $ acest->key_stmt->Fetch () - Returnați Key-} Alte {$ RANDOM_KEY = Hash ("SHA512 `, UNIQID (MT_RAND (1, MT_GETRANDMAX ()), TRUE)) - RETURN $ RANDOM_KEY-}}
  • Imagine intitulată 2238751 14
    11. Creați funcțiile de criptare și decriptare.
    Aceste funcții criptează datele sesiunilor, utilizează o cheie de criptare din baza de date care este diferită pentru fiecare sesiune. Nu folosim în mod direct acea cheie în criptare, dar o folosim pentru a face ca cheia Hash să fie și mai întâmplare.

    Criptarea () și decripta () Funcții:
    Funcția privată criptați ($ date, key $) {$ sare = `ch!Swy!retregu7w6bedrup7usuduh9thed2chege * EWR4N39 = E @ RASP7C-PH @ PH `- $ KEY = substr (hash (SHA256`, $ sare.tasta $.$ sare), 0, 32) - $ iv_size = mcrypt_get_iv_size (mcrypt_rmodeel_ecb_256, mcrypt_mode_ecb) - $ iv = mcrypt_create_iv ($ iv_size, mcrypt_rand) - $ criptate = base64_encode (mcrypt_roencrypt (mcrypt_rijndael_256, tasta $, $ date, mcrypt_mode_ecb, $ iv) ) -Rectuați $ criptate -} Funcție privată Decriptare ($ date, $ cheie) {$ sare = `ch!Swy!retregu7w6bedrup7usuduh9thed2chege * EWR4N39 = E @ RASP7C-PH @ PH `- $ KEY = substr (hash (SHA256`, $ sare.tasta $.$ sare), 0, 32) - $ iv_size = mcrypt_get_iv_size (mcrypt_rmode_ecb_256, mcrypt_mode_ecb) - $ iv = mcrypt_create_iv ($ iv_size, mcrypt_rand) - $ decriptat = mcrypt_decrypt (mcrypt_rijndael_256, $ cheie, base64_decode ($ date), mcrypt_mode_ecb, $ IV ) - $ decriptat = RTRIM ($ decriptat, " 0") -Recture $ decriptat-}
  • Imagine intitulată 2238751 15
    12. Clasa de sfârșit.
    Aici, doar terminăm clasele Curly paranteze:

    Clasa finală:
    }
  • Metoda 3 din 3:
    Crearea de pagini cu sesiuni
    1. Imagine intitulată 2238751 16
    1. Utilizarea sesiunilor cu managerul de sesiune personalizat.
    Mai jos este modul în care veți începe o nouă sesiune - ar trebui să includeți acest lucru pe fiecare pagină pe care doriți să o accesați la sesiuni, utilizați-l în loc de sesiune_start ()-

    Pornirea unei sesiuni:
    necesită ("sesiune.clasă.php `) - $ sesiune = noua sesiune () - // setat la TRUE dacă utilizați HTTPS $ sesiune->Start_session (`_ S`, Fals) - $ _ Sesiune ["Ceva"] = "o valoare."-Echo $ _session [" ceva "]-

    sfaturi

    Partajați pe rețeaua socială:
    Similar