3 veidi, kā izveidot drošu sesiju pārvaldības sistēmu PHP un MySQL

Satura rādītājs:

3 veidi, kā izveidot drošu sesiju pārvaldības sistēmu PHP un MySQL
3 veidi, kā izveidot drošu sesiju pārvaldības sistēmu PHP un MySQL

Video: 3 veidi, kā izveidot drošu sesiju pārvaldības sistēmu PHP un MySQL

Video: 3 veidi, kā izveidot drošu sesiju pārvaldības sistēmu PHP un MySQL
Video: 12 gadu programmēšanas pieredze – vai daudz? / Saruna ar Andreju Abricki 2024, Aprīlis
Anonim

Šī rokasgrāmata parādīs, kā varat droši saglabāt savas sesijas mySQL datu bāzē. Mēs arī šifrēsim visus sesijas datus, kas nonāk datu bāzē, kas nozīmē, ka, ja kādam izdodas uzlauzt datu bāzi, visi sesijas dati tiek šifrēti ar 256 bitu AES šifrēšanu.

Soļi

1. metode no 3: konfigurējiet mySQL datu bāzi

2238751 1
2238751 1

Solis 1. Izveidojiet MySQL datu bāzi

Šajā rokasgrāmatā mēs izveidosim datu bāzi ar nosaukumu "secure_sessions".

Uzziniet, kā izveidot datubāzi phpMyAdmin.

Vai arī varat izmantot zemāk esošo SQL kodu, lai to izveidotu.

Izveidot datu bāzes kodu:

CREATE DATABASE `secure_sessions`;

Piezīme. Daži mitināšanas pakalpojumi neļauj izveidot datu bāzi, izmantojot phpMyAdmin. Uzziniet, kā to izdarīt programmā cPanel.

2238751 2
2238751 2

2. solis. Izveidojiet lietotāju ar privilēģijām SELECT, INSERT un DELETE

Tas nozīmē, ka mūsu skripta drošības pārkāpumu gadījumā hakeris nevarēja izlaist tabulas no mūsu datu bāzes. Ja jums patiešām ir paranoja, katrai funkcijai izveidojiet citu lietotāju.

  • Lietotājs:

    "sec_user"

  • Parole:

    "eKcGZr59zAa2BEWU"

Izveidot lietotāja kodu:

IZVEIDOT LIETOTĀJU 'sec_user'@'localhost' IDENTIFICĒJA 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON "secure_sessions".* TO 'sec_user'@'localhost';

Piezīme. Ieteicams mainīt paroli iepriekš minētajā kodā, kad tas darbojas jūsu serverī. (Noteikti nomainiet arī savu PHP kodu.) Atcerieties, ka tai nav jābūt parolei, kuru varat atcerēties, lai padarītu to pēc iespējas sarežģītāku. Šeit ir nejaušs paroļu ģenerators.

2238751 3
2238751 3

3. Izveidojiet MySQL tabulu ar nosaukumu "sesijas"

Tālāk esošais kods izveido tabulu ar 4 laukiem (id, set_time, data, session_key).

Izveidojiet tabulu "Sesijas":

CREATE TABLE "sesijas" ("id" char (128) NOT NULL, "set_time" char (10) NOT NULL, "datu" teksts NOT NULL, "session_key" char (128) NOT NULL, PRIMARY KEY ("id")) DZINĒJS = InnoDB DEFAULT CHARSET = latīņu1;

Mēs izmantojam CHAR datu tipu laukiem, kuru garumu mēs zinām, jo lauki "id" un "session_key" vienmēr būs 128 rakstzīmes gari. Šeit izmantojot CHAR, tiek ietaupīta apstrādes jauda.

2. metode no 3: izveidojiet failu session.class.php

2238751 4
2238751 4

1. solis. Izveidojiet klasi

Lai sāktu jaunu nodarbību, jums jāievada šāds kods:

Jauna klase:

klases sesija {

2238751 5
2238751 5

2. solis. Izveidojiet funkciju _construct

Šī funkcija tiks izsaukta katru reizi, kad, izmantojot klasi 'sesija', izveidosim jaunu objekta gadījumu. Šeit varat izlasīt funkciju PHP _construct.

Šī funkcija nosaka mūsu pielāgoto sesiju apstrādātāju, lai tā būtu pieejama lietošanai, tiklīdz klase ir parādīta (t.i., izgatavota/uzbūvēta/uzbūvēta).

_konstruēšanas funkcija:

function _construct () {// iestatiet mūsu pielāgotās sesijas funkcijas. session_set_save_handler (masīvs ($ this, 'open'), masīvs ($ this, 'close'), masīvs ($ this, 'read'), masīvs ($ this, 'write'), masīvs ($ this, 'iznīcināt')), masīvs ($ this, 'gc')); // Šī līnija novērš negaidītus efektus, izmantojot objektus kā saglabāšanas apstrādātājus. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Solis 3. Izveidojiet funkciju start_session

Šī funkcija tiks izsaukta katru reizi, kad vēlaties sākt jaunu sesiju, izmantojiet to, nevis session_start ();. Skatiet koda komentārus, lai redzētu, ko katra rinda dara.

funkcija start_session:

funkcija start_session ($ session_name, $ secure) {// Pārliecinieties, vai sesijas sīkfails nav pieejams, izmantojot javascript. $ httponly = taisnība; // Hash algoritms, ko izmantot sesijai. (izmantojiet hash_algos (), lai iegūtu pieejamo jaucēju sarakstu.) $ session_hash = 'sha512'; // Pārbaudiet, vai jaukšana ir pieejama, ja (in_array ($ session_hash, hash_algos ())) {// Iestatiet funkciju has. ini_set ('session.hash_function', $ session_hash); } // Cik bitu uz vienu jaukšanas rakstzīmi. // Iespējamās vērtības ir '4' (0-9, a-f), '5' (0-9, a-v) un '6' (0-9, a-z, A-Z, "-", ","). ini_set ('session.hash_bits_per_character', 5); // Piespiest sesiju izmantot tikai sīkfailus, nevis URL mainīgos. ini_set ('session.use_only_cookies', 1); // Iegūt sesijas sīkfailu parametrus $ cookieParams = session_get_cookie_params (); // Iestatiet parametrus session_set_cookie_params ($ cookieParams ["life"], $ cookieParams ["path"], $ cookieParams ["domain"], $ secure, $ httponly); // Mainīt sesijas nosaukumu session_name ($ session_name); // Tagad mēs sākam sesiju session_start (); // Šī rinda atjauno sesiju un izdzēš veco. // Tas arī ģenerē jaunu šifrēšanas atslēgu datu bāzē. session_regenerate_id (true); }

2238751 7
2238751 7

Solis 4. Izveidojiet atvērto funkciju

Šo funkciju izsauks PHP sesijas, kad mēs sākam jaunu sesiju, mēs to izmantojam, lai sāktu jaunu datu bāzes savienojumu.

atvērta funkcija:

funkcija atvērta () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = jauns mysqli ($ host, $ user, $ pass, $ name); $ šis-> db = $ mysqli; atgriezties patiesi; }

2238751 8
2238751 8

5. solis. Izveidojiet aizvēršanas funkciju

Šī funkcija tiks izsaukta, kad sesijas vēlaties slēgt.

aizvēršanas funkcija:

funkcija close () {$ this-> db-> close (); atgriezties patiesi; }

2238751 9
2238751 9

6. solis. Izveidojiet lasīšanas funkciju

Šo funkciju izsauks PHP, kad mēģināsim piekļūt sesijai, piemēram, ja izmantosim echo $ _SESSION ['kaut'];. Tā kā vienā lapā var būt daudz zvanu uz šo funkciju, mēs izmantojam sagatavoto paziņojumu priekšrocības ne tikai drošības, bet arī veiktspējas dēļ. Mēs sagatavojam paziņojumu tikai vienu reizi, tad varam to izpildīt daudzas reizes.

Mēs arī atšifrējam sesijas datus, kas ir šifrēti datu bāzē. Savās sesijās mēs izmantojam 256 bitu AES šifrēšanu.

lasīšanas funkcija:

funkcija lasīt ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> sagatavot ("SELECT data FROM sesijas WHERE id =? LIMIT 1"); } $ this-> read_stmt-> bind_param ('s', $ id); $ this-> read_stmt-> izpildīt (); $ šis-> lasīt_stmt-> veikala_rezultāts (); $ this-> read_stmt-> bind_result ($ dati); $ šis-> lasīt_stmt-> ielādēt (); $ taustiņš = $ šis-> getkey ($ id); $ data = $ this-> atšifrēt ($ data, $ key); atgriezt $ datus; }

2238751 10
2238751 10

7. solis. Izveidojiet rakstīšanas funkciju

Šo funkciju izmanto, ja sesijai piešķiram vērtību, piemēram, $ _SESSION ['kaut'] = 'kaut kas cits';. Funkcija šifrē visus datus, kas tiek ievietoti datu bāzē.

rakstīšanas funkcija:

funkcija rakstīt ($ id, $ data) {// Iegūt unikālu atslēgu $ key = $ this-> getkey ($ id); // Šifrēt datus $ data = $ this-> šifrēt ($ data, $ key); $ laiks = laiks (); ja (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> sagatavot ("REPLACE INTO sesijas (id, set_time, data, session_key) VĒRTĪBAS (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('sis', $ id, $ time, $ data, $ key); $ this-> w_stmt-> izpildīt (); atgriezties patiesi; }

2238751 11
2238751 11

8. Izveidojiet iznīcināšanas funkciju

Šī funkcija izdzēš sesiju no datu bāzes, to izmanto php, kad mēs izsaucam tādas funkcijas kā session_destroy ();.

iznīcināt funkciju:

funkcija iznīcināt ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> sagatavot ("DELETE FROM sesijas WHERE id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> izpildīt (); atgriezties patiesi; }

2238751 12
2238751 12

9. solis. Izveidojiet funkciju gc (atkritumu savācējs)

Šī funkcija ir atkritumu savācēja funkcija, ko sauc par veco sesiju dzēšanu. Šīs funkcijas izsaukšanas biežumu nosaka divas konfigurācijas direktīvas - session.gc_probability un session.gc_divisor.

funkcija gc ():

funkcija gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> sagatavot ("DELETE FROM OF SESIONS WHERE set_time <?"); } $ vecs = laiks () - $ maks; $ this-> gc_stmt-> bind_param ('s', $ vecs); $ this-> gc_stmt-> izpildīt (); atgriezties patiesi; }

2238751 13
2238751 13

10. solis. Izveidojiet funkciju getKey

Šo funkciju izmanto, lai no sesiju tabulas iegūtu unikālu šifrēšanas atslēgu. Ja sesijas nav, tā vienkārši atgriež jaunu nejaušu atslēgu šifrēšanai.

getkey () Funkcija:

privātā funkcija getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> sagatavot ("SELECT session_key FROM session WHERE id =? LIMIT 1"); } $ šis-> key_stmt-> bind_param ('s', $ id); $ šis-> key_stmt-> izpildīt (); $ šis-> atslēgas_stmt-> veikala_rezultāts (); ja ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ key); $ šis-> key_stmt-> ielādēt (); atgriezt $ taustiņu; } cits {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); atgriezt $ random_key; }}

2238751 14
2238751 14

11. solis. Izveidojiet šifrēšanas un atšifrēšanas funkcijas

Šīs funkcijas šifrē sesiju datus, tās izmanto šifrēšanas atslēgu no datubāzes, kas katrai sesijai ir atšķirīga. Mēs tieši neizmantojam šo atslēgu šifrēšanā, bet izmantojam to, lai padarītu atslēgas jaukšanu vēl nejaušāku.

šifrēšanas () un atšifrēšanas () funkcijas:

privātas funkcijas šifrēšana ($ 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, $ atslēga, $ dati, MCRYPT_MODE_ECB, iv $)); atgriezt $ šifrētu; } privātās funkcijas atšifrēšana ($ 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); $ decrypted = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ atslēga, base64_decode ($ data), MCRYPT_MODE_ECB, iv $); $ atšifrēts = rtrim ($ atšifrēts, "\ 0"); return $ atšifrēts; }

2238751 15
2238751 15

12. solis. Beigt klasi

Šeit mēs vienkārši beidzam klases cirtainās iekavas:

Beigu klase:

}

3. metode no 3: lapu izveide ar sesijām

2238751 16
2238751 16

1. darbība. Sesiju izmantošana ar pielāgoto sesiju pārvaldnieku

Tālāk ir norādīts, kā jūs sāktu jaunu sesiju; tas jāiekļauj katrā lapā, kurai vēlaties piekļūt sesijām, izmantot to session_start () vietā;

Sesijas sākšana:

pieprasīt ('session.class.php'); $ sesija = jauna sesija (); // Iestatiet uz patiesu, ja izmantojat https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'Vērtība.'; echo $ _SESSION ['kaut kas'];

Ieteicams: