Denna guide visar dig hur du kan lagra dina sessioner säkert i en MySQL-databas. Vi kommer också att kryptera alla sessionens data som går in i databasen, vilket innebär att om någon lyckas hacka sig in i databasen all session data krypteras med 256-bitars AES-kryptering.
Steg
Konfigurera MySQL databas
- 1Skapa en MySQL-databas.
Se hur du Create-a-databas-in-phpMyAdmin.
Skapa databas kod:
Obs: Vissa webbhotell tjänster inte tillåter dig att skapa en databas genom phpMyAdmin, Lär dig hur man gör det i cPanel. - 2Skapa en användare med enbart välja, infoga och ta bort privilegier.
- Användare: "sec_user"
- Lösenord: "eKcGZr59zAa2BEWU"
Skapa användarkod:
Obs: Det är en bra idé att ändra lösenordet i koden ovan när du kör på din egen server. (Se till att du ändrar din PHP-kod också.) Kom ihåg att det inte behöver vara ett lösenord som du kan komma ihåg så se till så komplicerat som möjligt. Här är ett slumpmässigt lösenord generator. - 3Skapa en MySQL tabell som heter "sessioner".
Skapa "sessions" tabell:
Vi använder CHAR datatyp för fält vi vet längden på, som sätter "id" och "session_key" kommer alltid att vara 128 tecken långt. Använda CHAR här sparar processorkraft.
Skapa session.class.php fil
- 1Skapa klass.
Ny klass: - 2Skapa __ konstrukt funktion.
Denna funktion ställer vår egen session handler så det är tillgängligt för användning så snart klassen instansieras (dvs. gjort / byggt / konstruerat).
__construct funktion:funktion __ construct () { / / Ställa våra egna session funktioner. / / Denna rad förhindrar oväntade effekter vid användning av föremål som sparar hanterare. register_shutdown_function ('session_write_close'); }
- 3Skapa start_session funktion.
start_session funktion:Funktionen start_session ($ session_name, $ säker) { / / Se till session cookie är inte åtkomlig via javascript. $ HttpOnly = true; / / Hashalgoritm att använda för sessionid. (Använd hash_algos () för att få en lista över tillgängliga hashar.) $ Session_hash = 'SHA512'; / / Kontrollera om hash är tillgänglig if (in_array ($ session_hash, hash_algos ())) { / / Ställ in har funktionen. ini_set ('session.hash_function', $ session_hash); } / / Hur många bitar per tecken i hash. / / De möjliga värdena är 4 "(0-9, AF), 5" (0-9, AV), och '6 '(0-9, az, AZ, "-", ","). ini_set ('session.hash_bits_per_character', 5); / / Tvinga sessionen att bara använda cookies, inte URL variabler. ini_set ('session.use_only_cookies ", 1); / / Hämta parametrar sessionscookie $ CookieParams = session_get_cookie_params (); / / Ställ in parametrarna / / Ändra sessionen namn session_name ($ session_name); / / Nu har vi katten starta sessionen session_start (); / / Denna linje regenererar sessionen och radera den gamla. / / Det genererar också en ny krypteringsnyckel i databasen. session_regenerate_id (true); }
- 4Skapa öppen funktion.
öppen funktion:funktionen open () { $ Host = 'localhost'; $ User = 'sec_user'; $ Pass = 'eKcGZr59zAa2BEWU'; $ Namn = 'secure_sessions'; $ Mysqli = ny mysqli ($ host, $ user, $ pass, $ namn); $ This -> db = $ mysqli; return true; }
- 5Skapa close funktion.
close funktion:Funktionen close () { $ This -> db -> close (); return true; }
- 6Skapa läsa funktion.
Vi har även dekryptera sessionens data som är krypterade i databasen. Vi använder 256-bitars AES-kryptering i våra sessioner.
läs funktion:Funktionen read ($ id) { if (isset ($ this -> read_stmt)) { $ This -> read_stmt = $ this -> db -> förbereda ("välja data från sessioner där id = GRÄNS 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 -> fetch (); $ Key = $ this -> getKey ($ id); $ Uppgifter = $ this -> dekryptera ($ data $ key); return $ data; }
- 7Skapa skriva funktion.
skriva funktion:funktion write ($ id, $ data) { / / Get unik nyckel $ Key = $ this -> getKey ($ id); / / Kryptera data $ Uppgifter = $ this -> Kryptera ($ data $ key); $ Tid = tid (); if (isset ($ this -> w_stmt)) { $ This -> w_stmt = $ this -> db -> förbereda ("BYT TILL sessioner (id, set_time, uppgifter, session_key) VALUES (,,,)????"); } $ This -> w_stmt -> bind_param ('Siss', $ id, $ tid, $ data $ key); $ This -> w_stmt -> execute (); return true; }
- 8Skapa förstöra funktion.
förstör funktionen:fungera förstöra ($ id) { if (isset ($ this -> delete_stmt)) { $ This -> delete_stmt = $ this -> db -> förbereda ("DELETE FROM sessioner där id =?"); } $ This -> delete_stmt -> bind_param ('s', $ id); $ This -> delete_stmt -> execute (); return true; }
- 9Skapa gc (garbage collector) funktionen.
gc () funktionen:funktion gc ($ max) { if (isset ($ this -> gc_stmt)) { $ This -> gc_stmt = $ this -> db -> förbereda ("DELETE FROM sessioner där set_time <?"); } $ Old = tid () - $ max; $ This -> gc_stmt -> bind_param ('s', $ gammal); $ This -> gc_stmt -> execute (); return true; }
- 10Skapa getKey funktion.
getKey () Funktion:private function getKey ($ id) { if (isset ($ this -> key_stmt)) { $ This -> key_stmt = $ this -> db -> förbereda ("SELECT session_key FROM sessioner där id = GRÄNS 1?"); } $ This -> key_stmt -> bind_param ('s', $ id); $ This -> key_stmt -> execute (); $ This -> key_stmt -> store_result (); if ($ this -> key_stmt -> NUM_ROWS == 1) { $ This -> key_stmt -> bind_result ($ key); $ This -> key_stmt -> fetch (); return $ nyckel; } Else { $ Random_key = hash ('SHA512', uniqid (mt_rand (1, mt_getrandmax ()), true)); return $ random_key; } }
- 11Skapa kryptera och dekryptera funktioner.
kryptera () och dekryptera () funktioner:privata tillställningar kryptera ($ data $ key) { $ Salt = "CH swe retReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH!"; $ Key = substr (hash ('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); $ Krypterad = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ key, $ data, MCRYPT_MODE_ECB, $ iv)); return $ krypterat; } private function dekryptera ($ data $ key) { $ Salt = "CH swe retReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH!"; $ Key = substr (hash ('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); $ Dekrypteras = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ key, base64_decode ($ data), MCRYPT_MODE_ECB, $ iv); return $ dekrypteras; }
- 12Avsluta klass.
Slut klass:}
Skapa sidor med sessioner
- 1Använda sessioner med den anpassade sessionsövervakaren.
Nedanför det hur du vill starta en ny session, skulle du behöva inkludera detta varje sida du vill för att komma till sessionerna, använda det istället för session_start ();
Starta en sesison: