3 načini za ustvarjanje varnega sistema za upravljanje sej v PHP in MySQL

Kazalo:

3 načini za ustvarjanje varnega sistema za upravljanje sej v PHP in MySQL
3 načini za ustvarjanje varnega sistema za upravljanje sej v PHP in MySQL

Video: 3 načini za ustvarjanje varnega sistema za upravljanje sej v PHP in MySQL

Video: 3 načini za ustvarjanje varnega sistema za upravljanje sej v PHP in MySQL
Video: Lidlova domislica: 3 ideje za ustvarjanje z listi 2024, April
Anonim

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

2238751 1
2238751 1

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.

2238751 2
2238751 2

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.

2238751 3
2238751 3

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

2238751 4
2238751 4

Korak 1. Ustvarite razred

Če želite začeti nov razred, morate vnesti spodnjo kodo:

Novi razred:

razredna seja {

2238751 5
2238751 5

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'); }

2238751 6
2238751 6

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); }

2238751 7
2238751 7

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; }

2238751 8
2238751 8

Korak 5. Ustvarite funkcijo zapiranja

Ta funkcija bo poklicana, ko se seje želijo zapreti.

funkcija zapiranja:

funkcija close () {$ this-> db-> close (); vrni true; }

2238751 9
2238751 9

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; }

2238751 10
2238751 10

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; }

2238751 11
2238751 11

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; }

2238751 12
2238751 12

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; }

2238751 13
2238751 13

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; }}

2238751 14
2238751 14

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; }

2238751 15
2238751 15

Korak 12. Končaj razred

Tu zaključimo le kodraste oklepaje razredov:

Končni razred:

}

Metoda 3 od 3: Ustvarjanje strani s sejami

2238751 16
2238751 16

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'];

Priporočena: