Aquesta guia us mostrarà com podeu emmagatzemar les vostres sessions de manera segura en una base de dades mySQL. També xifrarem totes les dades de sessió que entren a la base de dades, cosa que significa que si algú aconsegueix piratejar a la base de dades, totes les dades de sessió es xifren mitjançant xifratge AES de 256 bits.
Passos
Mètode 1 de 3: configureu la base de dades mySQL
Pas 1. Creeu una base de dades MySQL
En aquesta guia crearem una base de dades anomenada "sessions_segures".
Vegeu com crear una base de dades a phpMyAdmin.
O bé, podeu utilitzar el codi SQL següent per crear-ne un.
Crea un codi de base de dades:
CREA LA BASE DE DADES `sessions_segures`;
Nota: Alguns serveis d'allotjament no us permeten crear una base de dades mitjançant phpMyAdmin. Apreneu a fer-ho a cPanel.
Pas 2. Creeu un usuari només amb privilegis SELECT, INSERT i DELETE
Això significa que si alguna vegada hi ha hagut una violació de la seguretat al nostre script, el pirata informàtic no podria deixar taules de la nostra base de dades. Si sou realment paranoic, creeu un usuari diferent per a cada funció.
-
Usuari:
"sec_user"
-
Contrasenya:
"eKcGZr59zAa2BEWU"
Crea un codi d'usuari:
CREA USUARI 'sec_user' @ 'localhost' IDENTIFICAT PER 'eKcGZr59zAa2BEWU'; CONCESSIÓ DE SELECCIÓ, INSERT, ACTUALITZACIÓ, SUPRIMIÓ A `secure_sessions`. * TO 'sec_user' @ 'localhost';
Nota: és una bona idea canviar la contrasenya del codi anterior quan s’executa al vostre propi servidor. (Assegureu-vos de canviar també el vostre codi PHP.) Recordeu que no cal que sigui una contrasenya que pugueu recordar, de manera que fer que sigui el més complicat possible. Aquí hi ha un generador de contrasenyes aleatòries.
Pas 3. Creeu una taula MySQL anomenada "sessions"
El codi següent crea una taula amb 4 camps (id, set_time, data, session_key).
Creeu la taula "sessions":
CREA TABLE `sessions` (` id` char (128) NOT NULL, `set_time` char (10) NOT NULL, text` data` NOT NULL, `session_key` char (128) NOT NULL, CLAU PRIMÀRIA (` id`)) MOTOR = InnoDB DEFAULT CHARSET = latin1;
Utilitzem el tipus de dades CHAR per als camps que coneixem la longitud, ja que els camps "id" i "session_key" sempre tindran 128 caràcters. L’ús de CHAR aquí estalvia energia de processament.
Mètode 2 de 3: Creeu un fitxer session.class.php
Pas 1. Crea una classe
Per iniciar una nova classe, haureu d'introduir el codi següent:
Nova classe:
sessió de classe {
Pas 2. Creeu la funció _construct
Aquesta funció es cridarà cada vegada que creem una nova instància d'un objecte mitjançant la classe "sessió". Podeu llegir la funció PHP _construir aquí.
Aquesta funció defineix el nostre gestor de sessions personalitzat de manera que estigui disponible per utilitzar-lo tan aviat com s’instancia la classe (és a dir, es fa / es construeix / es construeix).
_construir la funció:
function _construct () {// defineix les nostres funcions de sessió personalitzades. session_set_save_handler (array ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'destroy')), array ($ this, 'gc')); // Aquesta línia evita efectes inesperats quan s'utilitzen objectes com a gestors de desades. register_shutdown_function ('session_write_close'); }
Pas 3. Creeu la funció start_session
Aquesta funció es cridarà cada vegada que vulgueu iniciar una nova sessió, utilitzeu-la en lloc de session_start ();. Consulteu els comentaris al codi per veure què fa cada línia.
funció start_session:
function start_session ($ session_name, $ secure) {// Assegureu-vos que la cookie de sessió no sigui accessible mitjançant javascript. $ httponly = true; // Algorisme hash per utilitzar a la sessió. (utilitzeu hash_algos () per obtenir una llista dels hash disponibles.) $ session_hash = 'sha512'; // Comproveu si hash està disponible si (in_array ($ session_hash, hash_algos ())) {// Estableix la funció has. ini_set ('session.hash_function', $ session_hash); } // Quants bits per caràcter del hash. // Els valors possibles són '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); // Força la sessió a utilitzar només galetes, no variables d’URL. ini_set ('session.use_only_cookies', 1); // Obtenir paràmetres de cookies de sessió $ cookieParams = session_get_cookie_params (); // Estableix els paràmetres session_set_cookie_params ($ cookieParams ["vida"], $ cookieParams ["camí"], $ cookieParams ["domini"], $ segur, $ httponly); // Canvieu el nom de la sessió session_name ($ session_name); // Ara comencem la sessió session_start (); // Aquesta línia regenera la sessió i elimina la vella. // També genera una nova clau de xifratge a la base de dades. session_regenerate_id (true); }
Pas 4. Crea una funció oberta
Aquesta funció serà cridada per les sessions de PHP quan iniciem una nova sessió, la fem servir per iniciar una nova connexió a la base de dades.
funció oberta:
function open () {$ host = 'localhost'; $ usuari = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'sessions_segures'; $ mysqli = mysqli nou ($ host, $ user, $ pass, $ name); $ this-> db = $ mysqli; tornar cert; }
Pas 5. Crea una funció de tancament
Aquesta funció es cridarà quan es vulguin tancar les sessions.
funció de tancament:
funció close () {$ this-> db-> close (); tornar cert; }
Pas 6. Crear la funció de lectura
Aquesta funció serà cridada per PHP quan intentem accedir a una sessió, per exemple, quan fem servir echo $ _SESSION ['alguna cosa'];. Com que hi pot haver moltes trucades a aquesta funció en una sola pàgina, aprofitem les declaracions preparades, no només per seguretat, sinó també per al rendiment. Només preparem la declaració una vegada que la podem executar moltes vegades.
També desxifrem les dades de sessió que es xifren a la base de dades. Estem utilitzant xifratge AES de 256 bits a les nostres sessions.
funció de lectura:
funció read ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> prepare ("SELECCIÓ de dades de 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 = $ això-> desxifra ($ dades, $ clau); retorna $ dades; }
Pas 7. Creació d'una funció d'escriptura
Aquesta funció s'utilitza quan assignem un valor a una sessió, per exemple $ _SESSION ['something'] = 'something else';. La funció xifra totes les dades que s’insereixen a la base de dades.
funció d'escriptura:
function write ($ id, $ data) {// Obtén la clau única $ key = $ this-> getkey ($ id); // Xifra les dades $ data = $ this-> xifra ($ data, $ clau); $ temps = temps (); if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> prepare ("REPLACE INTO sessions (id, set_time, data, session_key) VALORS (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> execute (); tornar cert; }
Pas 8. Crea una funció de destrucció
Aquesta funció elimina la sessió de la base de dades, és utilitzada per php quan anomenem funcions com session_destroy ();.
funció de destrucció:
funció destruir ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> prepare ("ELIMINA DE SESSIONS WHERE id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> execute (); tornar cert; }
Pas 9. Creeu la funció gc (recollidor de deixalles)
Aquesta funció és la funció de recol·lector de deixalles que es diu per suprimir sessions antigues. La freqüència en què es diu aquesta funció està determinada per dues directives de configuració, session.gc_probability i session.gc_divisor.
funció gc ():
funció gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> prepare ("ELIMINA DE LES SESSIONS WHERE set_time <?"); } $ old = time () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> execute (); tornar cert; }
Pas 10. Crea la funció getKey
Aquesta funció s'utilitza per obtenir la clau única per al xifratge de la taula de sessions. Si no hi ha sessió, només retorna una nova clau aleatòria per al xifratge.
Funció getkey ():
funció privada getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> prepare ("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 (); retorna la clau $; } else {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); torna $ random_key; }}
Pas 11. Creeu funcions de xifratge i desxifratge
Aquestes funcions xifren les dades de les sessions, utilitzen una clau de xifratge de la base de dades que és diferent per a cada sessió. No utilitzem directament aquesta clau al xifratge, però la fem servir per fer que el hash de la clau sigui encara més aleatori.
funcions encrypt () i decrypt ():
xifrat de funció privada ($ dades, $ clau) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH'; $ clau = substr (hash ('sha256', $ salt. $ clau. $ sal), 0, 32); $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND); $ xifrat = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ clau, $ dades, MCRYPT_MODE_ECB, $ iv)); retorna $ xifrat; } funció privada desxifra ($ dades, $ clau) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH'; $ clau = substr (hash ('sha256', $ salt. $ clau. $ sal), 0, 32); $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND); $ desxifrat = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ clau, base64_decode ($ dades), MCRYPT_MODE_ECB, $ iv); $ desxifrat = rtrim ($ desxifrat, "\ 0"); retorna $ desxifrat; }
Pas 12. Finalitzar la classe
Aquí acabem els claudàtors entre claudàtors:
Classe final:
}
Mètode 3 de 3: Creació de pàgines amb sessions
Pas 1. Ús de sessions amb el gestor de sessions personalitzat
A continuació es mostra com començaríeu una nova sessió; hauríeu d'incloure-ho a totes les pàgines a les quals vulgueu accedir a les sessions, utilitzeu-lo en lloc de session_start ();
Començar una sessió:
require ('session.class.php'); $ sessió = nova sessió (); // Estableix a true si s'utilitza https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'Un valor.'; eco $ _SESSION ['alguna cosa'];