3 maniere om 'n veilige sessiebestuurstelsel in PHP en MySQL te skep

INHOUDSOPGAWE:

3 maniere om 'n veilige sessiebestuurstelsel in PHP en MySQL te skep
3 maniere om 'n veilige sessiebestuurstelsel in PHP en MySQL te skep

Video: 3 maniere om 'n veilige sessiebestuurstelsel in PHP en MySQL te skep

Video: 3 maniere om 'n veilige sessiebestuurstelsel in PHP en MySQL te skep
Video: HOE LEER JE PROGRAMMEREN? | Programmeren voor beginners (2020) 2024, April
Anonim

Hierdie gids sal u wys hoe u u sessies veilig in 'n mySQL -databasis kan stoor. Ons sal ook alle sessiedata wat in die databasis ingegaan word, enkripteer, wat beteken dat as iemand daarin slaag om die databasis in te hack, alle sessiedata deur 256-bis AES-kodering geïnkripteer word.

Stappe

Metode 1 van 3: Stel mySQL -databasis op

2238751 1
2238751 1

Stap 1. Skep 'n MySQL -databasis

In hierdie gids skep ons 'n databasis genaamd "secure_sessions".

Kyk hoe u 'n databasis-in-phpMyAdmin kan skep.

Of u kan die onderstaande SQL -kode gebruik om een vir u te skep.

Skep databasiskode:

SKEP DATABASIS `secure_sessions`;

Opmerking: sommige gasheerdienste laat u nie toe om 'n databasis deur phpMyAdmin te skep nie; leer hoe u dit in cPanel kan doen.

2238751 2
2238751 2

Stap 2. Skep 'n gebruiker met slegs SELECT, INSERT en DELETE voorregte

Dit beteken dat as daar ooit 'n sekuriteitsbreuk in ons skrif was, die hacker nie tabelle uit ons databasis kon laat val nie. As u regtig paranoïes is, skep 'n ander gebruiker vir elke funksie.

  • Gebruiker:

    "sek_gebruiker"

  • Wagwoord:

    "eKcGZr59zAa2BEWU"

Skep gebruikerskode:

SKEP GEBRUIKER 'sec_user'@'localhost' IDENTIFICED BY 'eKcGZr59zAa2BEWU'; TOEEKEN SELECT, INSERT, UPDATE, DELETE ON `secure_sessions`.* TO 'sec_user'@'localhost';

Opmerking: dit is 'n goeie idee om die wagwoord in die kode hierbo te verander wanneer u op u eie bediener werk. (Maak seker dat u ook u PHP -kode verander.) Onthou dat dit nie 'n wagwoord hoef te wees wat u kan onthou nie, sodat dit so ingewikkeld moontlik is. Hier is 'n ewekansige wagwoordgenerator.

2238751 3
2238751 3

Stap 3. Skep 'n MySQL -tabel met die naam "sessies"

Die onderstaande kode skep 'n tabel met 4 velde (id, set_time, data, session_key).

Skep die tabel "sessies":

SKEP TAFEL `sessies` (` id` char (128) NOT NULL, `set_time` char (10) NOT NULL,` data` text NOT NULL, `session_key` char (128) NOT NULL, PRIMARY KEY (` id`)) ENGINE = InnoDB STANDAARD CHARSET = latin1;

Ons gebruik die CHAR -datatipe vir velde waarvan ons die lengte ken, aangesien die velde "id" en "session_key" altyd 128 karakters lank sal wees. Deur CHAR hier te gebruik, bespaar u die verwerkingskrag.

Metode 2 van 3: Skep 'n session.class.php -lêer

2238751 4
2238751 4

Stap 1. Skep klas

Om 'n nuwe klas te begin, moet u die onderstaande kode invoer:

Nuwe klas:

