3 måter å lage et sikkert sesjonsstyringssystem i PHP og MySQL

Innholdsfortegnelse:

3 måter å lage et sikkert sesjonsstyringssystem i PHP og MySQL
3 måter å lage et sikkert sesjonsstyringssystem i PHP og MySQL

Video: 3 måter å lage et sikkert sesjonsstyringssystem i PHP og MySQL

Video: 3 måter å lage et sikkert sesjonsstyringssystem i PHP og MySQL
Video: Нелогичная жизнь_Рассказ_Слушать 2024, Mars
Anonim

Denne guiden viser deg hvordan du kan lagre øktene dine sikkert i en mySQL -database. Vi vil også kryptere alle sesjonsdata som går inn i databasen, noe som betyr at hvis noen klarer å hacke seg inn i databasen, blir alle sesjonsdata kryptert med 256-biters AES-kryptering.

Trinn

Metode 1 av 3: Konfigurer mySQL -database

2238751 1
2238751 1

Trinn 1. Opprett en MySQL -database

I denne veiledningen vil vi lage en database kalt "secure_sessions".

Se hvordan du oppretter-en-database-i-phpMyAdmin.

Eller du kan bruke SQL -koden nedenfor for å lage en for deg.

Opprett databasekode:

LAG DATABASE `sikre_økter`;

Merk: Noen hosting -tjenester lar deg ikke opprette en database gjennom phpMyAdmin. Lær hvordan du gjør det i cPanel.

2238751 2
2238751 2

Trinn 2. Opprett en bruker med bare SELECT, INSERT og DELETE privilegier

Dette betyr at hvis det noen gang var brudd på sikkerheten i skriptet vårt, kunne ikke hackeren slippe tabeller fra databasen vår. Hvis du virkelig er paranoid, kan du opprette en annen bruker for hver funksjon.

  • Bruker:

    "sec_user"

  • Passord:

    "eKcGZr59zAa2BEWU"

Opprett brukerkode:

OPPRETT BRUKER 'sec_user'@'localhost' IDENTIFISERT AV 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON `secure_sessions`.* TO 'sec_user'@'localhost';

Merk: Det er en god idé å endre passordet i koden ovenfor når du kjører på din egen server. (Sørg for å endre PHP -koden også.) Husk at det ikke trenger å være et passord du kan huske, så det er så komplisert som mulig. Her er en tilfeldig passordgenerator.

2238751 3
2238751 3

Trinn 3. Lag en MySQL -tabell med navnet "økter"

Koden nedenfor oppretter en tabell med 4 felt (id, set_time, data, session_key).

Lag tabellen "økter":

CREATE TABLE `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 = InnoDB DEFAULT CHARSET = latin1;

Vi bruker CHAR -datatypen for felt vi kjenner lengden på, ettersom feltene "id" og "session_key" alltid vil være 128 tegn lange. Ved å bruke CHAR sparer du prosessorkraft.

Metode 2 av 3: Lag filen session.class.php

2238751 4
2238751 4

Trinn 1. Opprett klasse

For å starte en ny klasse må du skrive inn koden nedenfor:

Ny klasse:

klassesession {

2238751 5
2238751 5

Trinn 2. Lag _construct -funksjon

Denne funksjonen vil bli kalt hver gang vi oppretter en ny forekomst av et objekt ved hjelp av sesjonsklassen. Du kan lese om PHP _construct -funksjonen her.

Denne funksjonen setter vår tilpassede sesjonsbehandler slik at den er tilgjengelig for bruk så snart klassen er instantiert (dvs. laget/bygget/konstruert).

_konstruksjon:

function _construct () {// angi våre tilpassede sesjonsfunksjoner. session_set_save_handler (array ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'destroy'), array ($ this, 'gc')); // Denne linjen forhindrer uventede effekter når du bruker objekter som lagringsbehandlere. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Trinn 3. Lag start_session -funksjon

Denne funksjonen vil bli kalt hver gang du vil starte en ny økt, bruk den i stedet for session_start ();. Se kommentarene i koden for å se hva hver linje gjør.

start_session -funksjon:

function start_session ($ session_name, $ secure) {// Sørg for at økt -cookien ikke er tilgjengelig via javascript. $ httponly = true; // Hash -algoritme som skal brukes til økten. (bruk hash_algos () for å få en liste over tilgjengelige hashes.) $ session_hash = 'sha512'; // Kontroller om hash er tilgjengelig hvis (in_array ($ session_hash, hash_algos ())) {// Angi has -funksjonen. ini_set ('session.hash_function', $ session_hash); } // Hvor mange biter per tegn i hasjen. // De mulige verdiene er '4' (0-9, a-f), '5' (0-9, a-v) og '6' (0-9, a-z, A-Z, "-", ","). ini_set ('session.hash_bits_per_character', 5); // Tving økten til å bare bruke informasjonskapsler, ikke URL -variabler. ini_set ('session.use_only_cookies', 1); // Få økt -informasjonskapselparametere $ cookieParams = session_get_cookie_params (); // Angi parametrene session_set_cookie_params ($ cookieParams ["lifetime"], $ cookieParams ["path"], $ cookieParams ["domain"], $ secure, $ httponly); // Endre øktnavnet session_name ($ session_name); // Nå starter vi sesjonen session_start (); // Denne linjen regenererer økten og sletter den gamle. // Den genererer også en ny krypteringsnøkkel i databasen. session_regenerate_id (true); }

2238751 7
2238751 7

Trinn 4. Lag åpen funksjon

Denne funksjonen vil bli kalt av PHP -øktene når vi starter en ny økt, vi bruker den til å starte en ny databasetilkobling.

åpen funksjon:

funksjon åpen () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = ny mysqli ($ vert, $ bruker, $ pass, $ navn); $ this-> db = $ mysqli; returner sant; }

2238751 8
2238751 8

Trinn 5. Lag lukkefunksjon

Denne funksjonen vil bli kalt når øktene ønsker å bli avsluttet.

Lukk funksjon:

funksjon close () {$ this-> db-> close (); returner sant; }

2238751 9
2238751 9

Trinn 6. Lag lesefunksjon

Denne funksjonen vil bli kalt av PHP når vi prøver å få tilgang til en økt, for eksempel når vi bruker echo $ _SESSION ['noe'];. Fordi det kan være mange anrop til denne funksjonen på en enkelt side, drar vi fordel av utarbeidede uttalelser, ikke bare for sikkerhet, men også for ytelse. Vi forbereder kun uttalelsen én gang, så kan vi utføre den mange ganger.

Vi dekrypterer også sesjonsdataene som er kryptert i databasen. Vi bruker 256-biters AES-kryptering i øktene våre.

lese funksjon:

funksjon read ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> prepar ("SELECT data FROM sessions WHERE 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-> decrypt ($ data, $ key); returnere $ data; }

2238751 10
2238751 10

Trinn 7. Opprett skrivefunksjon

Denne funksjonen brukes når vi tildeler en økt en verdi, for eksempel $ _SESSION ['something'] = 'noe annet';. Funksjonen krypterer alle dataene som blir satt inn i databasen.

skrivefunksjon:

skrive skrive ($ id, $ data) {// Få unik nøkkel $ key = $ this-> getkey ($ id); // Krypter dataene $ data = $ this-> encrypt ($ data, $ key); $ time = time (); if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> prepar ("REPLACE INTO sessions (id, set_time, data, session_key) VERDIER (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> execute (); returner sant; }

2238751 11
2238751 11

Trinn 8. Lag ødeleggelsesfunksjon

Denne funksjonen sletter økten fra databasen, den brukes av php når vi kaller funksjoner som session_destroy ();.

ødelegge funksjon:

function destroy ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> prepar ("DELETE FROM sessions WHERE id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> execute (); returner sant; }

2238751 12
2238751 12

Trinn 9. Lag gc (søppelsamler) -funksjon

Denne funksjonen er søppelsamlerfunksjonen den kalles for å slette gamle økter. Hyppigheten denne funksjonen kalles til, bestemmes av to konfigurasjonsdirektiver, session.gc_probability og session.gc_divisor.

gc () -funksjon:

funksjon gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> prepar ("DELETE FROM sessions WHERE set_time <?"); } $ old = time () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> execute (); returner sant; }

2238751 13
2238751 13

Trinn 10. Lag getKey -funksjon

Denne funksjonen brukes til å hente den unike krypteringsnøkkelen fra sesjonstabellen. Hvis det ikke er noen økt, returnerer den bare en ny tilfeldig nøkkel for kryptering.

getkey () Funksjon:

privat funksjon getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> prepar ("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 (); return $ key; } annet {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); returner $ random_key; }}

2238751 14
2238751 14

Trinn 11. Lag krypterings- og dekrypteringsfunksjoner

Disse funksjonene krypterer dataene til øktene, de bruker en krypteringsnøkkel fra databasen som er forskjellig for hver økt. Vi bruker ikke nøkkelen direkte i krypteringen, men vi bruker den til å gjøre nøkkel -hash enda mer tilfeldig.

encrypt () og decrypt () funksjoner:

kryptering av private funksjoner ($ 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)); returner $ kryptert; } dekryptere privat funksjon ($ 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); $ dekryptert = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ key, base64_decode ($ data), MCRYPT_MODE_ECB, $ iv); $ dekryptert = rtrim ($ dekryptert, "\ 0"); returner $ dekryptert; }

2238751 15
2238751 15

Trinn 12. Sluttklasse

Her avslutter vi bare klassene med krøllete parenteser:

Sluttklasse:

}

Metode 3 av 3: Opprette sider med økter

2238751 16
2238751 16

Trinn 1. Bruke økter med den tilpassede sesjonsbehandleren

Nedenfor ser du hvordan du starter en ny økt; du må inkludere dette på hver side du vil ha tilgang til øktene, bruk den i stedet for session_start ();

Start en økt:

require ('session.class.php'); $ økt = ny økt (); // Sett til true hvis du bruker https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'En verdi.'; ekko $ _SESSION ['noe'];

Anbefalt: