3 načina za stvaranje sigurnog sistema za upravljanje sesijama u PHP -u i MySQL -u

Sadržaj:

3 načina za stvaranje sigurnog sistema za upravljanje sesijama u PHP -u i MySQL -u
3 načina za stvaranje sigurnog sistema za upravljanje sesijama u PHP -u i MySQL -u

Video: 3 načina za stvaranje sigurnog sistema za upravljanje sesijama u PHP -u i MySQL -u

Video: 3 načina za stvaranje sigurnog sistema za upravljanje sesijama u PHP -u i MySQL -u
Video: Жена за 100 тысяч. Смотреть фильм. Комедия 2024, Marš
Anonim

Ovaj vodič će vam pokazati kako možete sigurno pohraniti svoje sesije u bazu podataka mySQL. Također ćemo šifrirati sve podatke o sesiji koji ulaze u bazu podataka, što znači da ako netko uspije upasti u bazu podataka, svi podaci sesije su šifrirani 256-bitnom AES enkripcijom.

Koraci

Metoda 1 od 3: Konfigurirajte mySQL bazu podataka

2238751 1
2238751 1

Korak 1. Kreirajte MySQL bazu podataka

U ovom vodiču ćemo stvoriti bazu podataka pod nazivom "secure_sessions".

Pogledajte kako stvoriti bazu podataka u phpMyAdmin-u.

Ili možete upotrijebiti donji SQL kôd koji će vam ga stvoriti.

Kreirajte kôd baze podataka:

CREATE DATABASE `secure_sessions`;

Napomena: Neke usluge hostinga ne dopuštaju vam stvaranje baze podataka putem phpMyAdmina. Saznajte kako to učiniti u cPanelu.

2238751 2
2238751 2

Korak 2. Kreirajte korisnika sa samo privilegijama SELECT, INSERT i DELETE

To znači da ako je ikada došlo do narušavanja sigurnosti u našoj skripti, haker nije mogao ispustiti tablice iz naše baze podataka. Ako ste zaista paranoični, stvorite različitog korisnika za svaku funkciju.

  • Korisnik:

    "sec_user"

  • Lozinka:

    "eKcGZr59zAa2BEWU"

Kreirajte korisnički kod:

CREATE USER 'sec_user'@'localhost' IDENTIFICIRANO 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON `secure_sessions`.* TO 'sec_user'@'localhost';

Napomena: Bilo bi dobro promijeniti lozinku u gore navedenom kodu kada radite na svom poslužitelju. (Obavezno promijenite i svoj PHP kôd.) Zapamtite da ne mora biti lozinka koju možete zapamtiti kako bi vaša komplikacija bila što komplikovanija. Evo generatora slučajnih lozinki.

2238751 3
2238751 3

Korak 3. Kreirajte MySQL tabelu pod nazivom "sesije"

Donji kôd stvara tablicu s 4 polja (id, set_time, data, session_key).

Kreirajte tablicu "sesije":

CREATE TABLE `sesije` (` 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 = InnoDB ZADNJA KARTA = latin1;

Tip podataka CHAR koristimo za polja čija je dužina poznata, jer će polja "id" i "session_key" uvijek imati 128 znakova. Korištenje CHAR -a ovdje štedi procesorsku snagu.

Metoda 2 od 3: Kreirajte datoteku session.class.php

2238751 4
2238751 4

Korak 1. Kreirajte klasu

Za početak nove klase potrebno je unijeti donji kod:

Nova klasa:

razredna sesija {

2238751 5
2238751 5

Korak 2. Kreirajte _construct funkciju

Ova funkcija će se pozivati svaki put kada kreiramo novu instancu objekta pomoću klase 'session'. Ovdje možete pročitati o PHP _construct funkciji.

Ova funkcija postavlja naš prilagođeni rukovatelj sesijama tako da je dostupan za upotrebu čim se instalacija klase (tj. Napravi/izgradi/izgradi).

_construct funkcija:

function _construct () {// postavljamo naše prilagođene funkcije sesije. session_set_save_handler (array ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), niz ($ this, 'delete')), niz ($ this, 'gc')); // Ova linija sprječava neočekivane efekte pri korištenju objekata kao rukovatelja spremanjem. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Korak 3. Kreirajte funkciju start_session

Ova funkcija će se pozivati svaki put kada želite započeti novu sesiju, koristite je umjesto session_start ();. Pogledajte komentare u kodu da vidite šta svaki red radi.

start_session funkcija:

funkcija start_session ($ session_name, $ secure) {// Uvjerite se da kolačiću sesije nije dostupan putem javascripta. $ httponly = true; // Hash algoritam koji će se koristiti za sesiju. (koristite hash_algos () da biste dobili listu dostupnih heševa.) $ session_hash = 'sha512'; // Provjeravamo je li hash dostupan ako (in_array ($ session_hash, hash_algos ())) {// Postavi funkciju has. ini_set ('session.hash_function', $ session_hash); } // Koliko bitova po znaku hash -a. // Moguće vrijednosti su '4' (0-9, a-f), '5' (0-9, a-v) i '6' (0-9, a-z, A-Z, "-", ","). ini_set ('session.hash_bits_per_character', 5); // Prisiliti sesiju da koristi samo kolačiće, a ne URL varijable. ini_set ('session.use_on_cookies', 1); // Dohvaćanje parametara kolačića sesije $ cookieParams = session_get_cookie_params (); // Postavljamo parametre session_set_cookie_params ($ cookieParams ["lifetime"], $ cookieParams ["path"], $ cookieParams ["domain"], $ secure, $ httponly); // Promijenimo ime sesije session_name ($ session_name); // Sada započinjemo sesiju session_start (); // Ova linija regenerira sesiju i briše staru. // Također generira novi ključ za šifriranje u bazi podataka. session_regenerate_id (true); }

2238751 7
2238751 7

Korak 4. Kreirajte otvorenu funkciju

Ovu funkciju će PHP sesije pozvati kada započnemo novu sesiju, koristimo je za pokretanje nove veze s bazom podataka.

funkcija otvaranja:

funkcija open () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = novi mysqli ($ host, $ user, $ pass, $ name); $ this-> db = $ mysqli; return true; }

2238751 8
2238751 8

Korak 5. Kreirajte funkciju zatvaranja

Ova funkcija će se pozvati kada se sesije žele zatvoriti.

funkcija zatvaranja:

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

2238751 9
2238751 9

Korak 6. Kreirajte funkciju čitanja

Ovu funkciju će PHP pozvati kada pokušamo pristupiti sesiji, na primjer kada koristimo echo $ _SESSION ['nešto'];. Budući da bi moglo biti mnogo poziva ovoj funkciji na jednoj stranici, koristimo pripremljene izjave, ne samo radi sigurnosti, već i zbog performansi. Izjavu pripremamo samo jednom, a zatim je možemo izvršiti više puta.

Također dešifriramo podatke o sesiji koji su šifrirani u bazi podataka. U našim sesijama koristimo 256-bitnu AES enkripciju.

funkcija čitanja:

funkcija read ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> pripremiti ("ODABERI podatke IZ sesija GDE je 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šifrovanje ($ data, $ key); return $ data; }

2238751 10
2238751 10

Korak 7. Kreirajte funkciju pisanja

Ova funkcija se koristi kada dodijelimo vrijednost sesiji, na primjer $ _SESSION ['something'] = 'nešto drugo';. Funkcija šifrira sve podatke koji se ubacuju u bazu podataka.

funkcija pisanja:

function write ($ id, $ data) {// Dobijte jedinstveni ključ $ key = $ this-> getkey ($ id); // Šifriranje podataka $ data = $ this-> šifriranje ($ data, $ key); $ vrijeme = vrijeme (); if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> pripremiti ("ZAMJENA INTO sesija (id, set_time, data, session_key) VALUES (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> execute (); return true; }

2238751 11
2238751 11

Korak 8. Kreirajte funkciju kill

Ova funkcija briše sesiju iz baze podataka, koristi je php kada pozivamo funkcije poput session_destroy ();.

funkcija uništavanja:

funkcija kill ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> pripremiti ("IZBRIŠI IZ sesija GDE je id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> execute (); return true; }

2238751 12
2238751 12

Korak 9. Kreirajte funkciju gc (sakupljač smeća)

Ova funkcija je funkcija sakupljača smeća koja se poziva za brisanje starih sesija. Učestalost pozivanja ove funkcije određena je dvjema konfiguracijskim direktivama, session.gc_probability i session.gc_divisor.

funkcija gc ():

funkcija gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> pripremiti ("IZBRIŠI IZ sesija GDJE je set_time <?"); } $ old = vrijeme () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> execute (); return true; }

2238751 13
2238751 13

Korak 10. Kreirajte funkciju getKey

Ova funkcija se koristi za dobivanje jedinstvenog ključa za šifriranje iz tablice sesija. Ako nema sesije, samo vraća novi slučajni ključ za šifriranje.

getkey () Funkcija:

privatna funkcija getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> pripremiti ("ODABERI ključ_sesije IZ sesije GDE je 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)); return $ random_key; }}

2238751 14
2238751 14

Korak 11. Kreirajte funkcije šifriranja i dešifriranja

Ove funkcije kriptiraju podatke sesija, koriste ključ za šifriranje iz baze podataka koji je različit za svaku sesiju. Taj ključ ne koristimo izravno u šifriranju, već ga koristimo da bismo hash ključa učinili još nasumičnijim.

funkcije encrypt () i decrypt ():

šifriranje privatne 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)); return $ šifrovano; } dešifriranje privatne 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šifrovano; }

2238751 15
2238751 15

Korak 12. Završite klasu

Ovdje samo završavamo klase sa uvijenim zagradama:

Završna klasa:

}

Metoda 3 od 3: Kreiranje stranica sa sesijama

2238751 16
2238751 16

Korak 1. Upotreba sesija sa prilagođenim upraviteljem sesija

U nastavku je prikazano kako biste započeli novu sesiju; ovo biste trebali uključiti na svaku stranicu na kojoj želite pristupiti sesijama, koristite ga umjesto session_start ();

Započinjanje sesije:

require ('session.class.php'); $ session = nova sesija (); // Postavljeno na true ako se koristi https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'Vrednost.'; echo $ _SESSION ['nešto'];

Preporučuje se: