Wkuno

Hvordan lage en sikker sesjon managment system i PHP og MySQL

Denne guiden vil vise deg hvordan du kan lagre dine økter sikkert i en MySQL database. Vi vil også kryptere alle session data som går inn i databasen, som betyr at hvis noen klarer å hacke inn i databasen alle session data er kryptert med 256-bit AES-kryptering.

Trinn

Hvordan lage en sikker sesjon managment system i PHP og MySQL. Lag en mysql database.
Hvordan lage en sikker sesjon managment system i PHP og MySQL. Lag en mysql database.

Konfigurer mysql database

  1. 1
    Lag en mysql database.
    Se hvordan du Create-a-database-in-phpmyadmin.
    Lag database kode:
      

    Merk: Enkelte vertstjenester ikke tillate deg å lage en database via phpMyAdmin, Lær hvordan du gjør det i cPanel.
  2. 2
    Lag en bruker med bare velge, sette inn og slette privilegier.
    • Bruker: "sec_user"
    • Passord: "eKcGZr59zAa2BEWU"

    Opprett bruker koden:
      

    Merk: Det er en god idé å endre passordet i koden ovenfor når du kjører på din egen server. (Pass på at du endrer din PHP-kode også.) Husk at det ikke trenger å være et passord som du kan huske så gjør det så komplisert som mulig. Her er et tilfeldig passord generator.
  3. 3
    Lag en mysql tabell kalt "sessions".
    Skape "sessions" tabell:
      

    Vi bruker CHAR datatype for felt vi kjenner lengden, som felt "id" og "session_key" vil alltid være 128 tegn. Ved hjelp av CHAR her sparer på prosessorkraft.

Lag session.class.php fil

  1. 1
    Lag klassen.
    Ny klasse:
      
  2. 2
    Lag __ construct funksjon.
    Denne funksjonen setter vår tilpasset sesjon behandleren slik at den er klar for bruk så snart som den klassen er instansiert (dvs. laget / bygd / konstruert).
    __construct funksjon:
      funksjon __ construct () {  / / Satt våre egne session funksjoner.      / / Denne linjen forhindrer uventede effekter ved bruk av gjenstander som sparer handlere.  register_shutdown_function ('session_write_close');  } 
  3. 3
    Lag start_session funksjon.
    start_session funksjon:
      funksjon start_session ($ session_name, $ sikker) {  / / Pass på at session cookie er ikke tilgjengelig via javascript.  $ Httponly = true;    / / Hash algoritme som skal brukes for sesjons. (Bruk hash_algos () for å få en liste over tilgjengelige hasher.)  $ Session_hash = 'SHA512';    / / Sjekk om hasj er tilgjengelig  if (in_array ($ session_hash, hash_algos ())) {  / / Sett har funksjon.  ini_set ('session.hash_function', $ session_hash);  }  / / Hvor mange biter per tegn av hasj.  / / De mulige verdiene er '4 '(0-9, AF), '5' (0-9, av), og '6 '(0-9, az, AZ, "-", ",").  ini_set ('session.hash_bits_per_character', 5);    / / Tving økten for å bare bruke informasjonskapsler, ikke URL variabler.  ini_set ('session.use_only_cookies', 1);    / / Få session cookie parametere  $ CookieParams = session_get_cookie_params ();   / / Sett parametrene    / / Endre økten navn  session_name ($ session_name);  / / Nå har vi katt starte økten  session_start ();  / / Denne linjen regenererer økten og slette den gamle.  / / Det genererer også en ny krypteringsnøkkel i databasen.  session_regenerate_id (true);   } 
  4. 4
    Lag åpen funksjon.
    open funksjon:
      funksjon open () {  $ Host = 'localhost';  $ User = 'sec_user';  $ Pass = 'eKcGZr59zAa2BEWU';  $ Name = 'secure_sessions';  $ Mysqli = new mysqli ($ host, $ bruker, $ pass, $ navn);  $ Dette -> db = $ ​​mysqli;  return true;  } 
  5. 5
    Lag tett funksjon.
    nært funksjon:
      funksjon close () {  $ Dette -> db -> close ();  return true;  } 
  6. 6
    Lag lese funksjon.
    Vi har også dekryptere session data som er kryptert i databasen. Vi bruker 256-bit AES-kryptering i våre økter.
    Lesefunksjonen:
      funksjon read ($ id) {  if (isset ($ dette -> read_stmt)) {  $ Dette -> read_stmt = $ dette -> db -> forberede ("velge data fra økter WHERE id = LIMIT 1?");  }  $ Dette -> read_stmt -> bind_param ('s', $ id);  $ Dette -> read_stmt -> utføre ();  $ Dette -> read_stmt -> store_result ();  $ Dette -> read_stmt -> bind_result ($ data);  $ Dette -> read_stmt -> hente ();  $ Key = $ dette -> getKey ($ id);  $ Data = $ this -> dekryptere ($ data, $ key);  returnere $ data;  } 
  7. 7
    Lag skrive funksjon.
    skrive funksjon:
      funksjon write ($ id, $ data) {  / / Få unik nøkkel  $ Key = $ dette -> getKey ($ id);  / / Kryptere dataene  $ Data = $ this -> kryptere ($ data, $ key);    $ Tid = tid ();  if (isset ($ dette -> w_stmt)) {  $ Dette -> w_stmt = $ dette -> db -> forberede ("BYTT TIL økter (id, set_time, data, session_key) VALUES (,,,)??");  }    $ Dette -> w_stmt -> bind_param (Siss ​​', $ id, $ tid, $ data, $ key);  $ Dette -> w_stmt -> utføre ();  return true;  } 
  8. 8
    Lag ødelegge funksjonen.
    ødelegge funksjon:
      fungere ødelegge ($ id) {  if (isset ($ dette -> delete_stmt)) {  $ Dette -> delete_stmt = $ dette -> db -> forberede ("DELETE FROM økter WHERE id =?");  }  $ Dette -> delete_stmt -> bind_param ('s', $ id);  $ Dette -> delete_stmt -> utføre ();  return true;  } 
  9. 9
    Lag gc (garbage collector)-funksjonen.
    GC ()-funksjonen:
      funksjon gc ($ max) {  if (isset ($ dette -> gc_stmt)) {  $ Dette -> gc_stmt = $ dette -> db -> forberede ("DELETE FROM økter WHERE set_time <?");  }  $ Gammel = tid () - $ max;  $ Dette -> gc_stmt -> bind_param ('s', $ gammel);  $ Dette -> gc_stmt -> utføre ();  return true;  } 
  10. 10
    Lag getKey funksjon.
    getKey () Funksjon:
      privat funksjon getKey ($ id) {  if (isset ($ dette -> key_stmt)) {  $ Dette -> key_stmt = $ dette -> db -> forberede ("SELECT session_key FRA økter WHERE id = LIMIT 1?");  }  $ Dette -> key_stmt -> bind_param ('s', $ id);  $ Dette -> key_stmt -> utføre ();  $ Dette -> key_stmt -> store_result ();  if ($ dette -> key_stmt -> NUM_ROWS == 1) {   $ Dette -> key_stmt -> bind_result ($ key);  $ Dette -> key_stmt -> hente ();  returnere $ key;  } Else {  $ Random_key = hash ('SHA512', uniqid (mt_rand (1, mt_getrandmax ()), true));  returnere $ random_key;  }  } 
  11. 11
    Lag kryptere og dekryptere funksjoner.
    kryptere () og dekryptere () funksjoner:
      privat funksjon kryptere ($ 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);  $ Kryptert = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ key, $ data, MCRYPT_MODE_ECB, $ iv));  returnere $ kryptert;  }  privat funksjon dekryptere ($ 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);  $ Dekryptert = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ key, base64_decode ($ data), MCRYPT_MODE_ECB, $ iv);  returnere $ dekryptert;  } 
  12. 12
    Ende klasse.
    End-klasse:
      } 

Opprette sider med økter

  1. 1
    Bruke økter med tilpasset session manager.
    Under den hvor du vil starte en ny sesjon, ville du trenger å inkludere dette hver side du ønsker å få tilgang til økter, bruke den i stedet for session_start ();
    Starte en sesison: