Ta priročnik vam bo pokazal, kako lahko svoje seje varno shranite v bazo podatkov mySQL. Prav tako bomo šifrirali vse podatke o seji, ki gredo v zbirko podatkov, kar pomeni, da če kdo uspe vdreti v bazo podatkov, so vsi podatki seje šifrirani s 256-bitno šifriranjem AES.
Koraki
Metoda 1 od 3: Konfigurirajte bazo podatkov mySQL
Korak 1. Ustvarite bazo podatkov MySQL
V tem priročniku bomo ustvarili bazo podatkov, imenovano "secure_sessions".
Oglejte si, kako ustvarite bazo podatkov v phpMyAdmin.
Lahko pa uporabite spodnjo kodo SQL, ki vam jo bo ustvarila.
Ustvari kodo zbirke podatkov:
CREATE DATABASE `secure_sessions`;
Opomba: Nekatere storitve gostovanja ne dovoljujejo ustvarjanja baze podatkov prek phpMyAdmin. Preberite, kako to storite v cPanelu.
Korak 2. Ustvarite uporabnika samo s privilegiji SELECT, INSERT in DELETE
To pomeni, da heker ne bi mogel izpustiti tabel iz naše baze podatkov, če bi kdaj prišlo do kršitve varnosti v našem skriptu. Če ste res paranoični, za vsako funkcijo ustvarite drugega uporabnika.
-
Uporabnik:
"sec_user"
-
Geslo:
"eKcGZr59zAa2BEWU"
Ustvari uporabniško kodo:
CREATE USER 'sec_user'@'localhost' IDENTIFICIRANO 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON `secure_sessions`.* TO 'sec_user'@'localhost';
Opomba: Pri izvajanju na svojem strežniku je dobro, da geslo v zgornji kodi spremenite. (Poskrbite tudi, da spremenite svojo kodo PHP.) Ne pozabite, da ni gesla, ki ga morate zapomniti, da bo čim bolj zapleteno. Tukaj je generator naključnih gesel.
Korak 3. Ustvarite tabelo MySQL z imenom "seje"
Spodnja koda ustvari tabelo s 4 polji (id, set_time, data, session_key).
Ustvarite tabelo »seje«:
CREATE TABLE `seje` (` id` char (128) NOT NULL, `set_time` char (10) NOT NULL,` data` text NOT NULL, `session_key` char (128) NOT NULL, PRIMARY KEY (` id`)) MOTOR = PRILAGOJENA KARZETA InnoDB = latinica1;
Podatkovni tip CHAR uporabljamo za polja, za katera poznamo dolžino, saj bosta polja "id" in "session_key" vedno dolga 128 znakov. Uporaba CHAR tukaj prihrani pri procesorski moči.
Metoda 2 od 3: Ustvarite datoteko session.class.php
Korak 1. Ustvarite razred
Če želite začeti nov razred, morate vnesti spodnjo kodo:
Novi razred:
razredna seja {
Korak 2. Ustvarite funkcijo _construct
Ta funkcija se bo klicala vsakič, ko ustvarimo nov primerek predmeta z uporabo razreda 'session'. Tu lahko preberete funkcijo PHP _construct.
Ta funkcija nastavi naš upravljavec sej po meri, tako da je na voljo za uporabo takoj, ko je razred ustvarjen (tj. Izdelan/zgrajen/izdelan).
_construct funkcija:
function _construct () {// nastavimo naše funkcije seje po meri. session_set_save_handler (array ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'kill'), matrika ($ this, 'gc')); // Ta vrstica preprečuje nepričakovane učinke pri uporabi predmetov kot vodnikov shranjevanja. register_shutdown_function ('session_write_close'); }
Korak 3. Ustvarite funkcijo start_session
Ta funkcija bo poklicana vsakič, ko želite začeti novo sejo, jo uporabite namesto session_start ();. Oglejte si komentarje v kodi, da vidite, kaj počne vsaka vrstica.
funkcija start_session:
funkcija start_session ($ session_name, $ secure) {// Prepričajte se, da piškotek seje ni dostopen prek javascripta. $ httponly = res; // Hash algoritem za sejo. (uporabite hash_algos (), da dobite seznam razpoložljivih hashov.) $ session_hash = 'sha512'; // Preveri, ali je hash na voljo if (in_array ($ session_hash, hash_algos ())) {// Nastavi funkcijo has. ini_set ('session.hash_function', $ session_hash); } // Koliko bitov na znak razpršitve. // Možne vrednosti so '4' (0-9, a-f), '5' (0-9, a-v) in '6' (0-9, a-z, A-Z, "-", ","). ini_set ('session.hash_bits_per_character', 5); // Prisilite sejo, da uporablja samo piškotke, ne spremenljivk URL. ini_set ('session.use_on_cookies', 1); // Pridobite parametre piškotkov seje $ cookieParams = session_get_cookie_params (); // Nastavimo parametre session_set_cookie_params ($ cookieParams ["lifetime"], $ cookieParams ["path"], $ cookieParams ["domain"], $ secure, $ httponly); // Spremeni ime seje ime_sesije ($ session_name); // Zdaj začnemo sejo session_start (); // Ta vrstica regenerira sejo in izbriše staro. // V bazi podatkov ustvari tudi nov ključ za šifriranje. session_regenerate_id (true); }
Korak 4. Ustvarite odprto funkcijo
To funkcijo bodo seje PHP poklicale, ko začnemo novo sejo, z njo zaženemo novo povezavo z bazo podatkov.
odprta funkcija:
funkcija open () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = nov mysqli ($ host, $ user, $ pass, $ name); $ this-> db = $ mysqli; vrni true; }
Korak 5. Ustvarite funkcijo zapiranja
Ta funkcija bo poklicana, ko se seje želijo zapreti.
funkcija zapiranja:
funkcija close () {$ this-> db-> close (); vrni true; }
Korak 6. Ustvarite funkcijo branja
To funkcijo bo poklical PHP, ko poskušamo dostopati do seje, na primer pri uporabi echo $ _SESSION ['something'];. Ker je lahko na eni strani veliko klicev na to funkcijo, izkoristimo pripravljene izjave, ne samo zaradi varnosti, ampak tudi zaradi zmogljivosti. Izjavo pripravimo le enkrat, nato pa jo lahko izvedemo večkrat.
Dešifriramo tudi podatke o seji, ki so šifrirani v bazi podatkov. V sejah uporabljamo 256-bitno šifriranje AES.
funkcija branja:
funkcija brati ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> pripraviti ("IZBERI podatke IZ sej KJE id =? LIMIT 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); $ data = $ this-> dešifriraj ($ data, $ key); vrniti $ podatke; }
Korak 7. Ustvarite funkcijo pisanja
Ta funkcija se uporablja, ko seji dodelimo vrednost, na primer $ _SESSION ['something'] = 'something else';. Funkcija šifrira vse podatke, ki se vstavijo v bazo podatkov.
funkcija pisanja:
function write ($ id, $ data) {// Pridobite edinstven ključ $ key = $ this-> getkey ($ id); // Šifriranje podatkov $ data = $ this-> šifriranje ($ data, $ key); $ čas = čas (); če (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> pripravi ("REPLACE INTO sesije (id, set_time, data, session_key) VALUES (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> execute (); vrni true; }
Korak 8. Ustvarite funkcijo uničenja
Ta funkcija izbriše sejo iz baze podatkov, uporablja jo php, ko pokličemo funkcije, kot je session_destroy ();.
funkcija uničenja:
funkcija kill ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> pripravi ("IZBRIŠI IZ sej KJE id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> execute (); vrni true; }
Korak 9. Ustvarite funkcijo gc (zbiralnik smeti)
Ta funkcija je funkcija zbiralnika smeti, ki se kliče za brisanje starih sej. Pogostost klica te funkcije določata dve konfiguracijski direktivi, session.gc_probability in session.gc_divisor.
funkcija gc ():
funkcija gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> pripravi ("IZBRIŠI IZ sej KJE set_time <?"); } $ old = čas () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> execute (); vrni true; }
Korak 10. Ustvarite funkcijo getKey
Ta funkcija se uporablja za pridobitev edinstvenega ključa za šifriranje iz tabele sej. Če ni seje, vrne samo nov naključni ključ za šifriranje.
funkcija getkey ():
zasebna funkcija getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> prep ("SELECT key_key FROM sej WHERE id =? LIMIT 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 $ key; } else {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); vrni $ random_key; }}
Korak 11. Ustvarite funkcije za šifriranje in dešifriranje
Te funkcije šifrirajo podatke sej, uporabljajo šifrirni ključ iz baze podatkov, ki je za vsako sejo drugačen. Tega ključa pri šifriranju ne uporabljamo neposredno, ampak ga uporabljamo za še bolj naključno razpršitev ključa.
funkcije encrypt () in decrypt ():
šifriranje zasebne funkcije ($ 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, $ key, $ data, MCRYPT_MODE_ECB, $ iv)); vrniti $ šifrirano; } dešifriranje zasebne funkcije ($ 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, $ key, base64_decode ($ data), MCRYPT_MODE_ECB, $ iv); $ decrypted = rtrim ($ decrypted, "\ 0"); return $ dešifrirano; }
Korak 12. Končaj razred
Tu zaključimo le kodraste oklepaje razredov:
Končni razred:
}
Metoda 3 od 3: Ustvarjanje strani s sejami
Korak 1. Uporaba sej z upraviteljem sej po meri
Spodaj je opisano, kako bi začeli novo sejo; to morate vključiti na vsako stran, na kateri želite dostopati do sej, uporabite ga namesto session_start ();
Začetek seje:
require ('session.class.php'); $ session = nova seja (); // Nastavimo na true, če uporabljamo https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'Vrednost.'; echo $ _SESSION ['nekaj'];