klas sessie {

2238751 5
2238751 5

Stap 2. Skep _construct -funksie

Hierdie funksie word genoem elke keer as ons 'n nuwe voorbeeld van 'n voorwerp skep met behulp van die 'sessie' klas. U kan hier lees oor die PHP _construct -funksie.

Hierdie funksie stel ons pasgemaakte sessiehanteerder in sodat dit beskikbaar is vir gebruik sodra die klas geïnstalleer is (dit wil sê, gemaak/gebou/gebou).

_konstruksie funksie:

funksie _construct () {// stel ons persoonlike sessiefunksies in. session_set_save_handler (array ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'destroy'), array ($ this, 'gc'))); // Hierdie reël voorkom onverwagte effekte by die gebruik van voorwerpe as stoorhanteerders. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Stap 3. Skep start_session funksie

Hierdie funksie word elke keer as u 'n nuwe sessie wil begin, gebruik, in plaas van session_start ();. Sien die opmerkings in die kode om te sien wat elke reël doen.

start_session funksie:

funksie start_session ($ session_name, $ secure) {// Maak seker dat die sessiekoekie nie via javascript toeganklik is nie. $ httponly = true; // Hash -algoritme om vir die sessie te gebruik. (gebruik hash_algos () om 'n lys met beskikbare hashes te kry.) $ session_hash = 'sha512'; // Kontroleer of hash beskikbaar is as (in_array ($ session_hash, hash_algos ())) {// Stel die has -funksie in. ini_set ('session.hash_function', $ session_hash); } // Hoeveel bisse per karakter van die hash. // Die moontlike waardes is '4' (0-9, a-f), '5' (0-9, a-v) en '6' (0-9, a-z, A-Z, "-", ","). ini_set ('session.hash_bits_per_character', 5); // Dwing die sessie om slegs koekies te gebruik, nie URL -veranderlikes nie. ini_set ('session.use_only_cookies', 1); // Kry sessiekoekie -parameters $ cookieParams = session_get_cookie_params (); // Stel die parameters session_set_cookie_params in ($ cookieParams ["lifetime"], $ cookieParams ["path"], $ cookieParams ["domain"], $ secure, $ httponly); // Verander die sessie se naam session_name ($ session_name); // Nou begin ons die sessie session_start (); // Hierdie reël herstel die sessie en verwyder die ou. // Dit genereer ook 'n nuwe enkripsiesleutel in die databasis. session_regenerate_id (waar); }

2238751 7
2238751 7

Stap 4. Skep oop funksie

Hierdie funksie word deur die PHP -sessies genoem wanneer ons 'n nuwe sessie begin; ons gebruik dit om 'n nuwe databasisverbinding te begin.

oop funksie:

funksie open () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = nuwe mysqli ($ gasheer, $ gebruiker, $ pas, $ naam); $ this-> db = $ mysqli; terugkeer waar; }

2238751 8
2238751 8

Stap 5. Skep sluitfunksie

Hierdie funksie word genoem wanneer die sessies gesluit wil word.

sluit funksie:

funksie close () {$ this-> db-> close (); terugkeer waar; }

2238751 9
2238751 9

Stap 6. Skep leesfunksie

Hierdie funksie word deur PHP genoem wanneer ons probeer om toegang tot 'n sessie te verkry, byvoorbeeld as ons echo $ _SESSION ['iets'];. Omdat daar baie oproepe na hierdie funksie op 'n enkele bladsy kan wees, trek ons voordeel uit voorbereide verklarings, nie net vir veiligheid nie, maar ook vir prestasie. Ons berei die verklaring slegs een keer voor, dan kan ons dit baie keer uitvoer.

Ons ontsyfer ook die sessiedata wat in die databasis geïnkripteer is. Ons gebruik 256-bis AES-kodering in ons sessies.

lees funksie:

funksie lees ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> berei voor ("SELECT data FROM Sessions WHERE id =? LIMIT 1"); } $ this-> read_stmt-> bind_param ('s', $ id); $ this-> read_stmt-> execute (); $ this-> read_stmt-> store_result (); $ this-> read_stmt-> bind_result ($ data); $ this-> read_stmt-> haal (); $ sleutel = $ hierdie-> getkey ($ id); $ data = $ hierdie-> ontsyfer ($ data, $ sleutel); gee $ data terug; }

2238751 10
2238751 10

Stap 7. Skep skryffunksie

Hierdie funksie word gebruik wanneer ons 'n waarde aan 'n sessie toewys, byvoorbeeld $ _SESSION ['iets'] = 'iets anders';. Die funksie versleutelt al die data wat in die databasis geplaas word.

skryf funksie:

funksie skryf ($ id, $ data) {// Kry unieke sleutel $ key = $ this-> getkey ($ id); // Enkripteer die data $ data = $ this-> encrypt ($ data, $ key); $ tyd = tyd (); if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> berei voor ("VERVANG IN SESSIES (id, set_time, data, session_key) WAARDES (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> voer () uit; terugkeer waar; }

2238751 11
2238751 11

Stap 8. Skep vernietig funksie

Hierdie funksie verwyder die sessie uit die databasis; dit word deur php gebruik wanneer ons funksies soos session_destroy () noem;.

vernietig funksie:

funksie vernietig ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> berei voor ("DELETE FRAM sessions WHERE id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> execute (); terugkeer waar; }

2238751 12
2238751 12

Stap 9. Skep gc (vullisversamelaar) funksie

Hierdie funksie is die vullisversamelaarfunksie wat dit genoem word om ou sessies te verwyder. Die frekwensie waarin hierdie funksie genoem word, word bepaal deur twee konfigurasie -voorskrifte, session.gc_probability en session.gc_divisor.

gc () funksie:

funksie gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> berei voor ("DELETE OF Sessions WHERE set_time <?"); } $ old = time () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> voer () uit; terugkeer waar; }

2238751 13
2238751 13

Stap 10. Skep getKey -funksie

Hierdie funksie word gebruik om die unieke sleutel vir kodering uit die sessietabel te haal. As daar geen sessie is nie, gee dit net 'n nuwe ewekansige sleutel vir kodering terug.

getkey () Funksie:

private funksie getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> berei voor ("SELECT session_key FROM sessions WHERE id =? LIMIT 1"); } $ this-> key_stmt-> bind_param ('s', $ id); $ this-> key_stmt-> execute (); $ this-> key_stmt-> store_result (); as ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ key); $ this-> key_stmt-> haal (); gee $ sleutel terug; } anders {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), waar)); gee $ random_key terug; }}

2238751 14
2238751 14

Stap 11. Skep enkripteer en ontsyfer funksies

Hierdie funksies versleutel die data van die sessies, hulle gebruik 'n enkripsiesleutel van die databasis wat vir elke sessie anders is. Ons gebruik nie die sleutel direk in die enkripsie nie, maar ons gebruik dit om die sleutelhash nog meer ewekansig te maak.

encrypt () en decrypt () funksies:

private funksie enkripteer ($ data, $ sleutel) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ sleutel = substraat (hash ('sha256', $ sout. $ sleutel. $ sout), 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, $ key, $ data, MCRYPT_MODE_ECB, $ iv)); gee $ geïnkripteer terug; } decrypt private funksie ($ data, $ key) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ sleutel = substraat (hash ('sha256', $ sout. $ sleutel. $ sout), 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, $ key, base64_decode ($ data), MCRYPT_MODE_ECB, $ iv); $ decrypted = rtrim ($ decrypted, "\ 0"); gee $ ontsyferde terug; }

2238751 15
2238751 15

Stap 12. Eindklas

Hier eindig ons net die klasse krulhakies:

Eindklas:

}

Metode 3 van 3: Skep bladsye met sessies

2238751 16
2238751 16

Stap 1. Gebruik sessies met die pasgemaakte sessiebestuurder

Hieronder is hoe u 'n nuwe sessie sou begin; u moet dit op elke bladsy insluit waar u toegang tot die sessies wil hê, gebruik dit in plaas van session_start ();

'N Sessie begin:

vereis ('session.class.php'); $ sessie = nuwe sessie (); // Stel op true as u https $ session-> start_session ('_ s', false) gebruik; $ _SESSION ['something'] = ''n Waarde.'; eggo $ _SESSION ['iets'];

Aanbeveel: