3 tapaa luoda turvallinen istunnonhallintajärjestelmä PHP: ssä ja MySQL: ssä

Sisällysluettelo:

3 tapaa luoda turvallinen istunnonhallintajärjestelmä PHP: ssä ja MySQL: ssä
3 tapaa luoda turvallinen istunnonhallintajärjestelmä PHP: ssä ja MySQL: ssä

Video: 3 tapaa luoda turvallinen istunnonhallintajärjestelmä PHP: ssä ja MySQL: ssä

Video: 3 tapaa luoda turvallinen istunnonhallintajärjestelmä PHP: ssä ja MySQL: ssä
Video: 10,5 M $ 2020 ALPHA 38M / 125' SuperYacht Tour Liveaboard Charter Flybridge Motor Yacht 2024, Huhtikuu
Anonim

Tämä opas näyttää, kuinka voit tallentaa istuntosi turvallisesti mySQL -tietokantaan. Salamme myös kaikki tietokantaan menevät istuntotiedot, mikä tarkoittaa, että jos joku onnistuu murtautumaan tietokantaan, kaikki istuntotiedot on salattu 256-bittisellä AES-salauksella.

Askeleet

Tapa 1 /3: Määritä mySQL -tietokanta

2238751 1
2238751 1

Vaihe 1. Luo MySQL -tietokanta

Tässä oppaassa luomme tietokannan nimeltä "secure_sessions".

Katso, miten voit luoda tietokannan phpMyAdminiin.

Tai voit käyttää alla olevaa SQL -koodia luodaksesi sellaisen sinulle.

Luo tietokantakoodi:

CREATE DATABASE `secure_sessions`;

Huomautus: Jotkin isännöintipalvelut eivät salli tietokannan luomista phpMyAdminin kautta. Opi tekemään se cPanelissa.

2238751 2
2238751 2

Vaihe 2. Luo käyttäjä, jolla on vain SELECT-, INSERT- ja DELETE -käyttöoikeudet

Tämä tarkoittaa, että jos skriptissämme tapahtui tietoturvaloukkaus, hakkeri ei voinut pudottaa taulukoita tietokannastamme. Jos olet todella vainoharhainen, luo jokaiselle toiminnolle eri käyttäjä.

  • Käyttäjä:

    "sec_user"

  • Salasana:

    "eKcGZr59zAa2BEWU"

Luo käyttäjäkoodi:

LUO KÄYTTÄJÄ 'sec_user'@'localhost' TUNNISTAA 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON "secure_sessions".* TO 'sec_user'@'localhost';

Huomautus: On hyvä vaihtaa yllä olevan koodin salasana, kun käytät omaa palvelinta. (Muista myös vaihtaa PHP -koodisi.) Muista, että sen ei tarvitse olla salasana, jonka voit muistaa, joten sen tekeminen on mahdollisimman monimutkaista. Tässä on satunnainen salasanageneraattori.

2238751 3
2238751 3

Vaihe 3. Luo MySQL -taulukko nimeltä "istunnot"

Alla oleva koodi luo taulukon, jossa on 4 kenttää (id, set_time, data, session_key).

Luo istunnot -taulukko:

CREATE TABLE `istunnot` (` id` char (128) NOT NULL, `set_time` char (10) NOT NULL,` data` text NOT NULL, `session_key` char (128) NOT NULL, PRIMARY KEY (" id ")) MOOTTORI = InnoDB DEFAULT CHARSET = latina1;

Käytämme CHAR -tietotyyppiä kentille, joiden pituuden tiedämme, koska kentät "id" ja "session_key" ovat aina 128 merkkiä pitkiä. CHAR: n käyttäminen tässä säästää prosessointitehoa.

Tapa 2/3: Luo session.class.php -tiedosto

2238751 4
2238751 4

Vaihe 1. Luo luokka

Aloittaaksesi uuden luokan sinun on syötettävä alla oleva koodi:

Uusi luokka:

luokkaistunto {

2238751 5
2238751 5

Vaihe 2. Luo _construct -toiminto

Tätä toimintoa kutsutaan joka kerta, kun luomme uuden objektin objektin istunnon luokan avulla. Voit lukea PHP _construct -toiminnon täältä.

Tämä toiminto asettaa mukautetun istuntokäsittelijämme niin, että se on käytettävissä heti, kun luokka on luotu (eli tehty/rakennettu/rakennettu).

_construct -toiminto:

function _construct () {// aseta mukautetut istuntotoiminnot. session_set_save_handler (array ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'tuhota')), array ($ this, 'gc')); // Tämä rivi estää odottamattomia vaikutuksia, kun objekteja käytetään tallennuskäsittelijöinä. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Vaihe 3. Luo start_session -funktio

Tätä toimintoa kutsutaan aina, kun haluat aloittaa uuden istunnon, käytä sitä session_start (); Katso koodin kommentit nähdäksesi, mitä kukin rivi tekee.

start_session -toiminto:

function start_session ($ session_name, $ secure) {// Varmista, että istuntoeväste ei ole käytettävissä javascriptin kautta. $ httponly = totta; // Istunnossa käytettävä hash -algoritmi. (käytä hash_algos () saadaksesi luettelon käytettävissä olevista tiivisteistä.) $ session_hash = 'sha512'; // Tarkista, onko tiiviste käytettävissä, jos (in_array ($ session_hash, hash_algos ())) {// Aseta has -toiminto. ini_set ('session.hash_function', $ session_hash); } // Kuinka monta bittiä tiivisteen merkkiä kohden. // Mahdolliset arvot ovat '4' (0-9, a-f), '5' (0-9, a-v) ja '6' (0-9, a-z, A-Z, "-", ","). ini_set ('session.hash_bits_per_character', 5); // Pakota istunto käyttämään vain evästeitä, ei URL -muuttujia. ini_set ('session.use_only_cookies', 1); // Hae istuntoevästeiden parametrit $ cookieParams = session_get_cookie_params (); // Aseta parametrit session_set_cookie_params ($ cookieParams ["life"], $ cookieParams ["path"], $ cookieParams ["domain"], $ secure, $ httponly); // Muuta istunnon nimi session_name ($ session_name); // Nyt aloitamme istunnon session_start (); // Tämä rivi luo istunnon uudelleen ja poistaa vanhan. // Se myös luo uuden salausavaimen tietokantaan. session_regenerate_id (tosi); }

2238751 7
2238751 7

Vaihe 4. Luo avoin toiminto

PHP -istunnot kutsuvat tätä toimintoa, kun aloitamme uuden istunnon, käytämme sitä uuden tietokantayhteyden luomiseen.

avoin toiminto:

function open () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = uusi mysqli ($ isäntä, $ käyttäjä, $ pass, $ nimi); $ tämä-> db = $ mysqli; palaa tosi; }

2238751 8
2238751 8

Vaihe 5. Luo sulkutoiminto

Tätä toimintoa kutsutaan, kun istunnot halutaan sulkea.

sulkutoiminto:

function close () {$ this-> db-> close (); palaa tosi; }

2238751 9
2238751 9

Vaihe 6. Luo lukutoiminto

PHP kutsuu tätä toimintoa, kun yritämme päästä istuntoon, esimerkiksi kun käytämme echo $ _SESSION ['jotain'];. Koska tätä toimintoa voidaan kutsua yhdellä sivulla, käytämme valmiita lausuntoja turvallisuuden lisäksi myös suorituskyvyn vuoksi. Laadimme lausunnon vain kerran ja voimme suorittaa sen monta kertaa.

Purkamme myös tietokannassa salattujen istuntotietojen salauksen. Käytämme istunnoissamme 256-bittistä AES-salausta.

lukutoiminto:

function read ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> valmistele ("SELECT data FROM session WHERE id =? LIMIT 1"); } $ this-> read_stmt-> bind_param ('s', $ id); $ this-> read_stmt-> suorita (); $ this-> read_stmt-> store_result (); $ this-> read_stmt-> bind_result ($ data); $ this-> read_stmt-> hae (); $ key = $ this-> getkey ($ id); $ data = $ this-> purkaa ($ data, $ key); palauta $ dataa; }

2238751 10
2238751 10

Vaihe 7. Luo kirjoitustoiminto

Tätä toimintoa käytetään, kun määritämme istunnolle arvon, esimerkiksi $ _SESSION ['jotain'] = 'jotain muuta';. Toiminto salaa kaikki tietokantaan lisätyt tiedot.

kirjoitustoiminto:

function write ($ id, $ data) {// Hanki ainutlaatuinen avain $ key = $ this-> getkey ($ id); // Salaa tiedot $ data = $ this-> encrypt ($ data, $ key); $ aika = aika (); jos (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> valmistele ("KORVAA INTO-istunnot (id, set_time, data, session_key) ARVOT (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> suorita (); palaa tosi; }

2238751 11
2238751 11

Vaihe 8. Luo tuhotoiminto

Tämä toiminto poistaa istunnon tietokannasta, ja php käyttää sitä, kun kutsumme toimintoja kuten session_destroy ();.

tuhota toiminto:

toiminto tuhota ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> valmistella ("DELETE FROM session WHERE id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> suorita (); palaa tosi; }

2238751 12
2238751 12

Vaihe 9. Luo gc (roskakeräin) -toiminto

Tämä toiminto on roskienkeräystoiminto, jota kutsutaan poistamaan vanhoja istuntoja. Tämän funktion kutsumistiheyden määrää kaksi kokoonpanodirektiiviä, session.gc_probability ja session.gc_divisor.

gc () -toiminto:

function gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> valmistella ("POISTA istunnoista WHERE set_time <?"); } $ old = time () - $ max; $ this-> gc_stmt-> bind_param ('s', $ vanha); $ this-> gc_stmt-> suorita (); palaa tosi; }

2238751 13
2238751 13

Vaihe 10. Luo getKey -toiminto

Tätä toimintoa käytetään saamaan yksilöllinen salausavain istunto -taulukosta. Jos istuntoa ei ole, se palauttaa vain uuden satunnaisavaimen salausta varten.

getkey () -toiminto:

yksityinen funktio getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> prep ("SELECT session_key FROM session WHERE id =? LIMIT 1"); } $ this-> key_stmt-> bind_param ('s', $ id); $ this-> key_stmt-> suorita (); $ this-> key_stmt-> store_result (); if ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ -avain); $ this-> key_stmt-> hae (); palauta $ -näppäin; } else {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); palauta $ random_key; }}

2238751 14
2238751 14

Vaihe 11. Luo salaus- ja salauksenpurkutoiminnot

Nämä toiminnot salaavat istuntojen tiedot ja käyttävät tietokannan salausavainta, joka on erilainen jokaiselle istunnolle. Emme käytä kyseistä avainta suoraan salauksessa, mutta käytämme sitä avaimen tiivisteestä entistä satunnaisemmaksi.

salaus () ja salauksen purku ():

yksityisten toimintojen salaus ($ 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); $ encrypted = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ -avain, $ data, MCRYPT_MODE_ECB, $ iv)); palauta $ salattu; } yksityisen toiminnon purku ($ 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); $ decrypted = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ -avain, base64_decode ($ data), MCRYPT_MODE_ECB, $ iv); $ decrypted = rtrim ($ decrypted, "\ 0"); return $ purettu; }

2238751 15
2238751 15

Vaihe 12. Lopeta luokka

Tässä lopetamme luokkien kiharat hakasulkeet:

Loppu luokka:

}

Tapa 3/3: Sivujen luominen istunnoilla

2238751 16
2238751 16

Vaihe 1. Istuntojen käyttäminen mukautetun istunnonhallinnan kanssa

Alla on tapa aloittaa uusi istunto; sinun on sisällytettävä tämä jokaiselle sivulle, jolle haluat käyttää istuntoja, käytä sitä session_start () sijaan;

Istunnon aloittaminen:

vaatia ('session.class.php'); $ session = uusi istunto (); // Aseta arvoksi tosi, jos käytät https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'Arvo.'; echo $ _SESSION ['jotain'];

Suositeltava: