3 måder at oprette et sikkert sessionsstyringssystem i PHP og MySQL

Indholdsfortegnelse:

3 måder at oprette et sikkert sessionsstyringssystem i PHP og MySQL
3 måder at oprette et sikkert sessionsstyringssystem i PHP og MySQL

Video: 3 måder at oprette et sikkert sessionsstyringssystem i PHP og MySQL

Video: 3 måder at oprette et sikkert sessionsstyringssystem i PHP og MySQL
Video: How to Become a Web Designer, Explained in 1 Minute 2024, April
Anonim

Denne vejledning viser dig, hvordan du kan gemme dine sessioner sikkert i en mySQL -database. Vi vil også kryptere alle sessionsdata, der går ind i databasen, hvilket betyder, at hvis nogen formår at hacke ind i databasen, er alle sessionsdata krypteret med 256-bit AES-kryptering.

Trin

Metode 1 af 3: Konfigurer mySQL -database

2238751 1
2238751 1

Trin 1. Opret en MySQL -database

I denne vejledning opretter vi en database kaldet "secure_sessions".

Se, hvordan du opretter-en-database-i-phpMyAdmin.

Eller du kan bruge SQL -koden herunder og oprette en til dig.

Opret databasekode:

Opret DATABASE `secure_sessions`;

Bemærk: Nogle hostingtjenester tillader dig ikke at oprette en database via phpMyAdmin. Lær hvordan du gør det i cPanel.

2238751 2
2238751 2

Trin 2. Opret en bruger med kun SELECT, INSERT og DELETE privilegier

Det betyder, at hvis der nogensinde var et brud på sikkerheden i vores script, kunne hackeren ikke tabe tabeller fra vores database. Hvis du virkelig er paranoid, skal du oprette en anden bruger for hver funktion.

  • Bruger:

    "sec_user"

  • Adgangskode:

    "eKcGZr59zAa2BEWU"

Opret brugerkode:

Opret BRUGER 'sec_user'@'localhost' IDENTIFICERET MED 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON `secure_sessions`.* TO 'sec_user'@'localhost';

Bemærk: Det er en god idé at ændre adgangskoden i koden ovenfor, når den kører på din egen server. (Sørg også for at ændre din PHP -kode.) Husk, at det ikke behøver at være et kodeord, du kan huske, så det er så kompliceret som muligt. Her er en tilfældig adgangskodegenerator.

2238751 3
2238751 3

Trin 3. Opret en MySQL -tabel med navnet "sessioner"

Koden herunder opretter en tabel med 4 felter (id, set_time, data, session_key).

Opret tabellen "sessioner":

OPRET TABEL `sessioner` (` 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 bruger CHAR -datatypen til felter, vi kender længden på, da felterne "id" og "session_key" altid vil være 128 tegn lange. Ved at bruge CHAR sparer du processorkraft.

Metode 2 af 3: Opret session.class.php -fil

2238751 4
2238751 4

Trin 1. Opret klasse

For at starte en ny klasse skal du indtaste koden herunder:

Ny klasse:

klassesession {

2238751 5
2238751 5

Trin 2. Opret _construct -funktion

Denne funktion kaldes hver gang vi opretter en ny forekomst af et objekt ved hjælp af klassen 'session'. Du kan læse mere om PHP _construct -funktionen her.

Denne funktion indstiller vores brugerdefinerede sessionshandler, så den er tilgængelig til brug, så snart klassen er instantieret (dvs. lavet/bygget/konstrueret).

_konstruktion funktion:

funktion _construct () {// indstil vores tilpassede sessionsfunktioner. session_set_save_handler (array ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'destroy'), array ($ dette, 'gc')); // Denne linje forhindrer uventede effekter ved brug af objekter som gemmehåndterere. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Trin 3. Opret start_session -funktion

Denne funktion kaldes op hver gang du vil starte en ny session, brug den i stedet for session_start ();. Se kommentarerne i koden for at se, hvad hver linje gør.

start_session funktion:

function start_session ($ session_name, $ secure) {// Sørg for, at sessionscookien ikke er tilgængelig via javascript. $ httponly = true; // Hash -algoritme, der skal bruges til sessionen. (brug hash_algos () for at få en liste over tilgængelige hash.) $ session_hash = 'sha512'; // Kontroller, om hash er tilgængelig, hvis (in_array ($ session_hash, hash_algos ())) {// Indstil has -funktionen. ini_set ('session.hash_function', $ session_hash); } // Hvor mange bits pr. Tegn i hash. // De mulige værdier 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 sessionen til kun at bruge cookies, ikke URL -variabler. ini_set ('session.use_only_cookies', 1); // Få session cookie -parametre $ cookieParams = session_get_cookie_params (); // Indstil parametrene session_set_cookie_params ($ cookieParams ["lifetime"], $ cookieParams ["path"], $ cookieParams ["domain"], $ secure, $ httponly); // Skift sessionsnavnet session_name ($ session_name); // Nu starter vi sessionen session_start (); // Denne linje regenererer sessionen og sletter den gamle. // Det genererer også en ny krypteringsnøgle i databasen. session_regenerate_id (sand); }

2238751 7
2238751 7

Trin 4. Opret åben funktion

Denne funktion kaldes af PHP -sessionerne, når vi starter en ny session, vi bruger den til at starte en ny databaseforbindelse.

åben funktion:

funktion åben () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = ny mysqli ($ host, $ bruger, $ pass, $ navn); $ dette-> db = $ mysqli; vende tilbage sandt; }

2238751 8
2238751 8

Trin 5. Opret lukkefunktion

Denne funktion kaldes, når sessionerne ønsker at blive lukket.

lukke funktion:

funktion close () {$ this-> db-> close (); vende tilbage sandt; }

2238751 9
2238751 9

Trin 6. Opret læsefunktion

Denne funktion kaldes af PHP, når vi forsøger at få adgang til en session, f.eks. Når vi bruger echo $ _SESSION ['noget'];. Fordi der kan være mange opkald til denne funktion på en enkelt side, drager vi fordel af udarbejdede udsagn, ikke kun for sikkerheden, men også for ydelsen. Vi udarbejder kun erklæringen én gang, så kan vi udføre den mange gange.

Vi dekrypterer også de sessionsdata, der er krypteret i databasen. Vi bruger 256-bit AES-kryptering i vores sessioner.

læse funktion:

funktion læst ($ id) {hvis (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> forberede ("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 = $ dette-> dekrypter ($ data, $ nøgle); returnere $ data; }

2238751 10
2238751 10

Trin 7. Opret skrivefunktion

Denne funktion bruges, når vi tildeler en værdi en session, f.eks. $ _SESSION ['something'] = 'noget andet';. Funktionen krypterer alle de data, der bliver indsat i databasen.

skrivefunktion:

funktion skrive ($ id, $ data) {// Få unik nøgle $ key = $ this-> getkey ($ id); // Krypter data $ data = $ dette-> krypter ($ data, $ nøgle); $ time = time (); 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 (); vende tilbage sandt; }

2238751 11
2238751 11

Trin 8. Opret ødelægningsfunktion

Denne funktion sletter sessionen fra databasen, den bruges af php, når vi kalder funktioner som session_destroy ();.

ødelægge funktion:

funktion 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 (); vende tilbage sandt; }

2238751 12
2238751 12

Trin 9. Opret gc (garbage collector) funktion

Denne funktion er skraldesamlerfunktionen, den kaldes for at slette gamle sessioner. Hyppigheden, som denne funktion kaldes til, bestemmes af to konfigurationsdirektiver, session.gc_probability og session.gc_divisor.

gc () funktion:

funktion gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> forbered ("DELETE FROM sessions WHERE set_time <?"); } $ old = time () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> execute (); vende tilbage sandt; }

2238751 13
2238751 13

Trin 10. Opret getKey -funktion

Denne funktion bruges til at hente den unikke krypteringsnøgle fra sessionstabellen. Hvis der ikke er nogen session, returnerer den bare en ny tilfældig nøgle til kryptering.

getkey () Funktion:

privat funktion 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 (); hvis ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ key); $ this-> key_stmt-> fetch (); return $ key; } ellers {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); return $ random_key; }}

2238751 14
2238751 14

Trin 11. Opret krypterings- og dekrypteringsfunktioner

Disse funktioner krypterer sessionerne, de bruger en krypteringsnøgle fra databasen, som er forskellig for hver session. Vi bruger ikke denne nøgle direkte i krypteringen, men vi bruger den til at gøre nøgle -hash endnu mere tilfældig.

kryptere () og dekryptere () funktioner:

kryptering af private funktioner ($ 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 $ krypteret; } dekryptering af private funktioner ($ 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); $ dekrypteret = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ key, base64_decode ($ data), MCRYPT_MODE_ECB, $ iv); $ dekrypteret = rtrim ($ dekrypteret, "\ 0"); returner $ dekrypteret; }

2238751 15
2238751 15

Trin 12. Afslut klasse

Her afslutter vi bare klasserne krøllede parenteser:

Slutklasse:

}

Metode 3 af 3: Oprettelse af sider med sessioner

2238751 16
2238751 16

Trin 1. Brug af sessioner med den tilpassede sessionsmanager

Nedenfor er, hvordan du starter en ny session; du bliver nødt til at inkludere dette på hver side, du vil have adgang til sessionerne, brug den i stedet for session_start ();

Start af en session:

kræver ('session.class.php'); $ session = ny session (); // Indstil til sand, hvis du bruger https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'En værdi.'; ekko $ _SESSION ['noget'];

Anbefalede: