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
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.
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.
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
Trin 1. Opret klasse
For at starte en ny klasse skal du indtaste koden herunder:
Ny klasse:
klassesession {
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'); }
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); }
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; }
Trin 5. Opret lukkefunktion
Denne funktion kaldes, når sessionerne ønsker at blive lukket.
lukke funktion:
funktion close () {$ this-> db-> close (); vende tilbage sandt; }
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; }
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; }
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; }
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; }
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; }}
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; }
Trin 12. Afslut klasse
Her afslutter vi bare klasserne krøllede parenteser:
Slutklasse:
}
Metode 3 af 3: Oprettelse af sider med sessioner
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'];