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 MySQL1. 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:
Î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" -
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.
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.
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.
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:
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-
Metoda 2 din 3:
Creați sesiune.clasă.Fișier PHP1. Creați clasa.
Pentru a începe o nouă clasă, va trebui să introduceți codul de mai jos:
Clasa nouă:
Pentru a începe o nouă clasă, va trebui să introduceți codul de mai jos:
Clasa nouă:
sesiune de clasă {
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:
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`) -}
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:
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) -}
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ă:
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-}
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ă:
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-}
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:
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-}
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:
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-}
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:
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-}
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:
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-}
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:
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-}}
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:
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-}
12. Clasa de sfârșit.
Aici, doar terminăm clasele Curly paranteze:
Clasa finală:
Aici, doar terminăm clasele Curly paranteze:
Clasa finală:
}
Metoda 3 din 3:
Crearea de pagini cu sesiuni1. 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:
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ă: