Táto príručka vám ukáže, ako môžete svoje relácie bezpečne uložiť do databázy mySQL. Tiež zašifrujeme všetky údaje o reláciách, ktoré idú do databázy, čo znamená, že ak sa niekomu podarí preniknúť do databázy, všetky údaje o relácii budú šifrované 256-bitovým šifrovaním AES.
Kroky
Metóda 1 z 3: Konfigurácia databázy mySQL
Krok 1. Vytvorte databázu MySQL
V tejto príručke vytvoríme databázu s názvom „secure_sessions“.
Pozrite sa, ako vytvoriť databázu v phpMyAdmin.
Alebo môžete použiť nižšie uvedený kód SQL, ktorý vám ho vytvorí.
Vytvorte kód databázy:
VYTVORIŤ DATABÁZU `secure_sessions`;
Poznámka: Niektoré hostiteľské služby vám neumožňujú vytvoriť databázu pomocou phpMyAdmin, prečítajte si, ako to urobiť v programe cPanel.
Krok 2. Vytvorte používateľa s iba oprávneniami SELECT, INSERT a DELETE
To znamená, že ak dôjde k narušeniu zabezpečenia nášho skriptu, hacker nemôže odstrániť tabuľky z našej databázy. Ak ste skutočne paranoidní, vytvorte pre každú funkciu iného používateľa.
-
Užívateľ:
"sec_user"
-
Heslo:
"eKcGZr59zAa2BEWU"
Vytvoriť užívateľský kód:
VYTVORIŤ UŽÍVATEĽA 'sec_user'@'localhost' IDENTIFIKOVANÉ 'eKcGZr59zAa2BEWU'; GRANT VÝBER, VLOŽIŤ, AKTUALIZOVAŤ, VYMAZAŤ NA `secure_sessions`.* TO 'sec_user'@'localhost';
Poznámka: Pri spustení na vlastnom serveri je vhodné zmeniť heslo v kóde uvedenom vyššie. (Uistite sa, že zmeníte aj svoj kód PHP.) Pamätajte si, že to nemusí byť heslo, ktoré si môžete pamätať, takže výroba je čo najkomplikovanejšia. Tu je generátor náhodných hesiel.
Krok 3. Vytvorte tabuľku MySQL s názvom „sessions“
Nasledujúci kód vytvára tabuľku so 4 poľami (id, set_time, data, session_key).
Vytvorte tabuľku „relácií“:
VYTVORIŤ TABUĽKU `sessions` (` 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 = VÝCHOZÍ CHARSET InnoDB = latin1;
Dátový typ CHAR používame pre polia, ktorých dĺžku poznáme, pretože polia „id“a „session_key“budú mať vždy 128 znakov. Použitie CHAR tu šetrí výpočtový výkon.
Metóda 2 z 3: Vytvorte súbor session.class.php
Krok 1. Vytvorte triedu
Na začatie novej triedy budete potrebovať nasledujúci kód:
Nová trieda:
triedna relácia {
Krok 2. Vytvorte funkciu _construct
Táto funkcia sa bude volať vždy, keď vytvoríme novú inštanciu objektu pomocou triedy 'session'. Tu si môžete prečítať o funkcii PHP _construct.
Táto funkcia nastavuje náš vlastný obslužný program relácií, takže je k dispozícii na použitie ihneď po vytvorení triedy (tj.
Funkcia _construct:
function _construct () {// nastavte naše vlastné funkcie relácie. session_set_save_handler (pole ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'destru'), pole ($ this, 'gc')); // Tento riadok zabraňuje neočakávaným efektom pri použití objektov ako obslužných programov ukladania. register_shutdown_function ('session_write_close'); }
Krok 3. Vytvorte funkciu start_session
Táto funkcia sa bude volať vždy, keď chcete začať novú reláciu, použite ju namiesto session_start ();. Pozrite sa na komentáre v kóde, aby ste zistili, čo jednotlivé riadky robia.
funkcia start_session:
funkcia start_session ($ session_name, $ secure) {// Uistite sa, že súbor cookie relácie nie je prístupný prostredníctvom JavaScriptu. $ httponly = true; // Algoritmus hash, ktorý sa má použiť pre reláciu. (použite hash_algos () na získanie zoznamu dostupných hashov.) $ session_hash = 'sha512'; // Skontrolujte, či je hash k dispozícii, ak (in_array ($ session_hash, hash_algos ())) {// Nastavte funkciu has. ini_set ('session.hash_function', $ session_hash); } // Koľko bitov na znak hash. // Možné hodnoty sú '4' (0-9, a-f), '5' (0-9, a-v) a '6' (0-9, a-z, A-Z, "-", ","). ini_set ('session.hash_bits_per_character', 5); // Vynútite, aby relácia používala iba súbory cookie, nie premenné adresy URL. ini_set ('session.use_only_cookies', 1); // Získať parametre cookie relácie $ cookieParams = session_get_cookie_params (); // Nastavte parametre session_set_cookie_params ($ cookieParams ["životnosť"], $ cookieParams ["cesta"], $ cookieParams ["doména"], $ bezpečný, $ httponly); // Zmeňte názov relácie session_name ($ session_name); // Teraz začneme reláciu session_start (); // Tento riadok regeneruje reláciu a odstráni starú. // Tiež generuje nový šifrovací kľúč v databáze. session_regenerate_id (true); }
Krok 4. Vytvorte otvorenú funkciu
Túto funkciu budú volať relácie PHP, keď spustíme novú reláciu, použijeme ju na spustenie nového databázového pripojenia.
otvorená funkcia:
funkcia open () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = new mysqli ($ host, $ user, $ pass, $ name); $ this-> db = $ mysqli; návrat true; }
Krok 5. Vytvorte funkciu zatvorenia
Táto funkcia sa vyvolá, keď sa chcú relácie ukončiť.
zatváracia funkcia:
funkcia close () {$ this-> db-> close (); návrat true; }
Krok 6. Vytvorte funkciu čítania
Túto funkciu zavolá PHP, keď sa pokúsime získať prístup k relácii, napríklad keď použijeme echo $ _SESSION ['niečo'];. Pretože na túto stránku môže byť veľa volaní k tejto funkcii, využívame pripravené vyhlásenia nielen z hľadiska zabezpečenia, ale aj z hľadiska výkonu. Výpis pripravíme iba raz, potom ho môžeme mnohokrát vykonať.
Dešifrujeme tiež údaje relácie, ktoré sú šifrované v databáze. V našich reláciách používame 256-bitové šifrovanie AES.
funkcia čítania:
funkcia čítať ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> pripraviť ("VYBERTE údaje z relácií KDE id =? OMEZIŤ 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šifrovať ($ data, $ kľúč); vrátiť $ dáta; }
Krok 7. Vytvorte funkciu zápisu
Táto funkcia sa používa, keď relácii priradíme hodnotu, napríklad $ _SESSION ['niečo'] = 'niečo iné';. Táto funkcia šifruje všetky údaje, ktoré sa vložia do databázy.
funkcia zápisu:
funkcia write ($ id, $ data) {// Získať jedinečný kľúč $ key = $ this-> getkey ($ id); // Šifrovanie údajov $ data = $ this-> zašifrovať ($ dáta, $ kľúč); $ cas = cas (); if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> prepar („REPLACE INTO sessions (id, set_time, data, session_key) VALUES (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> execute (); návrat true; }
Krok 8. Vytvorte funkciu zničenia
Táto funkcia vymaže reláciu z databázy, používa ju php, keď voláme funkcie ako session_destroy ();.
zničiť funkciu:
zničiť funkciu ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> připravit ("ODSTRÁNIŤ Z relácií KDEŽ id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> execute (); návrat true; }
Krok 9. Vytvorte funkciu gc (garbage collector)
Táto funkcia je funkciou zberača odpadu, ktorá sa nazýva odstránenie starých relácií. Frekvencia, v ktorej sa táto funkcia volá, je určená dvoma konfiguračnými smernicami, session.gc_probability a session.gc_divisor.
gc () funkcia:
funkcia gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> pripraviť ("ODSTRÁNIŤ Z relácií, KDE set_time <?"); } $ old = čas () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> execute (); návrat true; }
Krok 10. Vytvorte funkciu getKey
Táto funkcia sa používa na získanie jedinečného kľúča na šifrovanie z tabuľky relácií. Ak neexistuje žiadna relácia, vráti iba nový náhodný kľúč na šifrovanie.
getkey () Funkcia:
súkromná funkcia getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> preparation ("SELECT session_key FROM sessions 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 (); vrátiť kľúč $; } else {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); vrátiť $ random_key; }}
Krok 11. Vytvorte funkcie šifrovania a dešifrovania
Tieto funkcie šifrujú údaje relácií, používajú šifrovací kľúč z databázy, ktorý je pre každú reláciu iný. Tento kľúč priamo nepoužívame pri šifrovaní, ale používame ho na to, aby bola hash kľúča ešte náhodnejšia.
funkcie encrypt () a decrypt ():
šifrovanie súkromnej funkcie ($ dáta, $ kľúč) {$ 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)); vrátiť šifrované $; } dešifrovanie súkromnej funkcie ($ data, $ kľúč) {$ 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); $ dešifrovaný = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ kľúč, base64_decode ($ dáta), MCRYPT_MODE_ECB, $ iv); $ dešifrovaný = rtrim ($ dešifrovaný, "\ 0"); vrátiť $ dešifrovaný; }
Krok 12. Ukončite triedu
Tu končíme zložené zátvorky tried:
Koniec triedy:
}
Metóda 3 z 3: Vytváranie stránok pomocou relácií
Krok 1. Použitie relácií s vlastným správcom relácií
Nasleduje spôsob, akým by ste začali novú reláciu; budete to musieť zahrnúť na každú stránku, na ktorú chcete mať prístup k reláciám, použite ho namiesto session_start ();
Spustenie relácie:
require ('session.class.php'); $ session = nová relácia (); // Nastavte na hodnotu true, ak používate https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'Hodnota.'; echo $ _SESSION ['niečo'];