Wku

Hur man skapar ett säkert system session managment i PHP och MySQL

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

Hur man skapar ett säkert system session managment i PHP och MySQL. Skapa en MySQL-databas.
Hur man skapar ett säkert system session managment i PHP och MySQL. Skapa en MySQL-databas.

Konfigurera MySQL databas

  1. 1
    Skapa 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.
  2. 2
    Skapa 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.
  3. 3
    Skapa 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

  1. 1
    Skapa klass.
    Ny klass:
      
  2. 2
    Skapa __ 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');  } 
  3. 3
    Skapa 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);   } 
  4. 4
    Skapa ö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;  } 
  5. 5
    Skapa close funktion.
    close funktion:
      Funktionen close () {  $ This -> db -> close ();  return true;  } 
  6. 6
    Skapa 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;  } 
  7. 7
    Skapa 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;  } 
  8. 8
    Skapa 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;  } 
  9. 9
    Skapa 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;  } 
  10. 10
    Skapa 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;  }  } 
  11. 11
    Skapa 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;  } 
  12. 12
    Avsluta klass.
    Slut klass:
      } 

Skapa sidor med sessioner

  1. 1
    Anvä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: