3 mënyra për të krijuar një sistem të sigurt të menaxhimit të sesioneve në PHP dhe MySQL

Përmbajtje:

3 mënyra për të krijuar një sistem të sigurt të menaxhimit të sesioneve në PHP dhe MySQL
3 mënyra për të krijuar një sistem të sigurt të menaxhimit të sesioneve në PHP dhe MySQL

Video: 3 mënyra për të krijuar një sistem të sigurt të menaxhimit të sesioneve në PHP dhe MySQL

Video: 3 mënyra për të krijuar një sistem të sigurt të menaxhimit të sesioneve në PHP dhe MySQL
Video: Leksion 3 - DB1 - Modeli Relacional i Bazës së të Dhënave 2024, Prill
Anonim

Ky udhëzues do t'ju tregojë se si mund t'i ruani sesionet tuaja në mënyrë të sigurt në një bazë të dhënash mySQL. Ne gjithashtu do të kodojmë të gjitha të dhënat e sesionit që futen në bazën e të dhënave, që do të thotë nëse dikush arrin të hakojë në bazën e të dhënave të gjitha të dhënat e sesionit janë të koduara me kriptim AES 256-bit.

Hapa

Metoda 1 nga 3: Konfiguro bazën e të dhënave mySQL

2238751 1
2238751 1

Hapi 1. Krijoni një bazë të dhënash MySQL

Në këtë udhëzues do të krijojmë një bazë të dhënash të quajtur "safe_sessions".

Shihni se si të krijoni një bazë të dhënash në phpMyAdmin.

Ose mund të përdorni kodin SQL më poshtë do të krijojë një për ju.

Krijo kodin e bazës së të dhënave:

KRIJONI BAZA E TAT DHATNAVE `seanca_ të sigurta`;

Shënim: Disa shërbime pritëse nuk ju lejojnë të krijoni një bazë të dhënash përmes phpMyAdmin, Mësoni si ta bëni atë në cPanel.

2238751 2
2238751 2

Hapi 2. Krijoni një përdorues vetëm me privilegje SELECT, INSERT dhe DELETE

Kjo do të thotë që nëse ka pasur ndonjëherë një shkelje të sigurisë në skenarin tonë, hakeri nuk mund të heqë tabelat nga baza jonë e të dhënave. Nëse jeni vërtet paranojak, krijoni një përdorues të ndryshëm për secilin funksion.

  • Përdoruesi:

    "sec_user"

  • Fjalëkalimi:

    "eKcGZr59zAa2BEWU"

Krijo Kodin e Përdoruesit:

CREATE USER 'sec_user'@'localhost' IDENTIFIKUAR NGA 'eKcGZr59zAa2BEWU'; ZGJEDHJA E GRANTIT, INSERT, PPRDITSIM, FSHIJ N ON `seancat e sigurta`.* P'R 'sec_user'@'localhost';

Shënim: ideashtë një ide e mirë të ndryshoni fjalëkalimin në kodin e mësipërm kur ekzekutoni në serverin tuaj. (Sigurohuni që të ndryshoni edhe kodin tuaj PHP.) Mos harroni se nuk ka nevojë të jetë një fjalëkalim që mund ta mbani mend, kështu që krijoni është sa më i komplikuar. Këtu keni një gjenerator fjalëkalimi të rastit.

2238751 3
2238751 3

Hapi 3. Krijoni një tabelë MySQL të quajtur "seanca"

Kodi më poshtë krijon një tabelë me 4 fusha (id, set_time, data, key_ session).

Krijoni tabelën "seancat":

KRIJONI `sesionet` e TABELS (` id` char (128) NOT NULL, `set_time` char (10) NOT NULL,` text data NOT NULL, `session_key` char (128) NOT NULL, PRIMARY KEY (` id`)) ENGINE = InnoDB CHARSET DEFAULT = latin1;

Ne përdorim llojin e të dhënave CHAR për fushat që ne e dimë gjatësinë, pasi fushat "id" dhe "session_key" do të jenë gjithnjë 128 karaktere të gjata. Përdorimi i CHAR këtu kursen fuqinë përpunuese.

Metoda 2 nga 3: Krijoni skedarin session.class.php

2238751 4
2238751 4

Hapi 1. Krijo Klasë

Për të filluar një klasë të re do t'ju duhet të futni kodin më poshtë:

Klasa e re:

seanca e klasës {

2238751 5
2238751 5

Hapi 2. Krijo _konstrukto funksionin

Ky funksion do të thirret sa herë që krijojmë një shembull të ri të një objekti duke përdorur klasën "session". Ju mund të lexoni funksionin PHP _construct këtu.

Ky funksion cakton mbajtësin tonë të seancave me porosi, kështu që është i disponueshëm për përdorim sapo të mësohet klasa (d.m.th., e bërë/ndërtuar/ndërtuar).

_konstrukto funksionin:

funksioni _construct () {// caktoni funksionet tona të personalizuara të sesionit. session_set_save_handler (grup ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'shkatërro')), array ($ this, 'gc')); // Kjo linjë parandalon efektet e papritura kur përdorni objekte si mbajtës ruajtës. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Hapi 3. Krijo funksionin start_session

Ky funksion do të thirret sa herë që dëshironi të filloni një sesion të ri, përdorni atë në vend të session_start ();. Shihni komentet në kod për të parë se çfarë bën secila rresht.

funksioni start_session:

funksioni start_session ($ session_name, $ sigurt) {// Sigurohuni që cookie sesioni të mos jetë i arritshëm nëpërmjet javascript. $ httponly = e vërtetë; // Algoritmi Hash për t'u përdorur për sesionin. (përdorni hash_algos () për të marrë një listë të hash -ve të disponueshëm.) $ session_hash = 'sha512'; // Kontrolloni nëse hash është i disponueshëm nëse (in_array ($ session_hash, hash_algos ())) {// Vendosni funksionin ka. ini_set ('session.hash_function', $ session_hash); } // Sa bit për karakter të hash -it. // Vlerat e mundshme janë '4' (0-9, a-f), '5' (0-9, a-v), dhe '6' (0-9, a-z, A-Z, "-", ","). ini_set ('sesioni.hash_bits_per_character', 5); // Detyrojeni sesionin të përdorë vetëm kuki, jo variabla URL. ini_set ('session.use_one_ly_cookies', 1); // Merrni parametrat e cookie -t të sesionit $ cookieParams = session_get_cookie_params (); // Vendosni parametrat session_set_cookie_params ($ cookieParams ["gjatë gjithë jetës"], $ cookieParams ["shteg"], $ cookieParams ["domain"], $ sigurt, $ httponly); // Ndryshoni emrin e sesionit emrin e sesionit ($ session_name); // Tani fillojmë të fillojmë sesionin session_start (); // Kjo linjë rigjeneron sesionin dhe fshini atë të vjetër. // Ai gjithashtu gjeneron një çelës të ri kriptimi në bazën e të dhënave. session_regenerate_id (e vërtetë); }

2238751 7
2238751 7

Hapi 4. Krijo funksion të hapur

Ky funksion do të thirret nga sesionet e PHP kur fillojmë një sesion të ri, e përdorim për të filluar një lidhje të re të bazës së të dhënave.

funksioni i hapur:

funksioni i hapur () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'seanca_ të sigurta'; $ mysqli = mysqli i ri ($ host, $ user, $ pass, $ name); $ this-> db = $ mysqli; kthehet e vërtetë; }

2238751 8
2238751 8

Hapi 5. Krijo funksion të afërt

Ky funksion do të thirret kur seancat duan të mbyllen.

funksioni i mbyllur:

funksioni mbyll () {$ this-> db-> mbyll (); kthehet e vërtetë; }

2238751 9
2238751 9

Hapi 6. Krijo funksionin e leximit

Ky funksion do të thirret nga PHP kur përpiqemi të hyjmë në një sesion për shembull kur përdorim echo $ _SESSION ['diçka'];. Për shkak se mund të ketë shumë thirrje për këtë funksion në një faqe të vetme, ne përfitojmë nga deklaratat e përgatitura, jo vetëm për sigurinë, por edhe për performancën. Ne e përgatisim deklaratën vetëm një herë, atëherë mund ta ekzekutojmë atë shumë herë.

Ne gjithashtu deshifrojmë të dhënat e sesionit që janë të koduara në bazën e të dhënave. Ne po përdorim kriptimin 256-bit AES në sesionet tona.

funksioni i leximit:

funksioni i leximit ($ id) {nëse (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> përgatit ("ZGJIDH të dhëna nga sesionet KU ID =? KUFIZIM 1"); } $ this-> read_stmt-> bind_param ('s', $ id); $ this-> read_stmt-> ekzekuto (); $ this-> read_stmt-> store_result (); $ this-> read_stmt-> bind_result ($ të dhëna); $ this-> read_stmt-> marr (); $ key = $ this-> getkey ($ id); $ data = $ this-> deshifro ($ data, $ çelës); ktheni të dhënat e $; }

2238751 10
2238751 10

Hapi 7. Krijo funksionin e shkrimit

Ky funksion përdoret kur i caktojmë një vlerë një sesioni, për shembull $ _SESSION ['diçka'] = 'diçka tjetër';. Funksioni kodon të gjitha të dhënat që futen në bazën e të dhënave.

funksioni i shkrimit:

funksioni i shkrimit ($ id, $ data) {// Merr çelës unik $ key = $ this-> getkey ($ id); // Kriptoni të dhënat $ data = $ this-> kriptoni ($ data, $ çelës); $ kohë = kohë (); nëse (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> përgatitet ("Zëvendëso në seanca (id, set_time, të dhëna, çelësi i sesionit) VLERAT (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> ekzekuto (); kthehet e vërtetë; }

2238751 11
2238751 11

Hapi 8. Krijo funksionin e shkatërrimit

Ky funksion fshin sesionin nga baza e të dhënave, përdoret nga php kur thërrasim funksione si session_destroy ();.

Shkatërroni funksionin:

funksion shkatërroj ($ id) {nëse (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> përgatitet ("FSHIJ NGA seancat KU ID =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> ekzekuto (); kthehet e vërtetë; }

2238751 12
2238751 12

Hapi 9. Krijo funksionin gc (grumbulluesi i plehrave)

Ky funksion është funksioni i grumbullimit të plehrave që thirret për të fshirë sesionet e vjetra. Frekuenca në të cilën thirret ky funksion përcaktohet nga dy direktiva konfigurimi, session.gc_probability dhe session.gc_divisor.

funksioni gc ():

funksioni gc ($ max) {if (! isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> përgatitet ("FSHIJ NGA seancat KU KU koha e caktuar <?"); } $ old = koha () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> ekzekuto (); kthehet e vërtetë; }

2238751 13
2238751 13

Hapi 10. Krijo funksionin getKey

Ky funksion përdoret për të marrë çelësin unik për kriptimin nga tabela e sesioneve. Nëse nuk ka sesion, ai thjesht kthen një çelës të ri të rastësishëm për kriptim.

getkey () Funksioni:

funksioni privat getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> përgatitet ("ZGJIDH çelësin e seancës NGA seancat KU ID =? KUFIZUAR 1"); } $ this-> key_stmt-> bind_param ('s', $ id); $ this-> key_stmt-> ekzekuto (); $ this-> key_stmt-> store_result (); if ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ kyç); $ this-> key_stmt-> marr (); kthejeni çelësin $; } else {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); ktheni $ random_key; }}

2238751 14
2238751 14

Hapi 11. Krijo funksione të kriptuara dhe të deshifruara

Këto funksione kodojnë të dhënat e sesioneve, ata përdorin një çelës kriptimi nga baza e të dhënave e cila është e ndryshme për secilën sesion. Ne nuk e përdorim drejtpërdrejt atë çelës në kriptim, por e përdorim për ta bërë hash -in e çelësit edhe më të rastësishëm.

funksionet e kriptimit () dhe të deshifrimit ():

kriptimi i funksionit privat ($ të dhëna, $ kyç) {$ kripë = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ key = substr (hash ('sha256', $ kripë. $ key. $ kripë), 0, 32); $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND); $ e koduar = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, çelësi $, $ të dhëna, MCRYPT_MODE_ECB, $ iv)); ktheni $ të koduar; } funksioni privat i deshifruar ($ të dhëna, $ kyç) {$ kripë = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ key = substr (hash ('sha256', $ kripë. $ key. $ kripë), 0, 32); $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND); $ e deshifruar = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, çelësi $, base64_decode ($ të dhëna), MCRYPT_MODE_ECB, $ iv); $ deshifruar = rtrim ($ deshifruar, "\ 0"); ktheni $ të deshifruar; }

2238751 15
2238751 15

Hapi 12. Fundi i klasës

Këtu ne vetëm përfundojmë kllapat me kaçurrela të klasave:

Klasa e Fundit:

}

Metoda 3 nga 3: Krijimi i faqeve me sesione

2238751 16
2238751 16

Hapi 1. Përdorimi i seancave me menaxherin e seancave me porosi

Më poshtë është mënyra se si do të fillonit një sesion të ri; ju do të duhet ta përfshini këtë në çdo faqe që dëshironi të keni qasje në seanca, përdorni atë në vend të session_start ();

Fillimi i një seance:

kërkojnë ('session.class.php'); $ session = sesion i ri (); // Vendoseni në të vërtetë nëse përdorni https $ session-> start_session ('_ s', false); $ _SESSION ['diçka'] = 'Një vlerë.'; jehonë $ _SESSION ['diçka'];

Recommended: