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
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.
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.
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
Vaihe 1. Luo luokka
Aloittaaksesi uuden luokan sinun on syötettävä alla oleva koodi:
Uusi luokka:
luokkaistunto {
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'); }
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); }
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; }
Vaihe 5. Luo sulkutoiminto
Tätä toimintoa kutsutaan, kun istunnot halutaan sulkea.
sulkutoiminto:
function close () {$ this-> db-> close (); palaa tosi; }
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; }
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; }
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; }
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; }
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; }}
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; }
Vaihe 12. Lopeta luokka
Tässä lopetamme luokkien kiharat hakasulkeet:
Loppu luokka:
}
Tapa 3/3: Sivujen luominen istunnoilla
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'];