3 maneres de crear un sistema de gestió de sessions segur en PHP i MySQL

Taula de continguts:

3 maneres de crear un sistema de gestió de sessions segur en PHP i MySQL
3 maneres de crear un sistema de gestió de sessions segur en PHP i MySQL

Vídeo: 3 maneres de crear un sistema de gestió de sessions segur en PHP i MySQL

Vídeo: 3 maneres de crear un sistema de gestió de sessions segur en PHP i MySQL
Vídeo: La Vida de un PROGRAMADOR WEB (Cómo ser un Desarrollador Web, Con qué lenguaje empezar) 2024, Abril
Anonim

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

2238751 1
2238751 1

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.

2238751 2
2238751 2

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.

2238751 3
2238751 3

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

2238751 4
2238751 4

Pas 1. Crea una classe

Per iniciar una nova classe, haureu d'introduir el codi següent:

Nova classe:

sessió de classe {

2238751 5
2238751 5

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'); }

2238751 6
2238751 6

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); }

2238751 7
2238751 7

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; }

2238751 8
2238751 8

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; }

2238751 9
2238751 9

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; }

2238751 10
2238751 10

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; }

2238751 11
2238751 11

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; }

2238751 12
2238751 12

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; }

2238751 13
2238751 13

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; }}

2238751 14
2238751 14

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; }

2238751 15
2238751 15

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

2238751 16
2238751 16

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'];

Recomanat: