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

Sadržaj:

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

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

Video: 3 načina za stvaranje sigurnog sustava za upravljanje sesijama u PHP -u i MySQL -u
Video: CS50 2015 - Week 8 2024, Ožujak
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 bazu podataka mySQL

2238751 1
2238751 1

Korak 1. Stvorite MySQL bazu podataka

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

Pogledajte kako stvoriti bazu podataka u phpMyAdmin.

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

Stvorite 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. Stvorite korisnika sa samo ovlastima SELECT, INSERT i DELETE

To znači da ako je ikada došlo do povrede 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 kôd:

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 gornjem kodu kada radite na vlastitom poslužitelju. (Svakako promijenite i svoj PHP kôd.) Zapamtite da to ne mora biti lozinka koju se možete sjetiti pa je neka komplikacija bude što kompliciranija. Evo generatora slučajnih lozinki.

2238751 3
2238751 3

Korak 3. Izradite MySQL tablicu pod nazivom "sesije"

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

Izradite 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 KARTE = latin1;

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

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

2238751 4
2238751 4

Korak 1. Stvorite klasu

Za početak novog razreda trebat ćete unijeti donji kôd:

Nova klasa:

razredna sjednica {

2238751 5
2238751 5

Korak 2. Izradite _construct funkciju

Ova funkcija će se pozivati svaki put kada stvorimo 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 klasa stvori (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. Izradite 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 biste vidjeli što svaki redak radi.

start_session funkcija:

funkcija start_session ($ session_name, $ secure) {// Uvjerite se da kolačiću sesije nije dostupan putem javascripta. $ httponly = istina; // Hash algoritam za sesiju. (koristite hash_algos () da biste dobili popis dostupnih raspršivača.) $ session_hash = 'sha512'; // Provjeri 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 raspršivač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 (); // Postavljanje parametara session_set_cookie_params ($ cookieParams ["lifetime"], $ cookieParams ["path"], $ cookieParams ["domain"], $ secure, $ httponly); // Promijenimo naziv sesije session_name ($ session_name); // Sada započinjemo sesiju session_start (); // Ovaj redak 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. Izradite otvorenu funkciju

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

otvorena funkcija:

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

2238751 8
2238751 8

Korak 5. Izradite 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. Izradite funkciju čitanja

Ovu će funkciju PHP pozvati kada pokušamo pristupiti sesiji, na primjer kada koristimo echo $ _SESSION ['nešto'];. Budući da bi na jednoj stranici moglo biti mnogo poziva ovoj funkciji, koristimo pripremljene izjave, ne samo radi sigurnosti, već i radi izvedbe. 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 GDJE 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 ($ podaci); $ this-> read_stmt-> fetch (); $ key = $ this-> getkey ($ id); $ data = $ this-> dešifriranje ($ data, $ key); vratiti podatke $; }

2238751 10
2238751 10

Korak 7. Izradite funkciju pisanja

Ova se funkcija 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. Izradite funkciju uništavanja

Ova funkcija briše sesiju iz baze podataka, koristi je php kada zovemo 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 GDJE je id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> execute (); return true; }

2238751 12
2238751 12

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

Ova funkcija je funkcija skupljač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. Izradite funkciju getKey

Ova se funkcija 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č_sijesije IZ sesije GDJE 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 ključ $; } else {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); return $ random_key; }}

2238751 14
2238751 14

Korak 11. Izradite 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 ():

enkripcija 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 $ šifrirano; } 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šifrirano; }

2238751 15
2238751 15

Korak 12. Završite klasu

Ovdje samo završavamo klase uvijenim zagradama:

Završna klasa:

}

Metoda 3 od 3: Stvaranje stranica sa sjednicama

2238751 16
2238751 16

Korak 1. Korištenje sesija s prilagođenim upraviteljem sesija

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

Pokretanje sesije:

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

Preporučeni: